微服务架构的 OAuth 2.0 流程
OAuth 2.0 Flows for Microservice Architectures
我正在尝试了解如何将 OAuth 2.0 授权类型最好地应用于我正在处理的微服务架构。情况是这样的...
我有一个单页 Application/Mobile 应用程序作为网络浏览器(作为用户代理的浏览器)或移动设备 phone 的客户端 运行。我使用 RFC 6749, section 4.1 中定义的 Implicit Grant 来验证用户并获取应用程序用来访问一些外部公开的访问令牌 API.
我正在处理的架构是一组相互调用的微服务。例如,考虑一个外部暴露的 API serviceA
和内部 APIs serviceB
和 serviceC
。假设 serviceA
依赖于 serviceB
,后者随后依赖于 serviceC
(A
--> B
--> C
).
我的问题是,这种情况的典型授权流程是什么?使用 SPA 的隐式授予获取访问令牌然后使用 RFC 6749, section 4.4 中定义的 Client Credentials Grant 获取机器对机器交互的访问令牌是标准的吗在 serviceB
和 serviceC
之间?
老实说,我会建议每个后端服务实施授权授予。那就是有一个端点将重定向暴露给您的提供者。然后对于每个前端应用程序,转到该端点以触发 OAuth 流程。流程完成后,处理回调中的授权部分 url 和 return 将存储在前端某处的令牌。
希望对您有所帮助。
如果 serviceB 和 serviceC 是内部的并且永远不会从外部客户端调用,那么客户端凭据授予将是一个很好的选择。由于客户端也是资源服务器。
您还可以考虑在服务之间传递相同的不记名令牌,前提是 SPA(最初请求令牌)获得对其他服务和 "audience" 可能使用的所有范围的同意令牌必须允许所有可能的资源服务器(服务)。
我认为这两种方法都不是最佳做法,两种方法都需要权衡取舍。
对于您的单页应用程序,使用专为浏览器应用程序设计的隐式授权 - 它们不能保留任何秘密,并且使用隐式授权,令牌保留在浏览器中(因为它位于重定向的哈希部分URL).
手机app,看看OAuth 2.0 for Native Apps,推荐使用Auth code grant。它还描述了通用平台和安全注意事项的实现细节。
OAuth 2.0 Token Exchange RFC 中描述了一项新授权,它可以满足您对服务之间的链式调用的需求:
... An OAuth resource server, for example, might assume
the role of the client during token exchange in order to trade an
access token, which it received in a protected resource request, for
a new token that is appropriate to include in a call to a backend
service. The new token might be an access token that is more
narrowly scoped for the downstream service or it could be an entirely
different kind of token.
但是不知道Auth0是否支持。如果没有,我可能会将原始访问令牌从 serviceA
传递给 serviceB
和 serviceC
。内部服务也可以在网络级别得到保护(例如,它们可以仅从其他服务调用)。
我正在尝试了解如何将 OAuth 2.0 授权类型最好地应用于我正在处理的微服务架构。情况是这样的...
我有一个单页 Application/Mobile 应用程序作为网络浏览器(作为用户代理的浏览器)或移动设备 phone 的客户端 运行。我使用 RFC 6749, section 4.1 中定义的 Implicit Grant 来验证用户并获取应用程序用来访问一些外部公开的访问令牌 API.
我正在处理的架构是一组相互调用的微服务。例如,考虑一个外部暴露的 API serviceA
和内部 APIs serviceB
和 serviceC
。假设 serviceA
依赖于 serviceB
,后者随后依赖于 serviceC
(A
--> B
--> C
).
我的问题是,这种情况的典型授权流程是什么?使用 SPA 的隐式授予获取访问令牌然后使用 RFC 6749, section 4.4 中定义的 Client Credentials Grant 获取机器对机器交互的访问令牌是标准的吗在 serviceB
和 serviceC
之间?
老实说,我会建议每个后端服务实施授权授予。那就是有一个端点将重定向暴露给您的提供者。然后对于每个前端应用程序,转到该端点以触发 OAuth 流程。流程完成后,处理回调中的授权部分 url 和 return 将存储在前端某处的令牌。
希望对您有所帮助。
如果 serviceB 和 serviceC 是内部的并且永远不会从外部客户端调用,那么客户端凭据授予将是一个很好的选择。由于客户端也是资源服务器。
您还可以考虑在服务之间传递相同的不记名令牌,前提是 SPA(最初请求令牌)获得对其他服务和 "audience" 可能使用的所有范围的同意令牌必须允许所有可能的资源服务器(服务)。
我认为这两种方法都不是最佳做法,两种方法都需要权衡取舍。
对于您的单页应用程序,使用专为浏览器应用程序设计的隐式授权 - 它们不能保留任何秘密,并且使用隐式授权,令牌保留在浏览器中(因为它位于重定向的哈希部分URL).
手机app,看看OAuth 2.0 for Native Apps,推荐使用Auth code grant。它还描述了通用平台和安全注意事项的实现细节。
OAuth 2.0 Token Exchange RFC 中描述了一项新授权,它可以满足您对服务之间的链式调用的需求:
... An OAuth resource server, for example, might assume the role of the client during token exchange in order to trade an access token, which it received in a protected resource request, for a new token that is appropriate to include in a call to a backend service. The new token might be an access token that is more narrowly scoped for the downstream service or it could be an entirely different kind of token.
但是不知道Auth0是否支持。如果没有,我可能会将原始访问令牌从 serviceA
传递给 serviceB
和 serviceC
。内部服务也可以在网络级别得到保护(例如,它们可以仅从其他服务调用)。