面试题答案
一键面试1. 生成刷新令牌
- 生成时机:当用户首次成功进行身份验证(例如登录)时,除了返回访问令牌,同时生成刷新令牌。此外,当访问令牌过期时,若存在有效的刷新令牌,也可能重新生成一个新的刷新令牌(可选,不同策略不同)。
- 生成方式:通常使用安全的随机数生成算法生成一个足够长且难以预测的字符串作为刷新令牌。例如,在Python中可以使用
os.urandom
函数生成随机字节序列,再将其转换为合适的字符串格式(如Base64编码)。
2. 存储刷新令牌
- 存储位置:
- 数据库:可以将刷新令牌与用户信息关联存储在关系型数据库(如MySQL、PostgreSQL)或非关系型数据库(如MongoDB)中。例如在MySQL中创建一张表,包含用户标识(如user_id)、刷新令牌字段以及其他相关信息(如过期时间等)。
- 缓存:为了提高读取性能,也可将刷新令牌临时存储在缓存系统(如Redis)中,这样在验证刷新令牌时能快速获取。但需注意缓存数据的有效期设置,避免数据丢失。
- 存储安全:对存储的刷新令牌进行加密处理,防止泄露后被直接使用。可以使用对称加密算法(如AES)或非对称加密算法(如RSA)对令牌加密后再存储。
3. 使用刷新令牌获取新的访问令牌
- 接收请求:后端服务接收到客户端携带刷新令牌的请求,通常该请求会发送到专门的用于刷新令牌的API端点。
- 验证令牌:从存储中检索刷新令牌并验证其有效性。检查刷新令牌是否存在、是否过期(如果设置了过期时间)以及是否与请求的用户相关联。例如在数据库中查询对应的刷新令牌记录,若记录存在且未过期则验证通过。
- 生成新访问令牌:如果刷新令牌验证成功,生成新的访问令牌。生成方式与首次生成访问令牌类似,使用安全的算法生成随机字符串。同时,可以选择是否生成新的刷新令牌替换旧的(如采用滚动刷新策略)。
- 返回结果:将新生成的访问令牌返回给客户端,客户端即可使用新的访问令牌进行后续需要身份验证的操作。