请问 OAuth 中的 access_token 为什么需要过期

2018-06-12 16:08:00 +08:00
 cc959798

为什么需要设置国企 refresh_token 来刷新 access_token,有些人说是因为 Access_token 会过期,refresh_token 也会过期,为什么不设计成 access_token 和 refresh_token 一样长的过期时间,然后 refresh_token 就不需要了,反正 refresh_token 也会过期

9550 次点击
所在节点    Java
52 条回复
Rekkles
2018-06-12 17:08:34 +08:00
refresh_token 过期时间比 access_token 要长,这样 access_token 即使过期了,也可以用 refresh_token 去重新刷新 token,既为了安全考虑,也为用户体验着想
littleylv
2018-06-12 17:12:41 +08:00
如果只是 access_token 过期了,可以继续用 refresh_token 来换取 access_token,换取的过程直接调接口,用户感觉不出来。
一旦 refresh_token 过期,就需要用户重新登录、授权等流程了。

所以 refresh_token 的作用可以理解成,不需要每次 token 过期就需要用户登录授权。
你说的“ refresh_token 就不需要了”完全是不对的
march1993
2018-06-12 17:20:23 +08:00
我和你有同样的疑问,我觉得 access_token 也没有意义。从安全角度讲,拿到 access_token 离拿到 refresh_token 也只有一步之遥了
cc959798
2018-06-12 18:08:11 +08:00
@march1993 网上的那些资料只讲了怎么做,但是至于为什么没说清楚哦,我相信很多人是有疑问的
cc959798
2018-06-12 18:10:30 +08:00
@littleylv 你好,refresh_token 作作用我清楚,不需要重新登录就可以再次拿到授权,但是如果把 access_token 的过期时间和 refresh_token 一样长的话感觉就不需要 了,毕竟如果一样长的话,access_token 过期了 refresh_token 也过期了,然后重新登录不就行了

至于安全方面我不太明白 refresh_token 的存在的意义
zhouyou457
2018-06-12 18:21:46 +08:00
refresh_token 是一次性的,同时还需要校验客户端的有效性,比如客户端 secret_key 之类的
zhouyou457
2018-06-12 18:23:53 +08:00
在我做的系统中 access_token 过期时间是 1 天,而 refresh_token 过期时间是一个月...如果按你说两者同时过期,让用户输入密码的话,使用体验是很差的....至少我不愿意在一个应用中反复输入密码
littleylv
2018-06-12 18:41:24 +08:00
@zhouyou457 #7
也许楼主的意思是:如果他不需要 refresh,然后把 access 设置成很久(比如和你的 refresh 一样一个月),那是不是也是一个月后再让用户登录授权,跟你的系统没两样(看起来没两样)。

但是为了防止 access token 的泄露,一般会把他设置很短时间比如一天。


@march1993 #3
拿到 access 不等于可以拿到 refresh,因为 access 会经常在 api 调用中传输,会有安全隐患,但即使被人拿到了,别人根本不知道 refresh,所以只要几个小时后 access 失效,别人也就没辙了。

这就是为什么需要两者并用,切 access 时间很短的原因了把
lurenw
2018-06-12 18:57:49 +08:00
access_token 暴露在外面的时间越久越危险,需要不断变化来防止泄露。

refresh_token 用专门的接口和单独的服务器,达到相对的 safer。

ps. oauth 和 jwt 那套标准和流程真的啰嗦。
mooncakejs
2018-06-12 18:59:10 +08:00
refresh_token 的获得和更换 access token 只有 2 个接口,这两个接口需要严格的安全措施( https 等),但是对于 access_token 的使用,没有这个限制,所以泄露风险大大增加。
maichael
2018-06-12 19:07:46 +08:00
There is a security reason, the refresh_token is only ever exchanged with authorization server whereas the access_token is exchanged with resource servers. This mitigates the risk of a long-lived access_token leaking in the "an access token good for an hour, with a refresh token good for a year or good-till-revoked" vs "an access token good-till-revoked without a refresh token."
maichael
2018-06-12 19:10:16 +08:00
上面忘记加引用了。

大体意思和 #9 差不多。
march1993
2018-06-12 19:51:58 +08:00
@littleylv 那完全可以授权多个 access_token,独立审计,也比这种短时 access_token 好啊
Foolt
2018-06-12 20:13:41 +08:00
@march1993 你觉得拿到 access_token 离拿到 refresh_token 也只有一步之遥,是因为你的业务场景比较简单,access_token 和 refresh_token 保存在同一个地方。

有的场景并不是这样。比如说你要开发个 Javascript 版微博,用户授权后,你直接在浏览器用 JS 获取微博内容,那么 access_token 就会暴露在浏览器之中,但 refresh_token 只在你的服务器里,当用户退出网页后你可以通过刷新令已经暴露的令牌失效。
sidgwick
2018-06-12 20:19:03 +08:00
@littleylv 我也觉得是这样,access token 需要经常在网络上传输。这传来穿去的就不安全了
march1993
2018-06-12 21:40:50 +08:00
@Foolt 这个客户端应该是个第三方 JS 微博客户端对吧?这个短时 access_token 在用户每次登陆时都需要去刷新吧,存不存 refresh_token 一样啊,要 revoke 也可以直接用这个 access_token。所以存这个 refresh_token 的意义在哪里…要安全完全可以隔离不同的 token。客户端如果不安全,拿到了 access_token,那离拿鉴权也不远啊… 所以我不能信服你这个说法
march1993
2018-06-12 21:44:07 +08:00
当然我觉得拿鉴权还是有点过了,不过如果可以拿到 access_token 一次,就说明可以不断地拿了吧,只要用户经常使用的话?
chinvo
2018-06-12 21:46:03 +08:00
@march1993 #16 此言差矣

refresh token 必须和 client secret 一起用才有效

而且在权限限制严格的情况下,refresh token 必须在满足特定条件下才会被发放给 oauth client

而 access token 是经常暴露出来的,并且可以先送给第三方 resource provuder,但 refresh token 只能在 oauth client 和 authentication provider 之间传递并且必须被保密存放
chinvo
2018-06-12 21:51:29 +08:00
@march1993 #16

另外 agent 不等同于 client,agent 是暴露给用户的部分,包括浏览器、app,而 client 是指包含 agent 和执行 code 换 token 或者 refresh token 换 token 的服务器端两部分,单纯的 agent 形式的 client 又叫 public client,是不能使用 client secret 和 refresh token 的

#17 但是非法的 agent 能偷到一次 access token 不代表可以偷到第二次,而如果能偷到 refresh token 并使 refresh token 有效,就是非常严重的安全事故了
march1993
2018-06-12 21:51:47 +08:00
@chinvo 我觉得这种做法看似加强了安全,实则让审计成了一个黑箱。在若干第三方 resource provider 中,设有一个被入侵污染了,如何发现并清除呢?由于 access_token 是公用的,我任务这种情况下就很麻烦。

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

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

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

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

© 2021 V2EX