使用JWT格式的accessToken和refreshToken来实现身份的认证
流程:
- 验证用户名密码
- 生成access_token(有效期2小时)和refresh_token(有效期30天,服务端存储)
- 客户端请求时带上access_token,refresh_token保存到本地(web 应用setcookie(),httpOnly的,App保存到本地缓存)
- 服务端判断access_token过期时返回401
- 客户端发送refresh_token获取新的access_token,保存access_token,重放请求失败的接口
refresh_token解决的问题:
- access_token失效后,可以无需用户重新登录即可生成新的access_token
- refresh_token是可控的,可以删除非法的refresh_token
表结构:
CREATE TABLE `user` (
`id` int NOT NULL AUTO_INCREMENT,
`username` varchar(30) NOT NULL,
`nickname` varchar(30) NOT NULL,
`password` varchar(255) NOT NULL,
`avatar` varchar(255) NOT NULL DEFAULT '',
`created_at` datetime NOT NULL,
`updated_at` datetime NOT NULL,
PRIMARY KEY (`id`),
KEY `username` (`username`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
CREATE TABLE `user_refresh_token` (
`id` int unsigned NOT NULL AUTO_INCREMENT,
`user_id` int unsigned NOT NULL,
`refresh_token` char(40) NOT NULL,
`user_ip` varchar(50) NOT NULL,
`user_agent` varchar(1000) NOT NULL,
`created_at` datetime NOT NULL,
`updated_at` datetime NOT NULL,
PRIMARY KEY (`id`),
KEY `user_id` (`user_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
参考