1
linzyjx 74 天前
refresh token 一般也是有有效期的吧?不过就是比较长而已。
|
2
wonderfulcxm 74 天前 via iPhone
可以 revoke 原 app 的 secret code ,我记得 Google 在 refresh token 时需要提供 app id 和 app 的 secret 。
|
3
MillaMaxwell 74 天前
refresh token 也有有效期,每次获取新的 refresh token 也需要进行验证就可以了
|
4
patrickyoung 74 天前 via Android
看 auth0 文档去,okta 的文档写的很清楚…
|
5
a1528zhang OP @linzyjx 一般来说 refresh token 的有效期在几个月,而且如果我使用 refresh token rotate 的机制,会导致后端总是会存放一个有效的 refresh token ,这样如果攻击者用盗来的 ID token 调用我后端的 api 来刷新 token ,就会一直有权限了
|
6
a1528zhang OP @patrickyoung 文档翻了很多次了,可能我理解有误,没找到能解答疑问的内容
|
7
RightHand 74 天前 via Android
token 被盗意味客户端被破解,无解
|
8
a1528zhang OP @MillaMaxwell 我们用了 refresh token rotate 的机制,目的是为了实现免登录,会导致 refresh token 会不断更新,这样 refresh token 就总是会有一个有效的
|
9
javalaw2010 74 天前
这套流程是没问题的。鉴权跟账号安全是两个场景。
首先你要保证信道的安全,保证 token 的传输过程中不会被截获。那么此时 token 被截获的场景要么就是用户的设备被黑客控制了,要么就是你们的服务端被黑客控制了,而如何防止这两种情况的出现又都是别的话题了。 其次,refresh token 应该是一次性的,用完就丢了。 然后,你可以做一些风控,来弱化盗号的影响,比如限制登录的设备个数,举例限制 2 台设备,第 3 台设备登录后,要主动失效签发给第一台设备的所有 token 。比如 token 和 ip/地区/设备指纹绑定,不符合则认为是无效的 token 。比如引入二因素认证等等。 |
10
a1528zhang OP @wonderfulcxm 那这样的话我们一个终端用户的 token 泄露就会导致所有的终端用户都需要重新登录一遍才行了。
|
11
cheng6563 74 天前
做单会话登录,就是用户登录会把其他会话都挤掉。
|
12
iyiluo 74 天前
定期失效+设备绑定+ip 绑定,看你想做到什么程度
|
13
anonydmer 74 天前
楼主你用错了吧,ID Token 这个 token 是不能用来访问 api 的,只是用来返回用户信息的; 调用 api 的仍然是 access token ,而它是的有效期是很短期的;
|
14
a1528zhang OP @javalaw2010 明白了,感谢解答。基本的安全策略比如 https ,http only 的 cookies 等我们还是实现了的。
同时我们的 refresh token 是每用一次就会更新一个新的存在后端。 风控手段是必须的我们准备以后会做。 其实我就是担心设备被黑客控制了以后,等于是用户账号永久失窃,而且连防御的手段都没有(除了刷新 client 的 app id 和 secret )。因为黑客可以用 token 不断刷新有效期。 主要是刚接触这个领域,怕还有更好的实现方式我不知道。 |
15
a1528zhang OP @cheng6563 这个我考虑过,但是如果被窃的用户长时间不登录就没法挤掉
|
16
a1528zhang OP @iyiluo 嗯现在看来设备 ip 绑定是比较保险的做法,以后会做。因为我们做了 token 刷新的机制所以定期失效的手段没用了
|
17
a1528zhang OP @anonydmer 是的,我理解 access token 是用于访问我们申请权限的服务的 api ,比如我们接入的 github 的账号,然后我们拿到的 access token 也仅用于访问 github 的 api 。
ID Token 我是用作一个登录凭证,证明这个用户登录成功了,那么他可以调用我们服务端的 api 而不是 github 的 api 。所以我理解 ID Token 我应该没有用于请求,而是只用于身份证明。 那么这个身份证明被盗用后,我们后端是否有手段可以让这个特定的身份证明失效呢? |
18
patrickyoung 74 天前 via Android
|
19
patrickyoung 74 天前 via Android
楼主要细看一下 authorization 和 authentication 的区别,然后 oauth2 和 oidc 规范,然后去看 a0/okta 的 security feature ,所有的问题的答案都在这里
|
20
a1528zhang OP @patrickyoung 是的,我把 ID Token 加密后作为身份认证,来访问我们自己的后端 api ,并没有访问授权方(比如 github )的 api 。所以应该不涉及 api 的调用,如果 我不用 ID Token 那么我也要自己生成一个 Token 给用户来证明他已经登录了。
所以当这个 token 被盗取了后,攻击者和用户都可以使用同一个 token 来调用我们后端服务 api ,然后我们的 api 中包含一个刷新 token 的 api ,所以攻击者和用户就都能不断获取新的 token 来保持永久登录。 |
21
a1528zhang OP @patrickyoung 感谢 我再去翻一下
|
22
cat1879 74 天前
1 、refresh token 有时效性,一般都是两小时失效;
2 、token 要用 app id 和 app secret 来换; 3 、token 应该要结合单个用户再获取一个认证,用这个认证给个用户做授权; 所以理论上 id secret token 这三个都在后台跑,token 在不同站点间交互可能会有泄露;用户认证授权有可能泄露但只对单个用户; 按你的描述我感觉你是不是少了一级,你是直接把 token 当公共参数丢给所有用户作为授权了 |
23
a1528zhang OP @cat1879 我参考的参考他们的文档 https://auth0.com/docs/secure/tokens/refresh-tokens
1. refresh token 的时效性一般来说是比较长的,但是 id 和 access token 的时效会很短,但是如果我使用 refresh token rotate 机制的话 refresh token 的存在时间也会比较短 2. 我这边 token 只在第登录验证的时候会使用 appid 和 seceret 交互,但是之后可以使用 refresh token 进行刷新,就不需要 secret 了 3. 确实理论上我应该把 token 全部放在后端,然后我的后端再做一个单独的授权 token 给我的前端。但是这个行为本质上是给前端一个唯一的身份证明,所以我选择吧 id token 加密后生成一个新的 token 来承担这个功能,这样我也不用做签算机制了,少点工作。 |
24
fredweili 74 天前
你说的这个算法类似 PKCE
token 可以在 server 端 invalidate 的,看 server 端的检测机制 |
25
a1528zhang OP @fredweili 是的,其实就是 PKCE 了,但是 OAuth 签发的 Token 应该是无法主动失效的: https://auth0.com/docs/secure/tokens/revoke-tokens
不过我们重新获取 refresh Token 后,会让旧的 refresh Token 失效;由于我自己签算的 Token 是使用 ID Token + refresh Token, 也就达到了让前端 Token 失效的效果 |
26
Dlin 73 天前
access Token 就是拿来认证的,干嘛还要搞个 ID Token 。你这个问题我曾经也想过,任何认证方式在泄露 token 后都存在用户信息的不安全。你的想法是持票人的实现办法,可以做到单设备登录,用户可以感知被挤了下去了,算是加强了一些。
|
27
Dlin 73 天前
refrash_token 只能使用一次,刷新后返回新的 refrashToken 。
|
28
a1528zhang OP @Dlin 我理解 access token 用来访问的是授权方(比如 github 的 api ),我这里其实需要的是访问我们自己应用的后端,只需要一个登录成功的证明就行了
|