在微服务架构中,API网关位于API前面。这样的目的是例如更改一些请求/响应参数,单个入口点或检查身份验证等。现在我想使用OAuth2流保护我的API以获取访问令牌。问题是决定谁是真正的OAuth客户端,我将使用SPA示例来演示它:
a)SPA是否通过使用隐式授权启动了oauthorize请求(到api网关)。然后,Api网关只需将请求路由到OAuth授权服务器,作为单个入口点,使用来自隐式流的/ authorize内容
b)它是API网关本身,这意味着SPA将最终用户的用户名和密码发送到api网关(当然,这里SPA需要与最终用户凭据一起信任),然后其作用于其使用资源所有者密码授予
作为oauth客户端拥有c)完全关闭api网关并创建与api网关“并行”的oauth授权服务器,这意味着你将丢失单个入口点等。
下图展示了一个非常抽象的体系结构,问题是关于数字“[2]”,如果此请求由SPA发起并由api网关传递,或者api网关正在拦截请求并作为一个oauth客户自己行动?
我的猜测是始终为特定客户端使用最合适的授权类型,无论是否存在API网关。这意味着,当谈到OAuth时,API网关只会传递客户端授权请求,无论它使用何种授权类型。因此,图片中的[2]将来自客户端,而不是来自充当OAuth客户端的API网关。它是否正确?如上所述,当涉及到第一方应用时,这真的很棘手,因为你可能会使用密码凭证授权,这有很大的缺点,例如。 SPA没有令人耳目一新的可能性。
答案 0 :(得分:0)
请记住,这是一个纯粹基于意见的答案,因为你的问题很模糊。
我不喜欢使用API网关作为验证请求的点。我认为这违背了单一责任原则。网关的目的通常是将您的后端暴露给外部客户端,可能会更改某些特定客户的合同等。但它也不应该对呼叫进行身份验证。除此之外,它必须根据传递给它的数据这样做,无论如何你都必须聚集在其他地方。
我认为另一件不受欢迎的事情是您正在考虑为您的SPA使用资源所有者密码授予。这不是此授权流程的正确用例。您可以查看这篇文章,它比我更好地解释了它:https://www.scottbrady91.com/OAuth/Why-the-Resource-Owner-Password-Credentials-Grant-Type-is-not-Authentication-nor-Suitable-for-Modern-Applications
我建议您使用隐式授权类型,并使用api网关仅将呼叫路由到后端,不要对该层上的呼叫进行身份验证。
如果您使用的是spring cloud api网关(实际上是一个zuul代理),则必须添加正确的配置,以便转发所有安全标头和重定向。这个例子对我有用:
server:
use-forward-headers: true
zuul:
addHostHeader: true
routes:
<your oauth server route>:
url: <your oauth server url>
path: <if youve got any prefix>
sensitiveHeaders:
stripPrefix: false