这是我参与「第五届青训营 」伴学笔记创作活动的第 11 天,记录一下对 token 认证相关知识的学习。
什么是 token
Token 是服务端生成的一个字符串,作为客户端进行请求的令牌。当首次登录后,服务器生成一个 token 并返回给客户端,以后客户端只需携带这个 token 前来请求数据即可,无需再携带用户名和密码。
单 token 认证
流程
-
首次登录,使用账号密码,服务端进行验证,如果验证通过,则创建一个 token 并返回给客户端,在客户端进行储存,该 token 会设置一个有效时长。
-
在后续请求中携带该 token。
- 如果 token 没有过期,则正常返回数据。
- 如果 token 过期,则返回 token 过期的错误信息,客户端跳转到登录界面要求用户登录。
存在的问题
假如 token 的有效期为2小时,在这段时间里,用户一直在使用客户端,然而2小时后却突然要求用户重新登陆才能正常使用,这会严重影响用户的体验,是不合理的。
单纯延长 token 的有效时长会让安全性降低,不是一个好的办法,也不能从根本上解决问题。
这里使用两个简单的概念:活跃用户和非活跃用户。顾名思义,活跃用户就是持续使用客户端的用户,非活跃用户就是已经很久不使用客户端的用户。
一方面,从用户体验上来说,我们并不希望活跃用户重新登录;另一方面,从安全性上来说,我们应该要求非活跃用户重新登陆。
为了解决这一问题,便出现了双 token 的认证方式。
双 token 认证
流程
-
首次登录,使用账号密码,服务端进行验证,如果验证通过,则创建两个 token 并返回给客户端。一个是有效时长较短的 access token,另一个是有效时长较长的 refresh token。
-
在后续请求中携带 access token。
-
如果 access token 没有过期,则正常返回数据。
-
如果 access token 过期,则使用 refresh token 请求刷新 access token。
- 如果 refresh token 没有过期,则返回一个新的 access token 给客户端,客户端使用新的 access token 请求数据。
- 如果 refresh token 过期,则返回 token 过期的错误信息,客户端跳转到登录界面要求用户登录。
-
分析
使用 refresh token 区分活跃用户和非活跃用户,既提升了用户体验,也提升了安全性。