【问题标题】:How do I calling API to multi micro-services but only authenticate once time and calling independently?如何调用 API 到多个微服务但只验证一次并独立调用?
【发布时间】:2019-12-09 22:26:54
【问题描述】:

我有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 是: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 调用它。有什么办法可以让前端开发 只需认证一次即可独立调用API MicroserviceA 和 MicroserviceB 无需像我这样调用两次?

【问题讨论】:

    标签: node.js express jwt express-jwt jwt-auth


    【解决方案1】:

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

    【讨论】:

    • 感谢您的回复。您能否详细告诉我如何在微服务之间共享令牌?其实我已经在MicroserviceA生成了JWT token(信息包括email、password..等),但是不知道如何在微服务之间共享。
    • 如何在 MicroserviceA 中验证令牌?我的意思是,MicroserviceA 是如何知道 API 调用被授权的?
    • 我正在使用护照并这样做:` var requireAuth = passport.authenticate('jwt', {session: false}); TodoRouter.get('/', requireAuth, authController.roleAuthorization(['member','admin']), todoController.getTodos); ` 我关注这个教程:joshmorony.com/…
    • 所以您在 Authorization 标头中传递了令牌。您可以做同样的事情并在向微服务B发出请求时复制微服务A的授权标头
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-12-04
    • 2019-01-01
    • 2020-05-02
    • 1970-01-01
    • 2020-06-16
    • 2021-04-05
    • 1970-01-01
    相关资源
    最近更新 更多