JSON Web 令牌 - 如何识别用户?

Posted

技术标签:

【中文标题】JSON Web 令牌 - 如何识别用户?【英文标题】:JSON web token - how to identify user? 【发布时间】:2018-12-27 09:18:58 【问题描述】:

基本上,我使用 JWT 身份验证,在成功登录后,我将返回 JWT 令牌、到期时间和用户的 GUID(我应该吗?)

让我们举个例子:

我有一个端点,它返回需要经过身份验证的用户特定数据

那么,我该怎么做呢?

让我们这么说

user1 生成了他的 jwt:“a.b.c”

user2 生成了他的 jwt:“c.b.a”

如何确保 user1 不会使用他的 JWT 访问 user 2 的数据?

我考虑过(正如我之前提到的)使用 JWT 令牌发送用户的 GUID 并将其用作识别该用户的一种方式,但如果有人有其他人的 GUID,那么他将能够操纵他的数据,这不是不错。

提前致谢。

【问题讨论】:

你好,我看到你是新来的。因此欢迎来到 Stack Overflow。请通过this tour 了解该社区支持的问题的性质。至于你问的问题,看起来too-broad。尝试一下,然后发布您的代码。那么也许我们可以帮忙.. 这就是 JWT 的本质。如果有人设法劫持了您的 JWT,那么他们基本上可以假装是您。您可以采取一些措施来帮助消除这种情况,例如使用安全连接以使其不被拦截,并且不使用寿命很长的 JWT How can I ensure that user1 will not use his JWT to access user's 2 data? jwt 有效负载通常具有sub 声明,这是令牌颁发给谁的标识符。将userid 存储在其中,然后检查两者。那么 jwt token owner 只能访问自己匹配的 userid 数据。 如果 user1 可以使用 JWT,他也可以伪装成 user1,因此通常您的客户端和服务器之间的通信必须加密,以便数据只能由预期用户读取,因此在这种情况下,不应将 user2 的 JWT 发送给 user1,并且在发送令牌时,必须对通信通道进行加密这是一篇关于 oauth2.0 工作流程的好文章requests-oauthlib.readthedocs.io/en/latest/oauth2_workflow.html 要添加到 Mardoxx 点,如果令牌已签名,您可以读取令牌的内容,但没有私钥您无法更改它 - 签名可防止篡改。 【参考方案1】:

如果 user1 和 user2 通过单独的 ip 发送请求,您可以通过连接用户名和客户端 ip 来生成 jwt 令牌,并在验证令牌时检查从验证请求发送的请求用户名 + ip 和用户名 + ip 来自解密令牌,否则使用数据过滤机制

【讨论】:

【参考方案2】:

它回答了我的问题:

@Mardoxx

如何确保 user1 不会使用他的 JWT 访问 user 2 的数据? jwt 有效负载通常具有 sub 声明,它是令牌颁发给谁的标识符。将用户 ID 存储在其中,然后检查两者。那么 jwt token owner 只能访问自己匹配的 userid 数据。

如果 user1 和 user2 通过单独的 ip 发送请求,您可以通过连接用户名和客户端 ip 来生成 jwt 令牌,并在验证令牌时检查从验证请求发送的请求用户名 + ip 和用户名 + ip 来自解密令牌,否则使用数据过滤机制

https://***.com/a/45315377/10074551

您应该能够在您的控制器中检索这样的声明

var identity = HttpContext.User.Identity as ClaimsIdentity;
if (identity != null)

    IEnumerable<Claim> claims = identity.Claims; 
    // or
    identity.FindFirst("ClaimName").Value;

【讨论】:

以上是关于JSON Web 令牌 - 如何识别用户?的主要内容,如果未能解决你的问题,请参考以下文章

如何识别OAuth令牌是否已过期?

如何识别设备(唯一标识符、CFUUIDRef、设备令牌?)

如何识别和删除服务器上过期的 FCM 令牌?

如何识别来自不同租户nestjs多租户jwt的jwt令牌

如何使用访问和刷新令牌返回自定义数据以识别 Django Rest Framework 简单 JWT 中的用户?

.NET Core 2 Web API JWT 令牌无法识别