使用 JWT - 以他们的电子邮件为主题对用户进行身份验证是不是可以?

Posted

技术标签:

【中文标题】使用 JWT - 以他们的电子邮件为主题对用户进行身份验证是不是可以?【英文标题】:Using JWT - is it fine to authenticate user with the subject being their email?使用 JWT - 以他们的电子邮件为主题对用户进行身份验证是否可以? 【发布时间】:2017-08-11 02:55:00 【问题描述】:

我是身份验证新手,只是在一个小型快递应用上尝试 JWT 身份验证。

我使用 JWT 进行了用户身份验证设置,并且我将主题用作用户的电子邮件。

这是一个好习惯吗?

如果我在 jwt.io 上解码 JWT,我会看到:


  "sub": "test_user_3@test.com",
  "iat": 1489963760,
  "exp": 1490568560

它应该是这样工作的吗?

【问题讨论】:

对于“普通”网站是的 - 查看 Wikipedia 上“主要”的定义有助于我理解这一点,您必须记住,这些令牌可以被其他人使用,而不是拥有电子邮件的人. Principals can be individual people, computers, services, computational entities such as processes and threads, or any group of such things. 因此,在您的系统环境中最有意义的就是独一无二的。 请注意,如果您允许用户更改他们的电子邮件地址,那么您同时给他们一个新令牌 - 否则他们会立即被锁定:) 【参考方案1】:

sub 声明必须是唯一的。由于电子邮件地址是唯一的,因此它是索赔的合理选择。

见RFC7519

4.1.2。 “sub”(主题)声明

“sub”(主题)声明标识principal,即 JWT 的主题。 JWT 中的声明通常是语句 关于主题。 主题值必须限定为 在发行人的上下文中是本地唯一的,或者是全球唯一的。 此声明的处理通常是特定于应用程序的。

确保两个用户不使用相同的电子邮件地址注册自己,例如使用通用电子邮件,如info@test.com

【讨论】:

谢谢。但是这样就可以了吗?如果有人获得了 JWT,他们就可以找到用户的电子邮件。 如果有人获得了 JWT,那么您就有问题了,因为他/她可以在您的 API 中冒充该用户。您必须保护它:使用 https 和安全存储。在 JWT 中包含声明并不意味着每个人都可以访问它。关于您的问题,您需要考虑电子邮件或其他声明是否可以在您的系统环境中被视为敏感数据。在这种情况下,请小心使用它们,或者不要将它们包含在令牌中。例如,您可以使用随机用户 ID 而不是电子邮件 谢谢。这很有帮助。我不想打扰你太多,但你介意提供更多关于保护 API 部分的信息,或者你是否知道任何好的文章。现在我有一个新的担心,有人会得到 JWT 并开始搞乱我的 API,就好像他们是用户/客户端一样! 例如,有人可以打开邮递员拦截器并开始摆弄。谢谢 仅使用 SSL/TLS (https) 发布您的 API 端点。客户端和服务器之间的通信通道将被加密,因此任何嗅探网络的人都无法看到内容。

以上是关于使用 JWT - 以他们的电子邮件为主题对用户进行身份验证是不是可以?的主要内容,如果未能解决你的问题,请参考以下文章

Laravel JWT 和社交名流插件

从 UUID 或 HMAC/JWT/hash 生成一次性安全令牌?

如何将 jwt 令牌添加到 url?

如何使用 JWT 令牌使忘记密码更安全?

使用 jwt 结构重置密码

需要 JWT expiresIn 字段显示在控制台上