Rails 新浪微博 oauth2.0 的一个小问题

zhangyuxiu · 2013年11月29日 · 最后由 chitsaou 回复于 2013年12月03日 · 4621 次阅读

新浪微博 OAuth2.0 的两个接口: 请求授权的接口:oauth2/authorize 请求参数有 client_id 等
(具体使用方法见链接:http://open.weibo.com/wiki/Oauth2/authorize ) 获取授权的接口:oauth2/access_token 请求参数有 client_id, client_secret 等 (具体使用方法见链接:http://open.weibo.com/wiki/OAuth2/access_token

求详解 client_secret 的作用,为什么在请求授权时不要提供,而在获取授权时需要提供呢?

OAuth 2.0 的 spec 也是这样规定的,我来说一下为什么:

  • /authorize 不能提供 secret,因为这里的操作是经过 browser 的,提供 secret 等同于外泄 secret。
  • 有了 secret 就能取得 token,所以 client 要把 secret 当做密码来看待
  • /token 是网站 client 的后端要去取得 token 用的,这里的通道可以保证安全,所以 secret 不会外泄

另外 secret 只适用于「比较不会被黑的 client」,例如网站后端,这种称为 confidential client,相对应的是 public client,举凡手机应用、桌面应用、JavaScript 应用都算,这种因为很容易就抓出数据,所以 authorization server 就算收到它们的 id + secret 也无法证实它们是真正的 client,因此在这些应用里面,通常是用 implicit flow 来取得 token 的。

日前我分享了「简单易懂的 OAuth 2.0」,以下是那次演讲的 slides,你可以看看,大致上规格书里面的重点我都讲到了

https://speakerdeck.com/chitsaou/jian-dan-yi-dong-de-oauth-2-dot-0

#2 楼 @chitsaou 请教:客户端利用 access token 去获取保护资源的时候,只提供了 access token 么?资源服务器有一张 access token 与客户端、资源拥有者、权限等关联的信息。资源服务器不再需要验证客户端的身份了吧?这样的话,由于我想防止 access token 被劫持,想使用 client_secret 做密钥对 access token 签名,应该可以吧?

RFC 6750 里面规定的是「只送 access_token」,所以你说「不需要送 secret」这是正确的。

至于签名,由于 client_secret 在 public client 很容易被偷,所以在 client 对 access token 签名并不能防止被偷。

在 RFC 6749 里面,防范 token 被劫持的方式比较消极,除了 SSL 之外,好像就是对 public client 核发短效期的 token 来对应(几天就失效,降低被偷走的风险),事实上,在 public client,所有数据可以被偷走,在 OAuth 2 里面没有规划绝对防止这个问题的方式。

注:我不确定 OAuth 2 的 MAC Token 能不能解决你的问题,这份 spec 我没有看。

需要 登录 后方可回复, 如果你还没有账号请 注册新账号