Access Token 与 Refresh Token
access token 是在 Oauth2.0 协议中,客户端访问资源服务器的令牌(其实就是一段全局唯一的随机字符串)。拥有这个令牌代表着得到用户的授权。它里面包含哪些信息呢?答案是:
哪个用户 在什么时候 授权给哪个客户端 去做什么事情
对于不想知道原理,只想知道怎么使用 access token 的读者,请看 Access Token 机制详解
对于想要从原理上了解 Oauth2.0 的读者,请看 简单介绍 Oauth2.0 原理
这些信息,从 access token 本身是看不出来的。鉴权服务器上有一套 token 管理模块,会在存储系统中存放这些信息。
这个 access token 是临时的,有一定有效期。这是因为,access token 在使用的过程中可能会泄露。给 access token 限定一个较短的有效期可以降低因 access token 泄露而带来的风险。
然而引入了有效期之后,使用起来就不那么方便了,因为每当 access token 过期,使用方就必须获取新的 access token。怎么获取呢?那就是重新授权,也就是要打开鉴权页面。这样用户可能每隔几天,甚至每天都需要进行授权操作。这是一件非常影响用户体验的事情。希望有一种方法,可以避免这种情况。
于是 Oauth2.0 引入了 refresh token 机制。当鉴权服务器发送 access token 给使用方时,同时也发送一个 refresh token。 这个 refresh token 的有效期很长,作用是可以用来刷新 access token。鉴权服务器提供一个刷新接口,例如:
POST /refresh
参数: refreshtoken
返回:新的 access token
注:这个例子仅限于说明,实际当中获取 access token 和刷新 access token 是同一个接口,不会单独为刷新 access token 做一个接口
传入 refresh token,鉴权服务器验证 refresh token 是合法的之后,返回一个新的 access token。这样,当 access token 过期后,使用方就使用 refresh token 来获取一个新的 access token。
问题来了,这样做难道不会破坏安全性吗?前面说 access token 可能会泄漏,于是设置较短的有效期,可是现在又同时给一个 refresh token,那 refresh token 是怎么保证安全的呢?
答案是,为了 refresh token 的安全,Oauth2.0 要求,refresh token 一定要保存在使用方的服务器上,而绝不能存放在移动 app、PC端软件、浏览器上,也不能在网络上随便传递。调用 refresh 接口的时候,一定是从使用方服务器到鉴权服务器的 https 访问。所以,refresh token 比 access token 隐蔽得多,也安全得多。当然,这需要使用方正确的遵守 Oauth2.0 的要求。
若有疑问,可以直接评论。