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_开头 |
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
请求参数包括,以下格式是在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(授权回调的地址)
响应包括以下信息,以URLs Query为例,除了以下三个参数,还有一些服务提供商加入了oauth_expires_in的信息,表示过期的时间
oauth_token=hh5s93j4hdidpola&oauth_token_secret=hdhd0244k9j7ao03&oauth_callback_confirmed=true
第三方收到授权的Request Token(oauth_token)后,把用户引导的服务提供商的授权页面,同时传递Request Token参数。
服务端收到request token后,一般会是一个用户授权的页面,当用户点击同意授权后,服务提供商会把用户引导到A中的oauth_callback地址,该地址中包含了oauth_token和oauth_verifier两个参数。
请求参数包括,以下格式是在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=
返回的参数包括:oauth_token:Access_Token访问令牌,oauth_token_secret:令牌对应密钥
和B类似,还有一些服务提供商加入了oauth_expires_in的信息,表示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 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