OAuth系列(二)-OAuth1.0

原创
2015/06/18 17:24
阅读数 129

OAuth1.0定义

OAuth1.0的标准请参考:https://tools.ietf.org/html/rfc5849

OAuth 协议允许网站或者应用(第三方)从Web 服务(服务提供商)的api中获取用户受保护的资源而不暴露用户的证书(可以理解为账号密码)。

例如:一个打印应用(第三方)可以通过OAuth协议获取用户存储在Web服务(服务提供商)的图片,但是在这个过程中,不会把用户在Web服务的用户密码暴露给打印应用。


相关概念    

概念 中文 解释
Service Provider 服务提供商 一个允许通过OAuth协议获取资源的网络应用,它上面存储这用户的信息
User 用户 在服务提供商有独立账户的个人
Consumer 第三方网站或者应用,下面简称第三方 使用OAuth协议去服务提供商获取用户受保护的资源的网站或者应用
Protected Resource(s) 受保护的资源 被服务提供商掌控的数据,第三方可以通过OAuth协议去获取这些资源
Consumer Developer 第三方开发者 实现第三方(网站或者应用的)独立的个人或者组织
Consumer Key 第三方Key 服务提供商分配给第三方的身份证明,相当于第三方的账户
Consumer Secret 第三方Secret 服务提供商分配给第三方的身份证明,相当于第三方的密码。Key和Secret一起建立起第三方和服务提供商信任的通道。
Request Token / 第三方获取用户验证,用来交换Acess Token的值
Access Token / 第三方获取用户信息的凭证,用来替代用户的整数
Token Secret /
OAuth Protocol Parameters OAuth协议参数 OAuth的参数以oauth_开头


请求URLs

URL类型 作用
Request Token URL 获取未授权的Request Token
User Authorization URL 获取用户的授权,以便第三方获取受保护的资源
Access Token URL 使用用户授权过的Request Token交换Access Token


参数

参数编码

所有的参数和值使用百分号编码([RFC3986] 中定义)。不在保留字符集 ([RFC3986] section 2.3) 内的字符必须使用百分号编码进行编码,在保留字符集内的字符不能被编码。十六进制字符在编码过程中必须大写,在对文本的名字和值进行百分号编码前必须保证他们是utf8的格式,其中保留字符集包括:

            unreserved = ALPHA, DIGIT, '-', '.', '_', '~'


第三方请求参数

  由第三方发送给服务提供商的OAuth协议参数必须包含在一下三个Http方法中,按照顺序,他们的性能会依次下降

    1、在Http Authorization Header中,或者( WWW-Authenticate Header)

    2、在Http Post方法的body中,此时content-type应该为application/x-www-form-urlencoded.

    3、在URLs的query部分


服务提供商响应参数

服务提供商响应参数在Http response body中,常用来返回Tokens或者其他的信息给第三方。参数的编码符合[参数编码]一节的描述。多个参数之间使用'&'字符来连接。例如:

            oauth_token=ab3cd9j4ks73hf7g&oauth_token_secret=xyz4992k83j47x0b



流程


A、第三方向服务提供商请求Request Token

    请求参数包括,以下格式是在Header中

oauth_consumer_key="0685bd9184jfhq22",(应用ID,由服务提供商颁发给授权第三方)
oauth_signature_method="HMAC-SHA1",(签名方式,具体看服务提供商支持那些签名方式)
oauth_signature="wOJIO9A2W5mFwDgiDvZbTSMK%2FPY%3D",(请求源串以及密钥根据一定签名方法生成的签名值,用来提高传输过程参数的防篡改性,有服务提供商提供算法)
oauth_timestamp="137131200",(时间戳)
oauth_nonce="4572616e48616d6d65724c61686176",(客户端生成的随机字符串)
oauth_version="1.0"(可选,具体请参考服务提供商的要求)
oauth_callback=http%3A%2F%2Fprinter.example.com%2Frequest_token_ready(授权回调的地址)

B、服务提供商授权授权Request Token

响应包括以下信息,以URLs Query为例,除了以下三个参数,还有一些服务提供商加入了oauth_expires_in的信息,表示过期的时间

oauth_token=hh5s93j4hdidpola&oauth_token_secret=hdhd0244k9j7ao03&oauth_callback_confirmed=true

C、第三方引导用户到服务提供商的连接

第三方收到授权的Request Token(oauth_token)后,把用户引导的服务提供商的授权页面,同时传递Request Token参数。

D、服务提供商把用户引导回第三方

服务端收到request token后,一般会是一个用户授权的页面,当用户点击同意授权后,服务提供商会把用户引导到A中的oauth_callback地址,该地址中包含了oauth_token和oauth_verifier两个参数。

E、第三方向服务提供商请求Access Token

请求参数包括,以下格式是在Header中,以下参数在A中都讲过,就不再细讲

oauth_consumer_key="0685bd9184jfhq22",
oauth_token="ad180jjd733klru7",(D中获得)
oauth_signature_method="HMAC-SHA1",
oauth_signature="wOJIO9A2W5mFwDgiDvZbTSMK%2FPY%3D",
oauth_timestamp="137131200",
oauth_nonce="4572616e48616d6d65724c61686176",
oauth_version="1.0"(可选)
oauth_verifier=

F、服务提供商生成有效的Access Token

返回的参数包括:oauth_token:Access_Token访问令牌,oauth_token_secret:令牌对应密钥

和B类似,还有一些服务提供商加入了oauth_expires_in的信息,表示access token过期的时间

G、第三方使用access token来访问受保护的资源

请求参数包括,以下格式是在Header中,以下参数在A中都讲过,就不再细讲

oauth_consumer_key="0685bd9184jfhq22",
oauth_token="ad180jjd733klru7",(D中获得)
oauth_signature_method="HMAC-SHA1",
oauth_signature="wOJIO9A2W5mFwDgiDvZbTSMK%2FPY%3D",
oauth_timestamp="137131200",
oauth_nonce="4572616e48616d6d65724c61686176",
oauth_version="1.0"(可选)


HTTP响应代码

如果在以上验证验证过程中,出现了错误,应该使用HTTP 400 Bad Request or HTTP 401 Unauthorized作为响应代码。

常用场景:

  • HTTP 400 Bad Request

    • Unsupported parameter(不支持的参数)

    • Unsupported signature method(不支持的签名方法)

    • Missing required parameter(缺少参数)

    • Duplicated OAuth Protocol Parameter(OAuth参数重复,如果在header,body,query中的一个传递了参数,另外两个应该不包含参数,否则服务提供商不知道以那个为准)

  • HTTP 401 Unauthorized

    • Invalid Consumer Key(未授权的第三方key)

    • Invalid / expired Token(非法/过期的token)

    • Invalid signature(非法的签名)

    • Invalid / used nonce(非法的随机字符串)

摘自:http://oauth.net/core/1.0/#RFC2617


展开阅读全文
打赏
0
0 收藏
分享
加载中
更多评论
打赏
0 评论
0 收藏
0
分享
返回顶部
顶部