【发布时间】:2017-03-20 10:02:15
【问题描述】:
上下文:我正在创建一个云平台,以支持使用 SSO 的多个应用程序。我通过 Keycloak Spring Security Adapter 使用 Keycloak 进行身份验证 和 Netflix Zuul 进行授权(API 网关)。
每个微服务都需要一个 Authorization 标头,其中包含一个有效的 JWT,它将使用用户名(子)来处理请求。每个微服务到微服务的调用都应该首先通过 Netflix Zuul,传递 Authorization 标头以维护无状态验证。该策略允许每个微服务知道谁是间接调用微服务的用户(子)。
问题/问题 1:如果从队列消息中调用微服务会发生什么?我的一个想法是将与消息 + userInfo 相关的信息存储在队列中,并创建一个专用的微服务来处理这种消息,通过这种方法,这个特殊的微服务应该从队列中读取 userInfo 并处理消息.
更新 1:根据来自另一个论坛的电子邮件回复,将 JWT 存储在队列中并不是一个好主意,因为它很容易被挖掘。
问题/问题 2: 但是,如果之前的特殊微服务想要调用另一个期望在标头中接收 JWT 的普通微服务,会发生什么?这个特殊的微服务是否应该自己创建一个JWT来模拟用户并能够调用常规微服务?
我认为的另一个解决方案是将原始 JWT 存储在队列中,但是,如果队列稍后调用特殊微服务会发生什么?就在 JWT 不再有效(过期)并且被调用的微服务将拒绝请求之后?
可能的解决方案:(根据 João Angelo 的讨论更新,见下文)
我应该对来自我的用户(授权代码流)和我的服务(客户端凭据授予)的请求进行身份验证,这两个请求都应该在负载中包含用户信息。当它来自用户的请求时,我需要验证有效负载用户信息是否与 JWT 声明匹配。当请求来自服务时,我只需要信任该服务(只要它在我的控制之下)。
非常感谢您的帮助。谢谢。
【问题讨论】:
-
“根据来自另一个论坛的电子邮件回复” - 哪个论坛,您可以提供链接吗?
标签: spring-security jwt microservices netflix-zuul keycloak