使用 JWT 验证单独的 API 微服务

2024-05-04

我正在 NodeJS 中使用微服务开发一个应用程序。我已经构建了一个 auth api,它处理通常的注册登录等,并且它发出 JWT

如何使用它们来保护用 Express 编写的单独 API 微服务中的路由?

我是否需要使用 JWT 和密钥来解密 API 应用程序中的令牌?


您可以编写一个导入到其他微服务中的库,默认情况下要求所有路由都需要身份验证。该库可以具有在微服务级别验证 JWT 的机制,因此您无需与 auth api 对话即可查看 JWT 是否有效。参见下面的描述和图表:

您的身份验证服务器将需要成为微服务的 JWT 的单一发行者。因此,当用户登录并成功进行身份验证时,您的身份验证服务器将发出使用私钥签名的 JWT(签名必须是非对称的 - RS256 就是一个例子),您仅将其保留在身份验证服务器上;不要将此私钥提供给您希望在其中验证 JWT 的其他微服务。您可以做的是根据您签署令牌的私钥派生公钥,并将其发布到身份验证服务器上不需要身份验证的端点 - 公钥将以JWK https://www.rfc-editor.org/rfc/rfc7517(参见规范链接)。谷歌也做了类似的事情here https://www.googleapis.com/oauth2/v3/certs。然后,在每个微服务中,您的库将需要设计一种方法,每隔 X 分钟向身份验证服务器上的公钥端点发出 GET 请求,以查看是否有任何更改并在每个微服务中缓存公钥。通过将公钥缓存在微服务中,您将能够在所请求的服务内验证请求 JWT。

然后,每当请求进入您的微服务之一时,您导入的库都会检查请求的 JWT,检查其有效性,并在令牌有效时授予访问/授权。使用私钥/公钥对和非对称密钥签名的优点在于,您可以仅根据公钥验证令牌,但不能对其进行签名。因此,只要每个服务拥有来自 /cert 端点的公钥,它们就可以验证令牌,而无需与身份验证服务器通信或知道私钥。

这需要预先做更多的工作,但将来会为您带来极大的轻松、灵活性和安心,因为知道只有一个来源知道您的私钥。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 JWT 验证单独的 API 微服务 的相关文章

