原登录方式:单Token验证
操作步骤:
-
用户登录: 用户在客户端输入用户名和密码,然后将这些信息发送给服务器。
-
验证用户信息: 服务器接收到请求后,会首先验证用户提供的用户名和密码是否正确。
-
生成JWT: 如果服务器验证用户信息正确,会采用一个签名算法(比如HMAC SHA256或RSA)结合一个只有服务器知道的密钥,生成JWT。JWT的载荷(Payload)部分通常会包含用户的一些信息,例如用户ID,以标识用户身份。
-
发送JWT: 服务器将新生成的JWT在响应中返回给客户端。
-
存储JWT: 客户端在收到包含JWT的响应后,会把JWT存储在本地,比如说保存进Cookie或者localStorage。
-
发送请求: 之后客户端每次向服务器发送请求时,都会将这个JWT放在请求头的Authorization字段中发送给服务器。
-
验证JWT: 服务器在收到请求后,会解码JWT,然后使用保存的密钥验证签名。如果签名验证通过,说明请求是由该用户发起的,服务器就会返回请求的数据。如果验证失败,服务器会拒绝请求,并返回一个错误响应。
可能存在的问题:
1. 用户在退出登录以后,如果Token还在有效期内,那么用户依然可以操作,但这是不允许的。
2. 用户还在登录状态中,但是Token的有效期过了,则用户没法继续操作,会给用户带来较差的体验。
解决方法:双Token实现登录升级(登录续签)
-
用户登录: 用户使用用户名和密码登录时,服务端验证凭据有效性,然后会设置一个Access Token和一个Refresh Token。
-
生成 Token: Access Token中包含了必要的数据(例如用户ID),这个Token具有较短的有效期,例如15分钟。Refresh Token通常设置得更长,例如14天,并且会被存储在数据库中以跟踪它的有效性。
-
发送 Token: 服务端将生成的Access Token和Refresh Token都发回给客户端。客户端通常将Access Token存储在内存中,并将Refresh Token存储在安全的地方(比如httpOnly的cookie或本地存储)。
-
使用 Access Token: 客户端在后续的每次请求时,都会在请求头中添加Access Token。服务端收到此请求后,会验证Token,如果有效,就处理此请求,否则,返回一个错误信息。
-
Access Token 过期: 当Access Token过期了,任何试图使用这个过期Token的请求都会得到一个错误响应,提示Token已过期。
-
使用 Refresh Token: 如果客户端收到一个提示Access Token过期的错误响应,那么它会使用前面存储的Refresh Token,发送到一个特殊的端点来获取新的Access Token。
-
验证和生成新的 Access Token: 当服务端收到Refresh Token后,会验证其有效性(通常要查找数据库并确保它还没有被废止)。如果Refresh Token仍然有效,那么服务端就会生成一个新的Access Token,然后发送给客户端。
重写接口
1. 登录接口:返回双Token
创建新数据库表,存放刷新Token : id,userid,refreshtoken,time
先删除原有刷新Token,再将刷新Token保存到数据库中,
2. 退出登录接口:
删除刷新Token
3. 刷新Token接口:返回新的接入Token