长短token实现自动续期
#实现自动登录
JWT Token
设置有效期,一旦失效用户就要重新登录,这样的体验非常差,需要做到用户在无感知的情况下,解决如何刷新Token的问题
JWT Token
- iss: jwt签发者
- sub: jwt所面向的用户
- aud: 接收jwt的一方
- exp: jwt的过期时间,这个过期时间必须要大于签发时间
- nbf: 定义在什么时间之前,该jwt都是不可用的.
- iat: jwt的签发时间
- jti: jwt的唯一身份标识,主要用来作为一次性
token
,从而回避重放攻击。
据所知,微信方案如下:
在第一次用账号密码登录服务器会返回两个 token
,时效长短不一样。短的时效过了之后,发送时效长的 token
重新获取一个短时效,如果都过期,就需要重新登录了长的token
是一个月,短的是2小时
token刷新方案
登录后服务端返回两个token
(请求资源token
,刷新token
。前者时间短,比如1天,后者时间长,7天)。
资源token
用于资源接口请求,刷新token
用于请求刷新token
。实现首次登录后免登,和token
刷新机制。
token命名方式
token
(用于一般的资源请求)refreshToken
(用于请求刷新token
,返回两个新的token
(短和长))
项目介绍
项目地址:github地址
本项目是使用 go mod
方式,因此需要设置好对应的环境变量和代理。设置好后,在项目根目录直接 go build
。
测试步骤:
- 0、配置好自己的
ip,port
和mysql
等参数(config.yaml
) - 1、创建数据库和建表(使用
create.sql
脚本。在于script
目录) - 2、测试时修改
config.yaml
的两个时间(shortTime
和 `longTime1),比如短的10s,长的30s。 - 3、调用
register
接口注册账号 - 4、调用
login
接口登录 - 5、根据
login
得到的token
,调用comment
接口评论 - 6、等待
shortTime
后,token
失效,使用refreshtoken
接口再次得到token
和refreshToken
。 - 7、若
refreshToken
过期失效,再次调用login
接口登录得到token
和refreshToken
。
调用逻辑
注册账号
[POST] http://172.16.0.66:8099/v1/user/register
请求:
{
"username":"laingjf",
"password":"123456"
}
返回:
{
"code": 1,
"message": "OK",
"data": {
"uuid": "5e4eb0f2453343e98919b930d8fcee52"
}
}
登录
[POST] http://172.16.0.66:8099/v1/user/login
请求:
{
"username":"laingjf",
"password":"123456"
}
返回:
{
"code": 1,
"message": "OK",
"data": {
"token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE1NjY5NzA5NDcsImlhdCI6MTU2Njk3MDkyNywiaWQiOjEsIm5iZiI6MTU2Njk3MDkyNywidXNlcm5hbWUiOiJsYWluZ2pmIn0.pB5-TERuhSLogg-kdarK5J29LedfZJutaWi9IxeECs0",
"refreshToken": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE1NjY5NzA5ODcsImlhdCI6MTU2Njk3MDkyNywiaWQiOjEsIm5iZiI6MTU2Njk3MDkyNywidXNlcm5hbWUiOiJsYWluZ2pmIn0.YkMm-a5Krp9b4Hsgxpod0y7KrLGMJJPlqkj83SKefmQ"
}
}
评论服务
[POST] http://172.16.0.66:8099/v1/service/comment
headers Authorization :Bearer token
请求:
{
"topic_id":10,
"topic_type":"sport",
"content":"我来评论了,你好帅啊",
"from_uid":1
}
返回:
{
"code": 1,
"message": "OK",
"data": null
}
刷新过期token
[POST] http://172.16.0.66:8099/v1/base/refreshtoken
headers Authorization :Bearer refreshToken
请求:
{
"code": 1,
"message": "OK",
"data": {
"token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE1NjY5NzA5NDcsImlhdCI6MTU2Njk3MDkyNywiaWQiOjEsIm5iZiI6MTU2Njk3MDkyNywidXNlcm5hbWUiOiJsYWluZ2pmIn0.pB5-TERuhSLogg-kdarK5J29LedfZJutaWi9IxeECs0",
"refreshToken": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE1NjY5NzA5ODcsImlhdCI6MTU2Njk3MDkyNywiaWQiOjEsIm5iZiI6MTU2Njk3MDkyNywidXNlcm5hbWUiOiJsYWluZ2pmIn0.YkMm-a5Krp9b4Hsgxpod0y7KrLGMJJPlqkj83SKefmQ"
}
}