首页 > 解决方案 > 如何调用 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,而不必像我这样调用两次?

标签: node.jsexpressjwtexpress-jwtjwt-auth

解决方案


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 令牌,但您不需要实现登录部分。


推荐阅读