一、Oauth简介
OAUTH协议为用户资源的授权提供了一个安全的、开放而又简易的标准。
与以往的授权方式不同之处是OAUTH的授权不会使第三方触及到用户的帐号信息(如用户名与密码),即第三方无需使用用户的用户名与密码就可以申请获得该用户资源的授权,因此OAUTH是安全的(没有涉及到用户密钥)。任何第三方都可以使用OAUTH认证服务,任何服务提供商都可以实现自身的OAUTH认证服务,因而OAUTH是开放的
An open protocol to allow secure API authorization in asimple and standard method from desktop and web applications.
Oauth提供了一种简单的,标准的方式去访问需要用户授权的API服务。
二、相关术语
1) OAUTH相关的三个URL:
Request Token URL: 获取未授权的Request Token服务地址;
User Authorization URL: 获取用户授权的Request Token服务地址;
Access Token URL: 用授权的Request Token换取Access Token的服务地址;
2) OAUTH相关的参数定义
OAUTH_consumer_key: 使用者的ID,OAUTH服务的直接使用者是开发者开发出来的应用。所以该参数值的获取一般是要去OAUTH服务提供商处注册一个应用,再获取该appkey。
OAUTH_consumer_secret:OAUTH_consumer_key对应的密钥。
OAUTH_token:通过此token可以获取appkey权限下的资源。
OAUTH_token_secret:OAUTH_token对应的私钥
OAUTH_signature_method: 请求串的签名方法,应用每次向OAUTH三个服务地址发送请求时,必须对请求进行签名。签名的方法有:HMAC-SHA1、RSA-SHA1与PLAINTEXT等三种。
OAUTH_signature: 用上面的签名方法对请求的签名。
OAUTH_timestamp: 发起请求的时间戳,其值是距1970 00:00:00 GMT的秒数,必须是大于0的整数。本次请求的时间戳必须大于或者等于上次的时间戳。
OAUTH_nonce: 随机生成的字符串,用于防止请求的重复,防止外界的非法攻击。
OAUTH_version: OAUTH的版本号。
3) OAUTH HTTP响应代码:
l HTTP 400 Bad Request 请求错误
Unsupported parameter 参数错误
Unsupported signature method 签名方法错误
Missing required parameter 参数丢失
Duplicated OAUTH Protocol Parameter 参数重复
l HTTP 401 Unauthorized 未授权
Invalid Consumer Key 非法key
Invalid / expired Token 失效或者非法的token
Invalid signature 签名非法
Invalid / used nonce 非法的nonce
三、授权流程
三句话可以概括:
1. 获取未授权的Request Token
2. 获取用户授权的Request Token
3. 用授权的Request Token换取AccessToken
当应用拿到AccessToken后,就可以有权访问用户授权的资源了。上面的三个步骤中,每个步骤分别请求一个URL,并且收到相关信息,并且拿到上步的相关信息去请求接下来的URL直到拿到Access Token。具体的步骤如下图所示:
具体每步执行信息如下:
用户指的是新浪微博用户,Consumer指的是CSDN网站,Service Provider代表新浪微博
前提:CSND网站在新浪微博注册应用,并发给它一个OAUTH_consumer_key和OAUTH_consumer_secret。
First: 用户登录CSDN网站,用户点击“使用新浪微博帐号登录”。
A. CSDN网站向新浪微博的Request TokenURL发起请求,请求未经用户授权的Request_Token和 Request_Token_Secret。
B. 新浪微博同意CSDN网站的请求,并向其颁发未经用户授权的oauth_token与对应的oauth_token_secret,并返回给CSDN网站,即Request_Token和 Request_Token_Secret。
C. CSDN网站向新浪微博的UserAuthorization URL发起请求,请求用户授权的Request Token。请求带上上步拿到的Request_Token和 Request_Token_Secret。
D. 新浪微博将引导用户授权,该过程可能会提示用户,你想将哪些受保护的资源授权给该应用,用户在微薄网页上输入用户名和密码,同意授权。此步可能会返回授权的Request Token也可能不返回。如Yahoo OAUTH就不会返回任何信息给CSDN网站。授权成功后,新浪微博引导用户回到CSDN网站页面。
E. Request Token 授权后,CSDN网站将向新浪微博的AccessToken URL发起请求,将上步授权的Request Token换取成Access Token。这个比第一步A多了一个参数就是用户授权的Request Token。
F. 新浪微博同意使用者的请求,并向其颁发Access_Token和Access_Token_Secret,并返回给CSDN网站。
G. CSDN网站以后就可以使用上步返回的AccessToken访问用户授权的资源。
四、通俗的说
OAuth协议中包含了三个角色:
Service Provdier,即服务提供者,如新浪微博;
User,即普通用户,如新浪微博用户;
Consumer,即第三方应用,如本人开发的应用。
现有如下场景:User想利用Consumer来更新自己在Service Provider中的状态,但此时Service Provider并不信任Consumer,且User也不想把帐号和密码告诉Consumer,于是三者之间需要建立起信任关系。
Consumer首先要向Service Provider申请一对Consumer_Key和Consumer_Secret,以此取得Service Provider的信任。因为User是信任Service Provider的,所以User与Consumer间的信任关系需要借助Service Provider来建立。
Consumer用自己的Consumer_Key和Consumer_Secret向Service Provider请求到一对Request_Token和Request_Token_Secret,而后Consumer拿上这对RequestToken,领着User去见Service Provider。Service Provider见到自己发的RequestToken,便确认Consumer是值得信任的,于是把头转向User。如果Service Provider不记得User了,只要User向Service Provider提供用户名和密码,就能建立起信任关系。然后Service Provider对User说:“我很信任这个Consumer,你是不是也要信任他?”,若User确认,则Service Provider允许Consumer把User带回去,并发给Consumer一个Verifier.
回来以后,Consumer拿着RequestToken和Verifier又单独去找Service Provider,取回来一对Access_Token和Access_Token_Secret,并长期保存。
至此,三方信任关系就建立起来了,Consumer每次在Service Provider中更新User的状态时,只需要提供这对AccessToken,Service Provider便能确定此Consumer能代替User进行相应的操作。
在使用相关OAuth库进行开发时,所需要的关键字在以上场景中都有体现,包括:
Consumer_Key, Consumer_Secret, Request_Token, Request_Token_Secret, Verifier, Access_Token, Access_Token_Secret
五、参考
http://oauth.net/documentation/getting-started/
http://en.wikipedia.org/wiki/OAuth
http://zh.wikipedia.org/wiki/OAuth
http://blog.csdn.net/hereweare2009/article/details/4002537