V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
clip
V2EX  ›  问与答

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

  •  
  •   clip · 2016-04-12 21:23:49 +08:00 · 19254 次点击
    这是一个创建于 3143 天前的主题,其中的信息可能已经有所发展或是发生改变。

    有一个需求是用用户的 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 吗?有用的话会在什么时候用?
    10 条回复    2016-09-04 14:21:12 +08:00
    Muninn
        1
    Muninn  
       2016-04-12 21:36:37 +08:00   ❤️ 1
    你作为第三方,写一个应用,要得到访问用户在某些大站的一些资源的授权,用户那里会弹出来大站的授权页面,这要求用户输入帐号密码做验证的。
    然后你拿到 access token 和 refresh token 以后,快过期了用 refresh token 刷一下,就省去让用户再输入帐号密码登录然后授权你的这一步了。
    clip
        2
    clip  
    OP
       2016-04-12 21:39:04 +08:00
    @Muninn 是的,现在是想了解下细节的地方, access token 快过期的时候用 refresh token 刷完之后, refresh token 也会跟着更新吗?
    Archangel_SDY
        3
    Archangel_SDY  
       2016-04-12 22:00:00 +08:00   ❤️ 1
    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
        4
    Muninn  
       2016-04-12 23:35:07 +08:00
    对的 有的一个一直刷 有的每次要换一个新的
    看用的库是怎么实现的
    gitb
        5
    gitb  
       2016-04-12 23:45:22 +08:00 via Android
    微博,我一般在第 5 , 6 天再进行一次授权,这样就能又延长 7 天
    axb
        6
    axb  
       2016-04-13 00:27:31 +08:00
    微博的 oauth2 我印象中应该是没有 refresh token 的……非 sdk 应用需要到期前重新授权。
    clip
        7
    clip  
    OP
       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
        8
    clip  
    OP
       2016-04-13 10:29:15 +08:00
    @gitb 总是让用户授权会有些麻烦啊😂

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

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

    楼主你好,我也遇到这些困惑了。
    我看了楼上各位的评论解释,可以理解微博做的机制是 refreshtoken 不被自己刷新, 30 天到期后就不能用了,必须用户手动点授权。请问你现在知道答案了吗?的确是这样吗?
    我测试的结果很奇怪, refresh 之后,两种 token 返回值都没变,也就是 accesstoken 没被刷新。难道号码不变,有效期就已经延长了?不会吧。。。我测试的日子比较短,但是印象里一个星期以来,都没变过,😅
    如果楼主有这方面经验,希望不吝赐教,感谢
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3139 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 13:50 · PVG 21:50 · LAX 05:50 · JFK 08:50
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.