【问题标题】:Laravel passport, Oauth and microservicesLaravel 护照、Oauth 和微服务
【发布时间】:2020-02-02 21:10:25
【问题描述】:
我在架构方面遇到困难,想知道是否有人有一些见解。
计划
- 我将有多个微服务(不同的 laravel 项目、catalog.microservice.com、billing.microservice.com),每个微服务都提供一个 API。
- 除此之外,还有一个使用这些 API 的 Angular 前端。
- 感谢 laravel 5.3 护照,我现在将拥有另一个用于身份验证的微服务 (passport.microservice.com),这更加容易。
流程:
- 用户访问catalog.microservice.com
- 用户需要验证并提供用户名和密码
- Angular(又名客户端)通过密码大类型向 passport.microservice.com 发出请求以获取授权令牌
- 现在我有一个令牌,我有权从 catalog.microservice.com 调用资源
- catalog.microservice.com 需要知道令牌是否有效并向 passport.microservice.com 发出请求(某种中间件?)
- passport.microservice.com 返回用户、范围等
问题:
- 这是个好方法吗?
- catalog.microservice.com 中的令牌验证可以是中间件吗?
【问题讨论】:
标签:
laravel
oauth
oauth-2.0
microservices
【解决方案1】:
微服务架构中的常用方法是使用单个身份验证“网关”,通常它是 API 网关的一部分。
因此,除了您的 passport.ms.com 之外,您还有一些代理可以检查标头中的访问令牌,如果它无效 - 给出错误。如果令牌有效 - 将请求代理到相应的微服务。
这样您就不必重复自己 - 您不必为每个微服务实施 N 次身份验证。
然后,如果您需要更精细的控制 - 用户可以访问的确切内容(通常称为授权),那么您通常会在每个特定的微服务中实现它。
简而言之,您的微服务不应该关心传入的请求是否经过身份验证 - 它已经为它们进行了预过滤。微服务只决定用户 X 是否可以做动作 Y。
PS。您可以将 API 网关与 Passport/Oauth 设施结合使用,也可以单独运行它们 - 这取决于您。 AWS 已经提供 API 网关即服务(证明微服务正在变得多么流行),但我找不到任何好的开源类似物。
【解决方案2】:
您的 api 应该有一个网关来处理身份验证并与不同的微服务通信。
在顶层对用户进行身份验证(或拒绝未经授权的用户)、组合来自不同服务的响应,然后您的客户端(Web 或移动)可以使用该数据是有意义的。
这样做的一个好处是您的客户只需要记住一个网址。
示例:只需要 microservice.com 而不需要 catalog.microservice.com、users.microservice.com、passport.microservice.com 等
单个端点地址 (URL) 比许多单独的 API 地址更容易记住和配置。
这是描述此架构的图片的链接。
Api Architecture image