flask_jwt 如何实现用户注销

发布于 2022-09-07 19:51:41 字数 565 浏览 18 评论 0

问题描述

登录使用的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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

荒岛晴空 2022-09-14 19:51:41

不好意思~ jwt是不支持主动使用户token过期的。

要知道用户登录身份的校验,基本就两种:

①客户端存储一个随机串,发送请求时携带该串。服务器接收到之后拿着这个串去存储中做比对,找到对应的数据。

②将所有数据都存储到客户端。这样就有会安全问题,因为服务器无法确定那些数据是有效的,那些数据是伪造的。所以就引入了签名的概念。用算法的方式来保证数据的可信性。

早期的网站基本就一个主站,也没有分布式的部署。所以多数都采用第一种方式。
但随着访问量的增加,开始做分布式,就涉及到了session共享的问题。比如①中的存储,使用redis来达到共享数据的效果。但是这样会在服务器中存储大量的数据。

然后呢,就出来另外一种。不在服务器存储数据。其中一个就是jwt。
jwt在生成时,可以设置有效期。理论上 一个用户可以产生无数个jwt,且jwt的有效期独立。

如果你想将一个还在有效期内的jwt置为无效,那就必须要在服务器存储数据,这就违背了他的设计原则~

其实。他的退出,就是客户端主动将jwt扔掉(假设不会被其他人捡到)~~~~~ 那么这个jwt不就不存在了吗~ 这不就完成注销功能了吗~

旧时模样 2022-09-14 19:51:41

注销操作取决于你客户端如何存放 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 不支持主动注销的说法是不全面的。我猜测楼上的意思是,根据状态保持机制的不同,有些注销操作是根本不需要服务器端的参与的。

情愿 2022-09-14 19:51:41

其实可以换个思路,把失效的token存储在redis中

用户主动注销或者修改密码后,顺便将之前的token传回服务器,服务器将过期的token存储在redis中,设置本条数据过期时间为旧token的过期时间(也就是当本条数据过期的时候旧的token本身也就过期了,下次就不在拦截了);

然后下次请求的时候先查询一下当前token是否在redis中,如果是就拒绝访问并让其重新授权;

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文