node.js - 如何调用 API 到多个微服务但只验证一次并独立调用?
问题描述
我有 2 个微服务,MicroserviceA 是一个核心服务,包括身份验证和授权服务以及其他 API 服务。MicroserviceB 包括其他几个 API(不包括身份验证和授权) MicroserviceA 包括一些这样的 API:
localhost:3000/api/login (by JWT)
localhost:3000/api/postA
localhost:3000/api/getA
localhost:3000/api/deleteA
localhost:3000/api/pushA
MicroserviceB 包含一些这样的 API:
localhost:3001/api/postB
localhost:3001/api/getB
localhost:3001/api/deleteB
localhost:3001/api/pushB
我的前端只调用了 1 个基于 url 的 URL:http://localhost:3000,所以我喜欢这样,为了在 2 个微服务之间进行通信,我使用 axios 从核心 MicroserviceA 调用到 MicroserviceB 所以在 MicroserviceA 中,我有以下 API:
localhost:3000/api/login (JWT)
localhost:3000/api/postA
localhost:3000/api/getA
localhost:3000/api/deleteA
localhost:3000/api/pushA
localhost:3000/api/postB (axios call)
localhost:3000/api/getB (axios call)
localhost:3000/api/deleteB (axios call)
localhost:3000/api/pushB (axios call)
但问题是,当我想从 MicroserviceB 调用一些 API 时,我必须从 MicroserviceA 调用它。有没有什么方法可以让前端开发人员只需要验证一次,但可以独立于 MicroserviceA 和 MicroserviceB 调用 API,而不必像我这样调用两次?
解决方案
MicroserviceB 还需要实现 JWT 身份验证。它不需要实现该login
方法,你有 MicroserviceA 负责,它只需要验证令牌。只要 MicroserviceA 和 MicroserviceB 共享相同的秘密,就可以在两者上验证令牌。
您的主要保护是用于签署令牌的应用程序的秘密。这本质上是您的私钥,因此理想情况下使用一些算法/密码生成器来生成它并确保没有其他人可以访问它。
理想情况下,您的 JWT 令牌将在其有效负载中包含某种链接到用户的方式,例如用户 ID 或电子邮件等。通过仔细规划,甚至可能不需要发出数据库请求来获取用户 - 您的端点应该能够使用 JWT 有效负载来识别用户/角色/权限等。
例如,microserviceA 实现了一个/login
端点,该端点在 JSON 响应中返回令牌。因此,要登录,您需要执行以下操作:
fetch('/login', {
method: 'POST',
headers: {
'Content-Type': 'application/x-www-form-urlencoded'
},
body: 'email=' + email + '&password=' + password
})
.then(response => response.json())
.then(result => {
localStorage.setItem('jwt', result.token); // save token somewhere
});
然后向 microserviceB 发出请求,您只需添加授权标头:
fetch('http://microserviceB.com/do/something', {
headers: {
'Authorization': localStorage.getItem('jwt')
}
})
.then(processResponseFromMicroserviceB);
您可以像在 microserviceA 中一样验证 microserviceB 中的 jwt 令牌,但您不需要实现登录部分。
推荐阅读
- android - 用按钮链接片段
- postgresql - POSTGRES 中的“42883:运算符不存在:间隔 - 没有时区的时间戳”
- qt - 如何正确调用没有输入参数的方法
- python - pandas:使用 sort_values 的矛盾输出
- react-native - 当输入为空时,TextInput 光标跳到右端
- php - 为什么使用 imap php 访问 Outlook 邮件时每次都会出错?
- javascript - 如何设置RequiredLevel 特定控件或属性?
- database - PostgreSQL中的Oracle“替换”函数替代有2个参数?
- java - 如何使用 JobScheduler 显示 toast 消息
- javascript - 多个按钮关闭在reactjs中不起作用