随机推荐

  • 为什么 Keras 的 train_on_batch 在第二个 epoch 产生零损失和准确率?

    我正在使用一个大数据集 所以我尝试使用 train on batch 或适合 epoch 1 model Sequential model add LSTM size input shape input shape return seque
  • Windows 上任何单个进程可以寻址的最大内存量

    Windows 版本的内存限制 http msdn microsoft com en us library windows desktop aa366778 28v vs 85 29 aspx回答 Windows 上任何单个进程可以寻址的最
  • 在 TypeScript 中使用三个 Js + OrbitControl

    我无法得到this http www example com 在 TypeScript 中使用上述组合的示例 I have and 在我的html中和打字稿文件
  • 在 Light Table 中使用 Datomic 时出现“无读取器功能”错误

    当我在 lighttable 中评估这段代码时 ns app core require datomic api refer q as d reload all defn add person conn id d transact conn
  • MATLAB 是否已有 YAML 库/解析器?

    我想使用 YAML 跨多种语言交流一些数据 将其视为 与语言无关的序列化 其中一种语言是 MATLAB 但我似乎找不到该语言的 YAML 库 我在 Google 上检查了 matlab yaml 和 matlab yaml parse 似乎
  • 获取文件的上次访问时间

    我知道使用File对象我们可以获得最后修改时间File i e 文件 lastModified https docs oracle com javase 8 docs api java io File html lastModified 但
  • pyspark中的稀疏向量RDD

    我一直在使用 mllib 的功能通过 Python Pyspark 实现此处描述的 TF IDF 方法 https spark apache org docs 1 3 0 mllib feature extraction html http
  • 知识树中的段错误

    我正在用 c 实现一个可以从文件中读取的知识树 我的 newStr 函数出现段错误 我无法用这个问题测试我的其余代码 我对 c 没有太多经验 任何帮助将不胜感激 我的 c 文件 包括 包括 include 动物 h 包括 包括 return
  • 如何提取 MySQL 日期中的月份和年份并进行比较?

    如何从 mySQL 日期中提取月份和日期并将其与另一个日期进行比较 我找到了 this MONTH 但它只获取月份 我寻找月份和年份 在Mysql Doku中 http dev mysql com doc refman 5 5 en dat
  • MySQL SUM 具有相同的 ID

    抱歉 这个真正简单的问题 我刚刚学习 PHP 和 MySQL 我已经在谷歌上搜索了一个多星期 但没有找到任何答案 我创建了一个简单的财务脚本 表格如下 table a aid value 1 100 2 50 3 150 table b b
  • @NotNull 注释未检查 Jersey REST 资源中的空查询参数

    我正在尝试使用 javax validation validation api 进行验证 QueryParam参数 我已按照以下步骤操作 添加依赖项
  • 如何使用C#检测IIS版本?

    如何使用C 检测IIS版本 更新 我的意思是来自 winapp 实际上该场景是开发一个自定义安装程序 想要检查已安装 IIS 的版本以调用适当的 api 在这里找到了答案 链接文本 http forums iis net p 1162404
  • Android maven插件生成多个dex文件

    如何使用 android maven 插件生成多个 dex 文件而不是一个以避免 android 64k 方法问题 可以使用这个插件来做到这一点 还是我必须使用 gradle 来做到这一点 解决方案 通过这个拉取请求https github
  • 如何使用递归获取父级的所有子级,然后获取其子级

    问候 我的 JSP Web 应用程序中有父事务的比喻 我将事务 ID 存储在数据库中 要求是显示父级的所有子级 然后显示父级子级的后续子级 实际上 这个父母及其孩子的列表永远不会超过 4 或 5 层 但我需要考虑到它可以比这更多层 我尝试过
  • 解码URIComponent抛出错误“URI格式错误”

    As unescape已被弃用 我已选择decodeURIComponent 但它没有按预期工作 decodeURIComponent无法解码以下 URI 组件 Coast 20Guard 20Academy 20to 20hold 20a
  • 了解左值到右值转换的示例

    我很难理解这段代码 来自 C 14 草案标准的示例 转换拉瓦尔 调用未定义的行为g false 为什么constexpr使程序有效 另外 不访问 是什么意思 y n 在两次通话中g 我们正在返回n数据成员那么为什么最后一行说它不能访问它呢
  • 在Rails环境中执行Ruby Worker脚本

    我有以下案例 我希望能够将独立的 Ruby 脚本作为守护进程运行 我希望能够在我的 Rails 项目的上下文 环境中执行此脚本 例如 以便该脚本可以访问后端 我的 Rails 模型 有没有一种简单的方法可以实现这一点 Thanks Use
  • 如何防止 Ajax/javascript 结果在浏览器中缓存?

    如何防止浏览器缓存Ajax结果 我有事件触发的 Ajax 脚本 仅当浏览器数据被清除时才显示结果 在 IE6 和 Firefox 3 0 10 中测试 随机 URL 可以工作 但它是一种 hack HTTP 内置了应该可以工作的解决方案 尝
  • 如何调试 Jenkins 作业中无法运行程序“C:\Program Files\Git”?

    我正在使用 jenkins 构建我的 git 项目 这是我在查看日志时收到的错误 我在 jenkins 中使用 git 插件 您将如何解决该错误消息 Started by user anonymous Building in workspa
  • 使用 JWT 验证单独的 API 微服务

    我正在 NodeJS 中使用微服务开发一个应用程序 我已经构建了一个 auth api 它处理通常的注册登录等 并且它发出 JWT 如何使用它们来保护用 Express 编写的单独 API 微服务中的路由 我是否需要使用 JWT 和密钥来解