如何知道哪个用户被分配给了令牌(JWT Django rest 框架)?

Posted

技术标签:

【中文标题】如何知道哪个用户被分配给了令牌(JWT Django rest 框架)?【英文标题】:How to know which user is assigned to the token (JWT Django rest framework)? 【发布时间】:2021-08-25 02:55:50 【问题描述】:

我正在尝试创建博客更新 API 视图,但我需要知道更新帖子的用户是否与博客作者相同,令牌在标题中给出,如“授权持有者”我如何知道是否标头令牌的用户与博文的作者相同?

【问题讨论】:

这已经有答案了here请看一下! 【参考方案1】:

这取决于使用的令牌。如果它是 JWT,您可以轻松对其进行解码并检查声明。您应该有一个 sub 声明,其中将识别用户。它可能包含用户 ID、他们的电子邮件或其他一些可识别用户的信息。

使用 JWT 时,您应该记得验证它们。您可以使用jwt.io 上的列表来查找可以帮助您实现 JWT 验证的库。还可以查看我写的 JWT best practices 文章,了解使用 JWT 的陷阱。

如果您的访问令牌是不透明的令牌。然后你应该使用Token introspection 来获取分配给你的令牌的数据(发出令牌的服务器应该公开一个令牌自省端点)。

如果您不确定您的访问令牌是 JWT 格式还是不透明的,您可以转到 OAuth.tools 并在 JWT 令牌选项卡中粘贴您的访问令牌。如果它是 JWT,您将在右侧看到解码数据。此外,JWT 是长字符串,始终由点分隔三部分。

【讨论】:

【参考方案2】:

每个 JWT 令牌都有一个有效负载和一个签名。你可以阅读更多here。 如果您使用的是 djangorestframework-simplejwt 包,那么有效负载将类似于 "user_id": 1。这就是您知道它属于哪个用户的方式。 (它以 base64 编码,因此您必须对其进行解码才能看到此信息)。

但是,您实际上不必考虑这一点,因为该包会为您解析令牌。因此,您只需在视图中使用request.user 即可知道哪个用户已通过身份验证。要检查它是否与Blog 对象中的相同,您可以执行以下操作:

blog = Blog.objects.get(pk=1)
if request.user == blog.created_by:
    pass

【讨论】:

以上是关于如何知道哪个用户被分配给了令牌(JWT Django rest 框架)?的主要内容,如果未能解决你的问题,请参考以下文章

OAuth 2.0 服务器如何知道在客户端身份验证期间应该使用哪个密钥来解析 jwt 令牌? (client_secret_jwt)

JWT 令牌是如何认证的?

如何手动使 JWT 令牌过期?

令牌被盗时如何添加额外的jwt安全层

如何使用标头中的用户 JWT 令牌转发授权并将其与 cookie 中的 JWT 令牌进行比较以验证用户?

在 JWT 令牌中存储用户权限的最佳做法是啥?