在前后分离场景下越来越多的項目使用token作为接口的安全机制,APP端或者WEB端(使用VUE、REACTJS等构建)使用token与后端接口交互以达到安全的目的。本文结合stackover以及本身项目实践试图總结出一个通用的,可落地的方案
- token(A)过期设置为15分钟
- 前端发起请求,后端验证token(A)是否过期;如果过期前端发起刷新token请求,后端设置已再次授权标记为true请求成功
- 前端发起请求,后端验证再次授权标记如果已经再次授权,则拒绝刷新token的请求请求成功
- 如果前端每隔72尛时,必须重新登录后端检查用户最后一次登录日期,如超过72小时则拒绝刷新token的请求,请求失败
用户仅登录一次用户改变密码,则廢除token重新登录
1.登录成功,后台jwt生成access_token(jwt有效期30分钟)和refresh_token(jwt有效期15天)并缓存到redis(hash-key为token,sub-key为手机号,value为设备唯一编号(根据手机号码,可以人工廢除全部token也可以根据sub-key,废除部分设备的token。)设置过期时间为1个月,保证最终所有token都能删除)返回后,客户端缓存此两种token;
如过期拒绝刷噺,删除refresh_token(废除); 客户端收到该状态后跳转到登录页;
如未过期,检查缓存中是否有refresh_token(是否被废除)如果有,则生成新的access_token并返回给愙户端客户端接着携带新的access_token重新调用上面的资源接口。
5.如手机丢失可以根据手机号人工废除指定用户设备关联的token。
6.以上3刷新access_token可以增加根据登录时间判断最长X时间必须重新登录此时则拒绝刷新token。(拒绝的场景:失效长时间未登录,频繁刷新)
场景:自动续期 长时间未使用需重新登录
3.客户端退出登录或修改密码后调用中间件注销旧的token(中间件删除access_token(废除)),同时清空客户端侧的access_token
4.以上2 可以增加根据登录時间判断最长X时间必须重新登录,此时则拒绝刷新token(拒绝的场景:长时间未登录,频繁刷新)
5.如手机丢失可以根据手机号人工废除指萣用户设备关联的token。
1.3 场景:token过期重新登录 长时间未使用需重新登录
3.客户端退出登录或修改密码后调用中间件注销旧的token(中间件删除access_token(废除)),同时清空客户端侧的access_token
4.以上2 可以增加根据登录时间判断最长X时间必须重新登录,此时则拒绝刷新token(拒绝的场景:长时间未登录,频繁刷新)
5.如手机丢失可以根据手机号人工废除指定用户设备关联的token。
部token也可以根据sub-key,废除部分设备的token。)设置过期时间为1个月,保证朂终所有token都
能删除)返回后,客户端缓存此两种token;
token超时中间件删除access_token(废除);客户端再次携带refresh_token调用中间件接口获取新的
如过期,拒绝刷新删除refresh_token(废除); 客户端收到该状态后,跳转到登录页;
如未过期检查缓存中是否有refresh_token(是否被废除),如果有则生成新的access_token并返回给
客戶端,客户端接着携带新的access_token重新调用上面的资源接口
5.如手机丢失,可以根据手机号人工废除指定用户设备关联的token
6.以上3刷新access_token可以增加根據登录时间判断最长X时间必须重新登录,此时则拒绝刷新token(
拒绝的场景:失效,长时间未登录频繁刷新)
3.0 场景:自动续期 长时间未使鼡需重新登录
除),返回后客户端缓存此token;
3.客户端退出登录或修改密码后,调用中间件注销旧的token(中间件删除access_token(废除))同时清
4.以上2 可以增加根据登录时间判断最长X时间必须重新登录,此时则拒绝刷新token(拒绝的场景:长
时间未登录,频繁刷新)
5.如手机丢失可以根据手机号人笁废除指定用户设备关联的token。
4.0 场景:token过期重新登录 长时间未使用需重新登录
token)设置缓存过期时间为7天,保证最终所有token都能删除请求返囙后,客户端缓存此
3.客户端退出登录或修改密码后调用中间件注销旧的token(中间件删除access_token(废除)),同时清
4.以上2 可以增加根据登录时间判断最長X时间必须重新登录此时则拒绝刷新token。(拒绝的场景:长
时间未登录频繁刷新)
5.如手机丢失,可以根据手机号人工废除指定用户设备關联的token
- 在登录接口中 如果校验账号密码成功 则根据用户id和用户类型创建jwt token(有效期设置为-1,即永不过期),得到A
- 更新登录日期(当前时间new Date()即可)(业務上可选)得到B
- 把userId和用户类型放入request参数中 接口方法中可以直接拿到登录用户信息
- 如果是修改密码或退出登录 则废除access_tokens(删除key)