如何调用 API 到多个微服务但只验证一次并独立调用?

How do I calling API to multi micro-services but only authenticate once time and calling independently?

我有2个微服务,MicroserviceA是一个核心服务,包括认证和授权 服务和其他 APIs 服务。 MicroserviceB包括其他几个API(不包括认证和授权) 微服务 A 包含一些 API 喜欢这样:

localhost:3000/api/login (by JWT)
localhost:3000/api/postA
localhost:3000/api/getA
localhost:3000/api/deleteA
localhost:3000/api/pushA

微服务 B 包含一些 API 像这样:

localhost:3001/api/postB
localhost:3001/api/getB
localhost:3001/api/deleteB
localhost:3001/api/pushB

我的前端只调用1个基于url是:http://localhost:3000,所以我喜欢那样,在2个微服务之间进行通信, 我正在使用 axios 从核心 MicroserviceA 调用 MicroserviceB 所以在 MicroserviceA 中,我有以下 APIs:

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 调用一些 APIs 时, 我必须从 MicroserviceA 调用它。前端开发有什么办法吗 只需要验证一次,但可以独立调用 APIs MicroserviceA 和 MicroserviceB 无需像我这样调用两次?

微服务B也需要实现JWT认证。它不需要实现 login 方法,你有 MicroserviceA 负责,它只需要验证令牌。只要 MicroserviceA 和 MicroserviceB 共享相同的秘密,就可以在两者上验证令牌。

您的主要保护是您的应用程序用于签署令牌的秘密。这本质上是您的私钥,因此最好使用一些 algorithm/password 生成器来生成它并确保没有其他人可以访问它。

理想情况下,您的 JWT 令牌将在其有效负载中包含某种链接到用户的方式,例如用户 ID 或电子邮件等。通过仔细规划,甚至可能不需要发出数据库请求来获取用户 - 您的端点应该能够使用 JWT 负载来识别 user/role/permissions 等

举例来说,微服务 A 实现了一个 /login 端点,该端点 returns 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
});

然后向微服务B发起请求只需要添加授权header:

fetch('http://microserviceB.com/do/something', {
    headers: {
        'Authorization': localStorage.getItem('jwt')
    }
})
.then(processResponseFromMicroserviceB);

您可以像在微服务 A 中一样在微服务 B 中验证 jwt 令牌,但您不需要实现登录部分。