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

单个token

token(A)过期设置为15分钟

前端发起请求,后端验证token(A)是否过期;如果过期,前端发起刷新token请求,后端设置已再次授权标记为true,请求成功

前端发起请求,后端验证再次授权标记,如果已经再次授权,则拒绝刷新token的请求,请求成功

如果前端每隔72小时,必须重新登录,后端检查用户最后一次登录日期,如超过72小时,则拒绝刷新token的请求,请求失败

授权token加上刷新token

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

1.0实现

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

2.0实现

场景: 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作为接口的安全机制,APP端或者WEB端(使用VUE、REACTJS等构建)使用token与后端接口交互,以达到安全的目的。本文结合stackoverflow以及本身项目实践,试图总结出一个通用的,可落地的方案。基本思路单个tokentoken(A)过期设置为15分钟前端发起请求,后端验证token(A)是否过期;如果过期,前端发起刷新toke... cookie 服务器给一个用户开辟出来的一段内存空间用于保存这次会话的一些内容,如果浏览器不支持Cookie(如大部分手机中的浏览器)或者把Cookie禁用了,Cookie功能就会失效 token 客户端收到 ... 2.之后访问登录接口,取到返回的 token 值 3.把 token 值加到headers中(注意:headers中记录 token 值的名称不一定是 token ,也有可能是其他的名称) 4.访问其他接口
可以使用 `flask_ jwt _extended` 提供的 `create_access_ token ` 函数 生成 新的 token ,同时使用 ` jwt _manager` 提供的 ` jwt _manager._set_blacklist_revoked_ token _callback` 函数将旧的 token 加入黑名单并销毁。具体代码如下: ``` python from flask_ jwt _extended import create_access_ token , jwt _manager # 生成 新的 token new_ token = create_access_ token (identity=user_id) # 将旧的 token 加入黑名单并销毁 @ jwt _manager._set_blacklist_revoked_ token _callback def revoke_ token _callback(jti, *args, **kwargs): blacklist.add(jti) revoke_ token _callback(old_ token ["jti"]) 其中,`blacklist` 可以是一个 set,用于存储已经被销毁的 token 的 jti。