JWT生成token及过期处理方案

JWT生成token及过期处理方案,第1张

业务场景

在前后分离场景下,越来越多的项目使用token作为接口的安全机制,APP端或者WEB端(使用VUE、REACTJS等构建)使用token与后端接口交互,以达到安全的目的。本文结合stackover以及本身项目实践,试图总结出一个通用的,可落地的方案。

基本思路

用户仅登录一次,用户改变密码,则废除token,重新登录

10实现

1登录成功,返回access_token和refresh_token,客户端缓存此两种token;2使用access_token请求接口资源,成功则调用成功;如果token超时,客户端携带refresh_token调用中间件接口获取新的access_token;3中间件接受刷新token的请求后,检查refresh_token是否过期。如过期,拒绝刷新,客户端收到该状态后,跳转到登录页;如未过期,生成新的access_token和refresh_token并返回给客户端(如有可能,让旧的refresh_token失效),客户端携带新的access_token重新调用上面的资源接口。4客户端退出登录或修改密码后,调用中间件注销旧的token(使access_token和refresh_token失效),同时清空客户端的access_token和refresh_toke。

后端表id user_id client_id client_secret refresh_token expire_in create_date del_flag

20实现

场景: access_token访问资源 refresh_token授权访问 设置固定时间X必须重新登录

1登录成功,后台jwt生成access_token(jwt有效期30分钟)和refresh_token(jwt有效期15天),并缓存到redis(hash-key为token,sub-key为手机号,value为设备唯一编号(根据手机号码,可以人工废除全部token,也可以根据sub-key,废除部分设备的token。),设置过期时间为1个月,保证最终所有token都能删除),返回后,客户端缓存此两种token;2使用access_token请求接口资源,校验成功且redis中存在该access_token(未废除)则调用成功;如果token超时,中间件删除access_token(废除);客户端再次携带refresh_token调用中间件接口获取新的access_token;3中间件接受刷新token的请求后,检查refresh_token是否过期。如过期,拒绝刷新,删除refresh_token(废除); 客户端收到该状态后,跳转到登录页;如未过期,检查缓存中是否有refresh_token(是否被废除),如果有,则生成新的access_token并返回给客户端,客户端接着携带新的access_token重新调用上面的资源接口。4客户端退出登录或修改密码后,调用中间件注销旧的token(中间件删除access_token和refresh_token(废除)),同时清空客户端侧的access_token和refresh_toke。5如手机丢失,可以根据手机号人工废除指定用户设备关联的token。6以上3刷新access_token可以增加根据登录时间判断最长X时间必须重新登录,此时则拒绝刷新token。(拒绝的场景:失效,长时间未登录,频繁刷新)

20 变动1登录2登录拦截器3增加刷新access_token接口4退出登录5修改密码

30实现

场景:自动续期 长时间未使用需重新登录

1登录成功,后台jwt生成access_token(jwt有效期30分钟),并缓存到redis(hash-key为access_token,sub-key为手机号,value为设备唯一编号(根据手机号码,可以人工废除全部token),设置access_token过期时间为7天,保证最终所有token都能删除),返回后,客户端缓存此token;

2使用access_token请求接口资源,校验成功且redis中存在该access_token(未废除)则调用成功;如果token超时,中间件删除access_token(废除),同时生成新的access_token并返回。客户端收到新的access_token,再次请求接口资源。

3客户端退出登录或修改密码后,调用中间件注销旧的token(中间件删除access_token(废除)),同时清空客户端侧的access_token。

4以上2 可以增加根据登录时间判断最长X时间必须重新登录,此时则拒绝刷新token。(拒绝的场景:长时间未登录,频繁刷新)

5如手机丢失,可以根据手机号人工废除指定用户设备关联的token。

30 变动

1登录2登录拦截器3退出登录4修改密码

13 场景:token过期重新登录 长时间未使用需重新登录

1登录成功,后台jwt生成access_token(jwt有效期7天),并缓存到redis,key为 "user_id:access_token",value为access_token(根据用户id,可以人工废除指定用户全部token),设置缓存过期时间为7天,保证最终所有token都能删除,请求返回后,客户端缓存此access_token;

2使用access_token请求接口资源,校验成功且redis中存在该access_token(未废除)则调用成功;如果token超时,中间件删除access_token(废除),同时生成新的access_token并返回。客户端收到新的access_token,再次请求接口资源。

3客户端退出登录或修改密码后,调用中间件注销旧的token(中间件删除access_token(废除)),同时清空客户端侧的access_token。

