OAUTH协议为用户资源的授权提供了一个安全的、开放而又简易的标准。与以往的授权方式不同之处是OAUTH的授权不会使第三方触及到用户的帐号信息(如用户名与密码),即第三方无需使用用户的用户名与密码就可以申请获得该用户资源的授权,因此OAUTH是安全的。同时,任何第三方都可以使用OAUTH认证服务,任何服务提供商都可以实现自身的OAUTH认证服务,因而OAUTH是开放的。
典型案例
如果一个用户拥有两项服务:一项服务是图片在线存储服务A,另一个是图片在线打印服务B。由于服务A与服务B是由两家不同的服务提供商提供的,所以用户在这两家服务提供商的网站上各自注册了用户,假设这两个用户名各不相同,密码也各不相同。
当用户要使用服务B打印存储在服务A上的图片时,用户该如何处理?
方法一:用户可能先将待打印的图片从服务A上下载下来并上传到服务B上打印,这种方式安全但处理比较繁琐,效率低下;
方法二:用户将在服务A上注册的用户名与密码提供给服务B,服务B使用用户的帐号再去服务A处下载待打印的图片,这种方式效率是提高了,但是安全性大大降低了,服务B可以使用用户的用户名与密码去服务A上查看甚至篡改用户的资源。
方法三:当服务B(打印服务)要访问用户的服务A(图片服务)时,通过OAUTH机制,服务B向服务A请求未经用户授权的RequestToken后,服务A将引导用户在服务A的网站上登录,并询问用户是否将图片服务授权给服务B。用户同意后,服务B就可以访问用户在服务A上的图片服务。整个过程服务B没有触及到用户在服务A的帐号信息。
OAuth相关术语
在认证和授权的过程中涉及的三方包括:
服务提供方(ServiceProvider),用户使用服务提供方来存储受保护的资源,如照片,视频,联系人列表。
用户(User),存放在服务提供方的受保护的资源的拥有者
客户端(Consumer),要访问服务提供方资源的第三方应用,通常是网站,如提供照片打印服务的网站也可以是桌面或移动应用程序。在认证过程之前,客户端要向服务提供者申请客户端标识。
OAuth相关的三个URL:
RequestToken URL:获取未授权的RequestToken服务地址;
UserAuthorization URL:获取用户授权的RequestToken服务地址;
AccessToken URL:用授权的RequestToken换取AccessToken的服务地址。
OAuth相关的参数定义:
oauth_consumer_key:使用者的ID,OAUTH服务的直接使用者是开发者开发出来的应用。所以该参数值的获取一般是要去OAUTH服务提供商处注册一个应用,再获取该应用的oauth_consumer_key。
oauth_consumer_secret:oauth_consumer_key对应的密钥。
oauth_signature_method:请求串的签名方法,应用每次向OAUTH三个服务地址发送请求时,必须对请求进行签名。签名的方法有:HMAC-SHA1、RSA-SHA1与PLAINTEXT等三种。
oauth_signature:用上面的签名方法对请求的签名。
oauth_timestamp:发起请求的时间戳,其值是距197000:00:00 GMT的秒数,必须是大于0的整数。本次请求的时间戳必须大于或者等于上次的时间戳。
oauth_nonce:随机生成的字符串,用于防止请求的重放,防止外界的非法攻击。
oauth_version:OAUTH的版本号,可选,其值必须为1.0。
OAuth HTTP响应代码:
HTTP400 Bad Request请求错误
Unsupportedparameter参数错误
Unsupportedsignature method签名方法错误
Missingrequired parameter参数丢失
DuplicatedOAuth Protocol Parameter参数重复
HTTP401 Unauthorized未授权
InvalidConsumer Key非法key
Invalid/expired Token失效或者非法的token
Invalidsignature签名非法
Invalid /used nonce非法的nonce
OAuth认证和授权过程
OAUTH认证授权就三个步骤,三句话可以概括:
1. 获取未授权的RequestToken
2. 获取用户授权的RequestToken
3. 用授权的RequestToken换取AccessToken
下图显示了认证和授权具体步骤及参数
具体每步执行信息如下:
A. 客户端(第三方软件)向OAUTH服务提供商请求未授权的RequestToken。即向RequestToken URL发起请求;
B. OAUTH服务提供商同意使用者的请求,并向其颁发未经用户授权的oauth_token与对应的oauth_token_secret,并返回给使用者;
C. 使用者向OAUTH服务提供商请求用户授权的RequestToken。即向UserAuthorization URL发起请求并在请求中携带上一步服务提供商颁发的未授权的token与其密钥;
D. OAUTH服务提供商通过网页要求用户登录并引导用户完成授权;
E. RequestToken授权后,使用者将向AccessToken URL发起请求,将上步授权的RequestToken换取成AccessToken。请求的参数见上图,这个比第一步多了一个参数就是RequestToken;
F. OAUTH服务提供商同意使用者的请求,并向其颁发AccessToken与对应的密钥,并返回给使用者;
G. 使用者以后就可以使用上步返回的AccessToken访问用户授权的资源。