如何调用 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 令牌,但您不需要实现登录部分。
我有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 令牌,但您不需要实现登录部分。