4以上2 可以增加根据登录时间判断最长X时间必须重新登录,此时则拒绝刷新token。(拒绝的场景:长时间未登录,频繁刷新)

5如手机丢失,可以根据手机号人工废除指定用户设备关联的token。

13 变动

1登录2登录拦截器3退出登录4修改密码

20 场景: access_token访问资源 refresh_token授权访问 设置固定时间X必须重新登录

1登录成功,后台jwt生成access_token(jwt有效期30分钟)和refresh_token(jwt有效期15天),并缓

存到redis(hash-key为token,sub-key为手机号,value为设备唯一编号(根据手机号码,可以人工废除全

部token,也可以根据sub-key,废除部分设备的token。),设置过期时间为1个月,保证最终所有token都

能删除),返回后,客户端缓存此两种token;

2使用access_token请求接口资源,校验成功且redis中存在该access_token(未废除)则调用成功;如果

token超时,中间件删除access_token(废除);客户端再次携带refresh_token调用中间件接口获取新的

access_token;

3中间件接受刷新token的请求后,检查refresh_token是否过期。

如过期,拒绝刷新,删除refresh_token(废除); 客户端收到该状态后,跳转到登录页;

如未过期,检查缓存中是否有refresh_token(是否被废除),如果有,则生成新的access_token并返回给

客户端,客户端接着携带新的access_token重新调用上面的资源接口。

4客户端退出登录或修改密码后,调用中间件注销旧的token(中间件删除access_token和refresh_token(

废除)),同时清空客户端侧的access_token和refresh_toke。

5如手机丢失,可以根据手机号人工废除指定用户设备关联的token。

6以上3刷新access_token可以增加根据登录时间判断最长X时间必须重新登录,此时则拒绝刷新token。(

拒绝的场景:失效,长时间未登录,频繁刷新)

20 变动

1登录

2登录拦截器

3增加刷新access_token接口

4退出登录

5修改密码

30 场景:自动续期 长时间未使用需重新登录

1登录成功,后台jwt生成access_token(jwt有效期30分钟),并缓存到redis(hash-key为

access_token,sub-key为手机号,value为设备唯一编号(根据手机号码,可以人工废除全部token,也可以

根据sub-key,废除部分设备的token。),设置access_token过期时间为1个月,保证最终所有token都能删

除),返回后,客户端缓存此token;

2使用access_token请求接口资源,校验成功且redis中存在该access_token(未废除)则调用成功;如果

token超时,中间件删除access_token(废除),同时生成新的access_token并返回。客户端收到新的

access_token,

再次请求接口资源。

3客户端退出登录或修改密码后,调用中间件注销旧的token(中间件删除access_token(废除)),同时清

空客户端侧的access_token。

4以上2 可以增加根据登录时间判断最长X时间必须重新登录,此时则拒绝刷新token。(拒绝的场景:长

时间未登录,频繁刷新)

5如手机丢失,可以根据手机号人工废除指定用户设备关联的token。

30 变动

1登录

2登录拦截器

3退出登录

4修改密码

40 场景:token过期重新登录 长时间未使用需重新登录

1登录成功,后台jwt生成access_token(jwt有效期7天),并缓存到redis,key为

"user_id:access_token" + 用户id,value为access_token(根据用户id,可以人工废除指定用户全部

token),设置缓存过期时间为7天,保证最终所有token都能删除,请求返回后,客户端缓存此

access_token;

2使用access_token请求接口资源,校验成功且redis中存在该access_token(未废除)则调用成功;如果

token超时,中间件删除access_token(废除),同时生成新的access_token并返回。客户端收到新的

access_token,

再次请求接口资源。

3客户端退出登录或修改密码后,调用中间件注销旧的token(中间件删除access_token(废除)),同时清

空客户端侧的access_token。

4以上2 可以增加根据登录时间判断最长X时间必须重新登录,此时则拒绝刷新token。(拒绝的场景:长

时间未登录,频繁刷新)

5如手机丢失,可以根据手机号人工废除指定用户设备关联的token。

40 变动

1登录

2登录拦截器

3退出登录

4修改密码

最终实现

后端

-在登录状态下因登录时间过长,或者因被挤下线导出再次获取token而提示token失效

后端定义登录失效的错误码为 code 300 ,于是在axios拦截途中进行判断,一旦失效便删除sessionStorage中储存的token,并提示并跳转至登录页(Login)

以上就是关于JWT生成token及过期处理方案全部的内容,包括:JWT生成token及过期处理方案、解决Token失效问题、等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址:https://www.54852.com/web/9680923.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-04-30
下一篇2023-04-30

发表评论

登录后才能评论

评论列表(0条)

    保存