gpt4 book ai didi

security - 服务器如何验证 JWT?公钥从哪里来?

转载 作者:行者123 更新时间:2023-12-03 23:45:24 27 4
gpt4 key购买 nike

我在看 examples Node.js 中的 JWT token 和 verify功能。我的问题是,这在哪里 publicKey来自verify(token, publicKey) ?什么是流量?
客户端(我的一个用户)在他们的计算机/服务器上安装了一个客户端库,用于向我的应用程序发出请求 myapp.com .在 myapp.com服务器,我调用 verify(token, publicKey) .在客户端库中,我使用 privateKey 生成 token .问题是,客户端一般是如何获取这个私钥的? (即 heroku login 在后台下载用于发出 JWT 请求的私钥,诸如此类?)。以及如何获取公钥?我的理解是,客户端会下载一个私钥,我们的服务器会存储公钥。然后如果你有公钥和 token ,只需调用 verify(token, publicKey) .但是一般如何在服务器上获取 token 的公钥呢?服务器是否将每个私钥存储一个公钥分发给客户端安装的库?

最佳答案

我通常看到使用 JWT 的方式,只有极少数受信任的发行者,通常只有一个,并且 token 用作不记名 token 。在许多情况下,发行者和验证者是相同的。在其他情况下,验证者信任一个身份提供者(例如 Google)并从 https URL (example) 获取公钥。
在您的情况下,您可以同时充当发行者和验证者:

  • 您(服务器)将生成一个 key 对。
  • 您的 API 服务器将信任由该 key 签名的 JWT(并且它们只有公钥,因为它们只需要验证它们)。
  • 身份验证/管理服务器将拥有私钥,对您的用户进行身份验证,并向他们颁发 JWT。
  • 客户端永远不会处理任何 key ,他们只会存储签名的 JWT,并在发出客户端请求时将其作为不记名 token 传递。

  • 这是例如描述的方法 here作为 GitHub 使用的方法。在这种情况下,发行者和验证者都属于您。这种方法对您(验证签名后您可以信任 JWT 的内容)和客户端(它们只是处理不透明的 API key ,不需要处理复杂性)都是最简单的完全没有 JWT)。

    一种可能的替代方法可能是:
  • 生成一个 key 对,并且公钥与该帐户相关联。这可以通过多种方式完成(见下文),但最终结果是相同的:客户端有一个私钥,并且您的服务器知道相应的公钥以及它与哪个用户关联
  • 发出请求时,客户端会创建一个 JWT,使用其私钥对其进行签名,并将其用户名包含在 token 中(例如,在 iss 和或 sub 字段中)。
  • 您的服务器获取 token ,提取用户名,在数据库中查找与帐户关联的公钥,并验证 token 。

  • 这种方法用于例如由谷歌云 for service account authentication .
    上面的步骤 1 可以通过两种方式完成:
  • 您对用户进行身份验证,生成 key 对,将公钥与帐户相关联,然后让用户下载他们的私钥(当然是通过 https)。虽然通常认为为其他人生成 key 有点糟糕(因为您会看到一个您不需要知道的 key 并且您必须通过网络发送它),但这要容易得多,而且 Google 正在做这。
  • 用户生成并存储 key 对。您对用户进行身份验证,用户上传公钥,然后将其与帐户相关联。

  • 无论哪种方式 ,如果您采用“用户签署 JWT”方法,您可能需要提供客户端库,或者至少提供代码示例。另请注意 Google 要求 token 必须是短期的,通过将长期 token 视为无效来强制执行。如果没有这个规则和强制执行,将会发生的事情是,许多客户端开发人员会对您复杂的解决方案感到恼火,在他的笔记本电脑上手动签署一个永久有效的 token ,然后将其用作不记名 token 。
    heroku login实际上根本不使用 JWT。它 retrieves and stores OAuth 承载 token 。这与第一种方法最相似(客户端从不处理任何私钥,只是获取一个不透明的 blob,它恰好是您可以验证的 JWT)。非 JWT token 和长期 JWT 之间的区别在于,您的 API 服务器必须在数据库中查找常规 token 的含义和有效性,而 JWT 直接告诉您用户身份,可能还有权限和其他您在发布时包含的属性。

    关于security - 服务器如何验证 JWT?公钥从哪里来?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63106661/

    27 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com