OAuth 2.0 里面 refresh token 的正确使用方法是什么?

2016-04-12 21:23:49 +08:00
 clip

有一个需求是用用户的 access token 定期去用户的 SNS 那边获取一些信息。暂时有接微博、豆瓣和 QQ 的 Oauth ,豆瓣和 QQ 的 access token 失效时间比较长还好一些,微博的只有 7 天有效期。

有 refresh token 的话可以更新一下 access token 多用一段时间。

下面是自己今天测试的一些结果:

  1. 微博用 SDK 获取到 refresh token ,用服务器通过 API 更新 access token 的时候可以更新到 access token ,但不会返回新的 refresh token
  2. 豆瓣用 API 获取到 refresh token ,再去更新的时候会获得新的
  3. QQ 用 API 获取到 refresh token ,再去更新的时候返回的 access token 和 refresh token 都还是旧的(可能是因为时间太短的缘故)

现在有几个问题:

  1. 豆瓣那里用 refresh token 更新 access token 的时候 refresh token 也会跟着被更新,那有效期也跟着延长吗?(换句话说就是只要在 refresh token 过期前 refresh 一下, refresh token 就可以一直用下去吗?)
  2. 微博的 refresh token 必须用 SDK 的时候才能获取到,去用 API refresh 的时候不再有新的 refresh token 是不是就是说 等 refresh token 过期了就不行了?
  3. 大家都有实际去用这个 refresh token 吗?有用的话会在什么时候用?
19255 次点击
所在节点    问与答
10 条回复
Muninn
2016-04-12 21:36:37 +08:00
你作为第三方,写一个应用,要得到访问用户在某些大站的一些资源的授权,用户那里会弹出来大站的授权页面,这要求用户输入帐号密码做验证的。
然后你拿到 access token 和 refresh token 以后,快过期了用 refresh token 刷一下,就省去让用户再输入帐号密码登录然后授权你的这一步了。
clip
2016-04-12 21:39:04 +08:00
@Muninn 是的,现在是想了解下细节的地方, access token 快过期的时候用 refresh token 刷完之后, refresh token 也会跟着更新吗?
Archangel_SDY
2016-04-12 22:00:00 +08:00
https://tools.ietf.org/html/rfc6749#page-47


The authorization server MAY issue a new refresh token, in which case
the client MUST discard the old refresh token and replace it with the
new refresh token. The authorization server MAY revoke the old
refresh token after issuing a new refresh token to the client. If a
new refresh token is issued, the refresh token scope MUST be
identical to that of the refresh token included by the client in the
request.

协议对于这一块的说法是 MAY ,所以取决于各家实现.
Muninn
2016-04-12 23:35:07 +08:00
对的 有的一个一直刷 有的每次要换一个新的
看用的库是怎么实现的
gitb
2016-04-12 23:45:22 +08:00
微博,我一般在第 5 , 6 天再进行一次授权,这样就能又延长 7 天
axb
2016-04-13 00:27:31 +08:00
微博的 oauth2 我印象中应该是没有 refresh token 的……非 sdk 应用需要到期前重新授权。
clip
2016-04-13 10:26:17 +08:00
@Archangel_SDY 谢谢!明白了。

像下面百度的文档里面写的比较清楚,就是属于每次 issue a new refresh token 的吧!

百度 OAuth2.0 官方参考文档 - 百度开放云平台
http://developer.baidu.com/wiki/index.php?title=%E7%99%BE%E5%BA%A6OAuth2.0%E5%AE%98%E6%96%B9%E5%8F%82%E8%80%83%E6%96%87%E6%A1%A3

注意: refresh token 的作用:就是换取新的 access token 和 refresh token ,以达到 access token 永久有效。

豆瓣应该也是, QQ 估计是,微博我去试试 SDK 刷新能不能拿到 refresh token 。
clip
2016-04-13 10:29:15 +08:00
@gitb 总是让用户授权会有些麻烦啊😂

@axb 微博的 API 调用是没有 refresh token 的, SDK 会提供 refresh token
> 除此之外,我们也提供了通过 Refresh Token 刷新的方式来延续授权有效期,但需要注意的是:只有使用微博官方移动 SDK 的移动应用,才可以从 SDK 的方法中获取到 Refresh Token 。
clip
2016-04-13 12:17:23 +08:00
@clip 微博的 SDK 只能够用来登陆认证,不能 refresh ,所以 refresh 还是要通过 API ,通过 API 的话是原来测试到的,不能一直刷新下去。
erinsnow
2016-09-04 14:21:12 +08:00
quote:

微博的 refresh token 必须用 SDK 的时候才能获取到,去用 API refresh 的时候不再有新的 refresh token 是不是就是说 等 refresh token 过期了就不行了?

楼主你好,我也遇到这些困惑了。
我看了楼上各位的评论解释,可以理解微博做的机制是 refreshtoken 不被自己刷新, 30 天到期后就不能用了,必须用户手动点授权。请问你现在知道答案了吗?的确是这样吗?
我测试的结果很奇怪, refresh 之后,两种 token 返回值都没变,也就是 accesstoken 没被刷新。难道号码不变,有效期就已经延长了?不会吧。。。我测试的日子比较短,但是印象里一个星期以来,都没变过,😅
如果楼主有这方面经验,希望不吝赐教,感谢

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/270556

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX