OAuth2 授权码模式的认证流程中涉及三方:用户、OAuth2 服务器(OP,OAuth2 Provider)、应用业务服务器(SP,Service Provider)。
SP、用户、OP 的交互目的分为以下几点:
-
SP 希望拿到一个可信的身份断言,从而让用户登录。 -
SP 发起登录,会跳转到 OP 的认证页面,OP 让用户登录,并授权自己的信息,然后 OP 将一个授权码 code 发给 SP。实际上这是在通过引用来传递用户信息。 -
SP 收到授权码 code 后,结合 Client ID 和 Client Secret 到 OP 换取该用户的 access_token。 -
SP 利用 access_token 到 OP 去获取用户的相关信息,从而得到一个可信的身份断言,让用户登录。 -
OAuth2 协议中,用户登录成功后,OAuth2 认证服务器会将用户的浏览器回调到一个回调地址,并携带一个授权码 code。这个授权码 code 一般有效期十分钟且一次有效,用后作废。这避免了在前端暴露 access_token 或者用户信息的风险,access_token 的有效期都比较长,一般为 1~2 个小时。如果泄露会对用户造成一定影响。
后端收到这个 code 之后,需要使用 Client Id + Client Secret + Code 去 OAuth2 认证服务器换取用户的 access_token。在这一步,实际上 OAuth2 Server 对 OAuth Client 进行了认证,能够确保来 OAuth2 认证服务器获取 access_token 的机器是可信任的,而不是任何一个人拿到 code 之后都能来 OAuth2 认证服务器进行 code 换 token。
如果 code 被黑客获取到,如果他没有 Client Id + Client Secret 也无法使用,就算有,也要和真正的应用服务器竞争,因为 code 一次有效,用后作废,加大了攻击难度。
相反,如果不经过 code 直接返回 access_token 或用户信息,那么一旦泄露就会对用户造成影响。
实际上,Token是安全的,因为它不能被第三方修改,像是内部人员窃取用户的 Access Token 这件事情,是比较难预防的,也算是比较极端的一种情况。
在 OAuth2 协议中,用户登录成功后,OAuth2 认证服务器会将用户的浏览器回调到一个回调地址,并携带一个授权码 code。这个授权码 code 一般有效期十分钟且一次有效,用后作废。这避免了在前端暴露 access_token 或者用户信息的风险,access_token 的有效期都比较长,一般为 1~2 个小时。如果泄露会对用户造成一定影响。
整个过程,授权的目的就是获取访问令牌 access_token,有了 access_token 才能去访问用户受保护资源。但 access_token 存在时效性,当 access_token 失效了,就没有权限访问受保护资源了。那要怎么处理?首先不可能让用户重新走一遍授权流程,用户体验太差;OAuth 是这样做的,在生成访问令牌 access_token 的同时,也会生成一个刷新令牌 refresh_token,在 access_token 失效后会用 refresh_token 获取新的 access_token,注意,refresh_token 只能使用一次,使用后,授权服务会销毁refresh_token 并下发一个新的 refresh_token 给第三方应用。
所以说,解决的方式是适当限制 Access Token 的权限,比如只给内部人员短期密码,使长期未使用的 Access Token 过期失效,在某些重要的 token 上仅允许进行读取权限。
点击此处了解更多行业身份管理
「解决方案」以及「最佳实践案例」