如果单个用户尝试在不同的浏览器上登录,是否可以避免单个用户生成多个令牌?

时间:2018-12-26 08:25:42

标签: django django-rest-framework django-rest-framework-jwt

我在后端使用django-rest-framework-jwt,并从Angular Project调用API。 当用户尝试在多个浏览器上登录时,每次在新浏览器上为该用户生成一个新令牌。每个令牌都是有效的。 我想要的是,当用户已经在一个浏览器中登录并且他/她尝试在第二个不同的浏览器上登录时,第一个浏览器的先前令牌应该无效。

1 个答案:

答案 0 :(得分:1)

简单地说,,除非您在django-rest-framework-jwt模块中做了一些改动,否则您就不能避免生成令牌。但这不再是纯粹的jwt。

  

JWT代表JSON Web令牌,它是一种在计算机系统之间交换数据的机制,恰好方便于生成可用于在Web应用程序中实现无状态身份验证的授权标头。

SO

  

无状态意味着您不跟踪用户令牌,只需验证它们即可。如果令牌有效且有效载荷有效,则确定。它不在乎生成了多少令牌,也不在乎它们与一个用户相关。令牌是根据时间戳创建的,并将与令牌的生存期和时间戳进行比较。

这意味着django rest jwt模块将在用户请求时根据当前系统时间戳创建令牌。

  

请记住,您无法删除jwt令牌。因为它没有存储在数据库中。因此,如果您的令牌被欺骗,仅此而已。除非令牌的生命周期结束且令牌到期,否则您将无法执行任何操作。

如果您想跟踪这些令牌并能够控制它们,例如不要按照您的要求为用户创建冗余令牌:

  • 考虑更改为另一个基于令牌的身份验证,该身份验证将令牌存储在数据库中,以便您可以跟踪它。

  • 将jwt系统更改为适合您的系统(我之前做过)。例如,在数据库中添加一个查找ID,并按与每个用户绑定的令牌来检查令牌。我知道它不再是jwt了,但是您仍然可以使用它的一些优点。就像不要在无效的jwt令牌上访问数据库并在其中存储一些有效负载,如果经过验证,则不要在数据库中获取该信息。像权限和...