OAuth 认证机制下,如果 Token 被窃取了是否意味了账号被盗?有办法减轻影响吗?

4 天前
 a1528zhang
我是一个刚接触 OAuth 的新手,最近刚接入了 auth0 的身份验证。

我们的产品是一个 web app ,然后后端作为 auth0 的客户端,保存了 auth0 返回的 access Token, refresh Token , 然后将 ID Token 加密后放到前端,作为用户的登录凭证。用户调用我们的后端 api 的时候直接验证一下 ID Token 是不是合法,然后就直接做用户操作了。

然后我们为了用户体验使用了 refresh Token 来刷新用户的 ID Token ,当 ID Token 过期的时候就调用一下后端的 api ,后端再到 auth0 去请求新的 token ,然后更新 access Token, refresh Token ,再把新的 ID Token 返回给用户。

我的疑问是,当用户的 ID Token 被获取了,在这套机制下就等于是账号全部失窃了,因为攻击者可以利用 refresh Token 不断刷新有效期。所以要如何解决这个问题?我的这个实现流程是否有问题?

希望有经验的大佬解答一下,感激不尽
1359 次点击
所在节点    信息安全
28 条回复
linzyjx
4 天前
refresh token 一般也是有有效期的吧?不过就是比较长而已。
wonderfulcxm
4 天前
可以 revoke 原 app 的 secret code ,我记得 Google 在 refresh token 时需要提供 app id 和 app 的 secret 。
MillaMaxwell
4 天前
refresh token 也有有效期,每次获取新的 refresh token 也需要进行验证就可以了
patrickyoung
4 天前
看 auth0 文档去,okta 的文档写的很清楚…
a1528zhang
4 天前
@linzyjx 一般来说 refresh token 的有效期在几个月,而且如果我使用 refresh token rotate 的机制,会导致后端总是会存放一个有效的 refresh token ,这样如果攻击者用盗来的 ID token 调用我后端的 api 来刷新 token ,就会一直有权限了
a1528zhang
4 天前
@patrickyoung 文档翻了很多次了,可能我理解有误,没找到能解答疑问的内容
RightHand
4 天前
token 被盗意味客户端被破解,无解
a1528zhang
4 天前
@MillaMaxwell 我们用了 refresh token rotate 的机制,目的是为了实现免登录,会导致 refresh token 会不断更新,这样 refresh token 就总是会有一个有效的
javalaw2010
4 天前
这套流程是没问题的。鉴权跟账号安全是两个场景。

首先你要保证信道的安全,保证 token 的传输过程中不会被截获。那么此时 token 被截获的场景要么就是用户的设备被黑客控制了,要么就是你们的服务端被黑客控制了,而如何防止这两种情况的出现又都是别的话题了。

其次,refresh token 应该是一次性的,用完就丢了。

然后,你可以做一些风控,来弱化盗号的影响,比如限制登录的设备个数,举例限制 2 台设备,第 3 台设备登录后,要主动失效签发给第一台设备的所有 token 。比如 token 和 ip/地区/设备指纹绑定,不符合则认为是无效的 token 。比如引入二因素认证等等。
a1528zhang
4 天前
@wonderfulcxm 那这样的话我们一个终端用户的 token 泄露就会导致所有的终端用户都需要重新登录一遍才行了。
cheng6563
4 天前
做单会话登录,就是用户登录会把其他会话都挤掉。
iyiluo
4 天前
定期失效+设备绑定+ip 绑定,看你想做到什么程度
anonydmer
4 天前
楼主你用错了吧,ID Token 这个 token 是不能用来访问 api 的,只是用来返回用户信息的; 调用 api 的仍然是 access token ,而它是的有效期是很短期的;
a1528zhang
4 天前
@javalaw2010 明白了,感谢解答。基本的安全策略比如 https ,http only 的 cookies 等我们还是实现了的。
同时我们的 refresh token 是每用一次就会更新一个新的存在后端。

风控手段是必须的我们准备以后会做。

其实我就是担心设备被黑客控制了以后,等于是用户账号永久失窃,而且连防御的手段都没有(除了刷新 client 的 app id 和 secret )。因为黑客可以用 token 不断刷新有效期。

主要是刚接触这个领域,怕还有更好的实现方式我不知道。
a1528zhang
4 天前
@cheng6563 这个我考虑过,但是如果被窃的用户长时间不登录就没法挤掉
a1528zhang
4 天前
@iyiluo 嗯现在看来设备 ip 绑定是比较保险的做法,以后会做。因为我们做了 token 刷新的机制所以定期失效的手段没用了
a1528zhang
4 天前
@anonydmer 是的,我理解 access token 是用于访问我们申请权限的服务的 api ,比如我们接入的 github 的账号,然后我们拿到的 access token 也仅用于访问 github 的 api 。

ID Token 我是用作一个登录凭证,证明这个用户登录成功了,那么他可以调用我们服务端的 api 而不是 github 的 api 。所以我理解 ID Token 我应该没有用于请求,而是只用于身份证明。

那么这个身份证明被盗用后,我们后端是否有手段可以让这个特定的身份证明失效呢?
patrickyoung
4 天前
id token 不是鉴权用的…只是标识身份…

https://auth0.com/blog/refresh-tokens-what-are-they-and-when-to-use-them/
patrickyoung
4 天前
楼主要细看一下 authorization 和 authentication 的区别,然后 oauth2 和 oidc 规范,然后去看 a0/okta 的 security feature ,所有的问题的答案都在这里
a1528zhang
4 天前
@patrickyoung 是的,我把 ID Token 加密后作为身份认证,来访问我们自己的后端 api ,并没有访问授权方(比如 github )的 api 。所以应该不涉及 api 的调用,如果 我不用 ID Token 那么我也要自己生成一个 Token 给用户来证明他已经登录了。

所以当这个 token 被盗取了后,攻击者和用户都可以使用同一个 token 来调用我们后端服务 api ,然后我们的 api 中包含一个刷新 token 的 api ,所以攻击者和用户就都能不断获取新的 token 来保持永久登录。

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

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

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

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

© 2021 V2EX