当前位置: 首页 > 知识库问答 >
问题:

JWT 令牌登录和注销

陈知
2023-03-14

嗨,我正在创建使用 REST API endpoint与服务器端通信的移动本机应用程序。
我以前有开发本机客户端的经验,但我将简单的令牌(随机生成的字符串)存储在存储用户信息的同一表中的数据库中。所以它就像浏览器中使用的会话,但每个请求的标头中都有令牌,而不是 cookie。

最近我发现了JWT令牌。这似乎是保护私有endpoint的好方法。您可以从移动客户端请求令牌,前提是您通过登录并获得生成的令牌作为响应。
但最重要的是,此令牌不存储在服务器上的任何地方,服务器使用秘密字验证令牌,这对服务器来说是私有的,就像私钥一样。
这对于安全endpoint来说没问题,但是如果我需要用户会话该怎么办,例如Facebook、Amazon、速卖通等应用程序如何工作,他们可以在不提供凭据的情况下使用应用程序,只需在商店中导航,但当用户不想购买时需要登录。在用户会话保留一段时间后。这可以用JWT令牌实现,没有任何问题,但是当用户需要注销时,在这种情况下该怎么办?令牌没有存储在服务器上的任何地方,那么我如何销毁这个令牌,使其无效?

如果token存储在数据库中,API就不会像REST API那样是无状态的。所以一般来说,在无状态API中没有办法保持用户登录,对吗?

我有一些如何使用 JWT 令牌实现这一点的想法,但据我了解,这不会是无状态 API。

  1. 创建过期令牌列表
  2. 将JWT令牌存储在数据库中,但在这种情况下,如果将自描述令牌(JWT)存储在数据库,它的目的是什么,正如我所知,JWT标记的主要思想是用令牌保存所有信息

请建议在这种情况下最好的方法是什么,如果我弄错了,请纠正我。
谢谢。

共有3个答案

郎刚捷
2023-03-14

我是如何做到的:

当用户注册时,我生成一个随机id(我称之为验证码)并存储在数据库中,用jwt编码。

每当使用 jwt 发出任何请求时,我都会检查验证代码,如果它是正确的:授予访问权限。

为了在更改密码后使会话过期,我更改了DB中的验证代码。

狄灵均
2023-03-14

JWT身份验证基本上发生在客户端和服务器端。

当用户发送用户名和密码进行身份验证时。它与数据库进行了检查,如果有效,将生成一个joken并发送回用户。有多个API用于生成JWT令牌,您可以查看http://jwt.io/

一旦令牌被生成并发送回,它需要与每个请求中的header一起发送,并且需要在将API返回给用户之前在服务器端进行验证。

没有必要存储令牌,因为API本身将允许您在服务器端对其进行解码。

孔深
2023-03-14

如果您使用的是 JWT,则无法具有服务器端状态,以便在不破坏使用 JWT 的目的的情况下正确注销用户。如果要执行此操作,最好的选择是将上次注销日期存储在数据库和JWT中,如果这些日期与您注销用户不匹配(在这种情况下不更新日期)。但是,您现在具有服务器端状态。

不过,将注销的令牌存储在数据库中似乎有些多余。

另一种选择是,您可以生成一个由CSPRNG生成的128位令牌,使用SHA-256将它存储在数据库中,然后在web令牌中使用未哈希的值。这样你可以简单地删除条目,以便注销用户服务器端。这是更安全的选项,因为您现在有办法在服务器上正确终止令牌和会话。如果一个用户更改了他们的密码,或者想要通过注销其他会话来保护他们的帐户,现在你有一种方法可以做到这一点。

 类似资料:
  • 我尝试用angular2前端实现jwt令牌。当我尝试使用Postman接收带有post方法的令牌时,我接收到授权令牌,但在Angular中这样做返回空响应对象。这里是我使用的Angular服务的代码片段。 问题是,当我尝试记录时,令牌是空的,与响应相同。对于代码的后端部分,我遵循了jwt令牌的这个实现。

  • 我有一个关于JWT的SSO流的简单问题 假设我们有单独的授权服务器,它为客户端应用程序/服务器和资源服务器提供JWT,客户端尝试使用该令牌访问该服务器。 问题是,资源服务器应该自己验证令牌(例如,与Auth server共享私有证书),还是应该请求Auth server为每个客户端请求验证JWT?

  • 在服务器上验证令牌的正确方法是什么? 我正在我的应用程序中使用jwt令牌机制,下面是它目前的工作方式: null null

  • 我正在构建一个使用JWT进行身份验证的应用程序。我开始做一些研究,但对于诸如刷新令牌和令牌存储之类的主题缺乏共识,我感到惊讶。 据我所知,JWT和OAuth是两个不同的协议,它们遵循不同的规范。 但我的问题是,对于一个没有通过第三方资源服务器如Google、Facebook等认证的应用程序,有一个刷新令牌真的有用吗?为什么不让JWT令牌像刷新令牌一样持续时间长。 另一方面,我可以看到,如本文所述,

  • 这是我的身份验证流程: 用户登录后收到两个令牌(具有过期时间的访问令牌和没有过期时间的刷新令牌) 对于每个用户,刷新令牌存储在数据库中名为refreshTokens的json列中(这是一个数组) 在客户端,访问令牌和刷新令牌都存储在本地存储器上 当需要验证用户时,如果访问令牌过期,将使用刷新令牌创建一个新的访问令牌,并将其发送回用户并保持用户登录 当用户注销时,数据库中存储的刷新令牌(在refre

  • 我正在使用python的请求模块尝试登录网页。我打开了一个窗口。session(),然后我得到cookie和csrf令牌,它包含在meta标记中。我使用用户名、密码、一个隐藏的输入字段和meta标记中的csrf令牌来构建有效负载。之后,我使用post方法,传递登录url、cookie、负载和头。但在那之后,我无法访问登录页面后面的页面。我做错了什么? 这是我执行登录时的请求标头: 到目前为止,这是