OAuth 授权与 OpenId 验证

在通过 REST API 向第三方开放资源的网站中(比如 Dropbox,新浪微博等),许多都使用 OAuth 授权方式。这里总结下 OAuth 1.0 授权的过程。

第三方要得到服务提供商的用户资源的使用权限,首先需要到服务提供商网站中申请自己的 oauth_consumer_key 和 oauth_consumer_secret。然后按照下面三步的方式获取用户授权。

第一步是获取临时的 Request Token。第三方发送 oauth_consumer_key,oauth_timestamp,oauth_nonce,oauth_signature_method 和 oauth_signature 给服务提供商;而服务提供商返回 oauth_token,oauth_token_secret。其中 oauth_timestamp 是当前的时间,用于防止重放攻击;oauth_nonce 是随机数;oauth_signature_method 是签名方法(包括 HMAC-SHA1, RSA-SHA1 和 PLAINTEXT)而 oauth_signature 对传输方法,API 网址和参数连接后签名的结果。

第二步是获取用户授权。第三方发送 oauth_token 和 oauth_callback 给服务提供商,同时将页面重定向到服务提供商的用户授权页面;而服务提供商在用户同意授权后返回 oauth_token,并重定向回前面第三方发送的 oauth_callback 地址。

第三步是获取 Access Token。第三方发送 oauth_consumer_key,oauth_token,oauth_timestamp,oauth_nonce,oauth_signature_method 和 oauth_signature 给服务提供商;而服务提供商返回新的长期有效的 oauth_token 和 oauth_token_secret 给第三方。

得到了 Access Token,就可以用它来访问该用户的资料了,访问某个 API 地址时只需要发送 oauth_consumer_key,oauth_token,oauth_timestamp,oauth_nonce,oauth_signature_method 和 oauth_signature 参数就可以了。

例如,Dropbox 的 OAuth 授权过程基本是这样的:

=> 网页在 http://example.com/



https://api.dropbox.com/1/oauth/request_token

  ?oauth_consumer_key=3f0mtmjk0qhxgfv

  &oauth_signature_method=HMAC-SHA1

  &callback=json1

  &oauth_timestamp=1340334772

  &oauth_nonce=G06XIc

  &oauth_signature=Mqv6%2BQ%2BjYl08pRP9roI6kOn9jfg%3D&



https://www.dropbox.com/1/oauth/authorize

  ?oauth_token=6d190m4fg2de2xl

  &oauth_callback=http://example.com/



=> 网页返回到 http://example.com/?uid=432632&oauth_token=6d190m4fg2de2xl

 

https://api.dropbox.com/1/oauth/access_token

  ?oauth_consumer_key=3f0mtmjk0qhxgfv

  &oauth_signature_method=HMAC-SHA1

  &oauth_token=6d190m4fg2de2xl

  &callback=json1

  &oauth_timestamp=1340334865

  &oauth_nonce=e3RKM6

  &oauth_signature=TAFTpt2bF4bxxcbs9lpIIU%2FPYG8%3D&



https://api.dropbox.com/1/account/info

  ?oauth_consumer_key=3f0mtmjk0qhxgfv

  &oauth_signature_method=HMAC-SHA1

  &oauth_token=za2f38ze22isagk

  &callback=json2

  &oauth_timestamp=1340334867

  &oauth_nonce=33k4Xx

  &oauth_signature=DEk3gW7kf%2BxQJxBXOhtTQX%2BOEwQ%3D&

OAuth 提供的是对用户资料的授权过程,而如果只需要验证用户的真实性,只需要使用 OpenID。例如腾讯就提供 QQ 号码的 OpenID 验证,可以用 QQ 号码登录其它多个第三方网站。

参考资料:
[1] OAuth Core 1.0
[2] Oauth - 新浪微博API
[3] 腾讯微博 API OAuth认证介绍
[4] Dropbox - REST API reference
[5] OAuth那些事儿
[6] OAuth的改变
[7] OpenID Foundation website
[8] OpenID - 维基百科
[9] OpenId&OpenKey认证

你可能感兴趣的:(OAuth)