flask_jwt 如何实现用户注销
问题描述
登录使用的flask_jwt封装好的login,获取当前用户信息用的以下代码,但是不知道如何实现注销用户
问题出现的环境背景及自己尝试过哪些方法
相关代码
// 请把代码文本粘贴到下方(请勿用图片代替代码)
# jwt代码
user_info_dao = UserInfoDao()
jwt = JWT(app, user_info_dao.authenticate, user_info_dao.identity)
from flask_jwt import jwt_required, current_identity
# 获取当前用户信息用的以下代码
@bp_auth.route('/getuser',methods=['GET'])
@jwt_required()
def get_user_info():
user_info = current_identity.to_dict()
return json_result(True, u'获取当前用户信息成功',user_info)
你期待的结果是什么?实际看到的错误信息又是什么?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
不好意思~ jwt是不支持主动使用户token过期的。
要知道用户登录身份的校验,基本就两种:
①客户端存储一个随机串,发送请求时携带该串。服务器接收到之后拿着这个串去存储中做比对,找到对应的数据。
②将所有数据都存储到客户端。这样就有会安全问题,因为服务器无法确定那些数据是有效的,那些数据是伪造的。所以就引入了签名的概念。用算法的方式来保证数据的可信性。
早期的网站基本就一个主站,也没有分布式的部署。所以多数都采用第一种方式。
但随着访问量的增加,开始做分布式,就涉及到了session共享的问题。比如①中的存储,使用redis来达到共享数据的效果。但是这样会在服务器中存储大量的数据。
然后呢,就出来另外一种。不在服务器存储数据。其中一个就是jwt。
jwt在生成时,可以设置有效期。理论上 一个用户可以产生无数个jwt,且jwt的有效期独立。
如果你想将一个还在有效期内的jwt置为无效,那就必须要在服务器存储数据,这就违背了他的设计原则~
其实。他的退出,就是客户端主动将jwt扔掉(假设不会被其他人捡到)
~~~~~ 那么这个jwt不就不存在了吗~ 这不就完成注销功能了吗~注销操作取决于你客户端如何存放 jwt 信息。使用 jwt 的一个重要思想是用户状态由客户端维持,目的是为了服务器的横向扩展。
客户端 jwt 的存放有很多地方,cookie、local storage、session storage, 甚至是 IndexedDB、Web SQL,如果是单页面应用,放内存也是 ok 的(不过那就要保证用户别手滑刷新页面了,额~)。当然因为 jwt 是敏感信息,所以,最好是放在 cookie 里,并且设置成 js 无法访问。
如果存放的地点是 js 能访问的,那么 so easy ,将 jwt 设成 none,也就是注销了。
如果是拒绝 js 访问的 cookie,那么就需要服务器返回的 response 里面带上特定的 header,以删除该 cookie。
另: 楼上说的 jwt 不支持主动注销的说法是不全面的。我猜测楼上的意思是,根据状态保持机制的不同,有些注销操作是根本不需要服务器端的参与的。
其实可以换个思路,把失效的token存储在redis中
用户主动注销或者修改密码后,顺便将之前的token传回服务器,服务器将过期的token存储在redis中,设置本条数据过期时间为旧token的过期时间(也就是当本条数据过期的时候旧的token本身也就过期了,下次就不在拦截了);
然后下次请求的时候先查询一下当前token是否在redis中,如果是就拒绝访问并让其重新授权;