【问题标题】:Json Web Token + User AuthenticationJson Web Token + 用户认证
【发布时间】:2016-07-27 15:38:35
【问题描述】:

我刚刚在我的 api 中实现了 Json Web 令牌,但我不明白如何验证创建令牌的用户是否是发出请求的用户。

例如,我有 /user/login 端点,我收到了登录用户和密码。然后我创建一个包含用户数据的 json Web 令牌,并将其返回。这是我的问题,我怎么知道创建该令牌的用户是发出请求的用户?

我找到了几种方法来验证这一点,例如保存用户的用户代理 + ip 并且仅在用户代理 + ip 为 xxx 时接受对该令牌的请求,但我不确定这是最好的方式。

希望你能给我一些建议,

谢谢大家

【问题讨论】:

  • 正如@pedrofb 所说,服务器发出 JWT,而不是客户端。客户端只是在每次请求时发送它。
  • 嗨@JIFT,你检查答案了吗?请记住,如果其中一个答案适合您的问题,您可以将其标记为已接受。是可选的

标签: api authentication jwt


【解决方案1】:

我怎么知道创建该令牌的用户是发出请求的用户?

由于 JWT 包含用户 ID 并已签名,因此将检测到对内容的任何更改。拥有令牌是真实性的证明

用JWT签发和认证的过程或多或少是这样的

颁发新的 JWT

  1. 用户使用其凭据执行和验证

  2. 服务器验证凭据,生成包含用户数据和一些字段(如过期时间或颁发者)的 JWT 有效负载,并使用服务器私钥对令牌进行签名

  3. 客户端收到令牌并将其存储(在安全存储中)。

身份验证

  1. 用户向服务器发送请求。请求包含 JWT,通常在标头中或作为 url 参数

  2. 服务器使用密钥验证签名,并提取用户 ID 以了解请求者。如果签名无效则拒绝请求

【讨论】:

  • 感谢@pedrofb 的回答,这是我实际使用的流程,但例如,您会推荐什么“安全存储”?比如会话变量或cookie?。而且我想以同样的方式添加额外的安全性,以验证来自该令牌的用户 ID 是发出请求的用户 ID。
  • 您可以使用localStorage、sessionStorage和cookies。看看这里的比较stormpath.com/blog/…。 localStorage 易受 XSS 攻击,cookie 易受 CSRF 攻击,因此您需要将 CSRF 令牌添加到 JWT。如果您不需要在客户端读取 JWT 内容,也可以使用 HttpOnly 保护 cookie。根据需要自行决定:)
  • userId 在 JWT sub 字段内。如果您希望 JWT 不能用于完成完整的身份验证,则必须添加额外的安全措施。例如,需要 JWT 和之前发布的 CSRF 安全令牌。另一种选择是使用在客户端生成的加密密钥对,并要求客户端对请求的有效负载进行签名。服务器将使用公钥(链接到用户帐户)验证签名。但是这个选项实现起来比较复杂
【解决方案2】:

您有什么理由不能使用像 OAUTH2 这样的标准并让大公司为您处理安全问题?滚动自己的安全通常很难正确,几乎所有主要参与者都提供免费的 OATH 支持。

也就是说,我会犹豫是否要带你走上一条坏路,但是我以前也曾站在你的立场上,所以如果你必须自己提高安全性,请确保你完全阅读了 OWASP 提供的所有内容。他们提供非常详细的威胁分析,并提供在您的旅程中非常宝贵的建议。

OWASP Threat Analysis

编辑 1

一个轻量级且易于实施的标准是OpenID,正如他们的横幅所解释的那样,

基于 OAuth 2.0 的简单身份层

有关其工作原理的非常详细的说明,请参见此处: OpenID-Wiki

【讨论】:

  • 嗨 Joseph,是的,这周我实现了这个 OAUTH 库 bshaffer.github.io/oauth2-server-php-docs,但它让我创建了很多表,我真的不明白为什么,因为这是一个网站的 api,并且一个应用程序,我认为我不需要所有这些。但可能我错了。如果您能告诉您将与 OAUTH 一起使用来验证登录的流程,那就太好了。
  • 我已经编辑了建议 OpenID 的答案。此外,有这么多表的原因是您正在安装 OAUTH2 服务器。除非您绝对想要控制成员资格,否则您不希望这样做。相反,您想向知名提供商注册您的应用程序并使用他们的服务(让他们解决头痛问题)。有很多资源,但我会从 OpenID 程序开始,然后从那里开始工作。
  • 哇,它看起来真的很棒,但它是付费的。我正在寻找一个不那么专业的替代方案来发展我的自我,因为这是我自己的项目,而不是我工作的公司。
猜你喜欢
  • 2014-03-01
  • 2023-04-05
  • 2019-10-15
  • 1970-01-01
  • 2016-04-07
  • 1970-01-01
  • 2017-10-25
  • 1970-01-01
  • 2019-03-16
相关资源
最近更新 更多