40

到目前为止,我阅读的大多数教程都使用API 网关@EnableOAuth2Sso而不是@EnableResourceServerAPI 网关。有什么区别?对比的是什么OAuth2Sso

详细信息:我正在为基于 spring 的微服务和单页应用程序实现安全/基础架构。有一段时间,虽然我们没有安全要求,但 SPA 直接与不同主机(CORS 方)上的开放微服务对话。

现在,我使用spring-oauthand添加了一层安全性和网关模式spring-zuul。所以我有一个带有 & 的服务(uaa-service)@EnableAuthorizationServer和一个带有@EnableZuulProxy&的网关@EnableResourceServer。我只需要密码授予类型,因此每个 SPA 都有自己的登录表单,并通过网关使用 uaa-service 令牌端点进行身份验证,然后继续使用该令牌进行进一步的请求。

这种方法有什么问题吗?我应该使用@EnableOAuth2Sso吗?

4

1 回答 1

81

这些注释用不同的OAuth 2.0 角色标记您的服务。

@EnableResourceServer注释意味着您的服务(根据 OAuth 2.0 - 资源服务器)需要访问令牌才能处理请求。在调用资源服务器之前,应该通过 OAuth 2.0 客户端从授权服务器获取访问令牌。

@EnableOAuth2Sso:将您的服务标记为 OAuth 2.0 客户端。这意味着它将负责将资源所有者(最终用户)重定向到用户必须输入其凭据的授权服务器。完成后,用户将使用授权码重定向回客户端(不要与访问码混淆)。然后客户端获取授权码并通过调用授权服务器将其交换为访问令牌。只有在那之后,客户端才能使用访问令牌调用资源服务器。

此外,如果您查看@EnableOAuth2Sso注释的源代码,您会看到两件有趣的事情:

  • @EnableOAuth2Client. 这是您的服务成为 OAuth 2.0 客户端的地方。如果您通过OAuth2RestTemplate.
  • @EnableConfigurationProperties(OAuth2SsoProperties.class). OAuth2SsoProperties 只有一个String loginPath默认属性/login/login这将拦截浏览器对by 的请求,OAuth2ClientAuthenticationProcessingFilter并将用户重定向到授权服务器。

我应该使用@EnableOAuth2Sso 吗?

这取决于:

  • 如果您希望 API 网关成为 OAuth 2.0 客户端,它使用Authorization Code FlowResource Owner Password Credentials Flow与浏览器交互,那么答案是肯定的,您可能应该这样做。我说可能是因为我不确定是否@EnableOAuth2Sso很好地支持资源所有者密码凭据流。无论如何,我建议你使用授权代码流,除非你真的(真的!)有充分的理由不这样做。顺便说一句,在使用授权代码流时,您可能希望将下游微服务标记为 @EnableResourceServer. 然后 API 网关将是 OAuth 2.0 客户端,而您的微服务将是 OAuth 2.0 资源服务器,这在我看来是合乎逻辑的。
  • 如果您不需要与浏览器交互(例如Client Credentials Flow)或者您有使用Implicit Flow的 SPA,那么您应该使用 @EnableResourceServer,这意味着它将仅接受具有有效访问令牌的请求。
于 2017-06-18T19:18:10.260 回答