【问题标题】:Spring security oauth2 with 2 applications (same client ID and client secret)具有 2 个应用程序的 Spring security oauth2(相同的客户端 ID 和客户端密码)
【发布时间】:2022-12-15 01:03:27
【问题描述】:

我创建了一个 IT 解决方案,包括:

  • 包含 2 个客户端应用程序的 Angular 前端
  • 2 个 API,基于 Java
  • 第三方授权服务器(单点登录)

我使用 Spring security oauth2 (OIDC) 库进行身份验证。 2 个 Angular 客户端使用两个 API 并使用相同的客户端 ID 和密码。如果用户登录到第一个客户端应用程序,他们应该不是系统会提示您再次登录第二个客户端应用程序。

基本上这工作正常,但即使用户已经登录,第二个客户端应用程序也会尝试连接到授权端点。此外,当第二个客户端尝试访问授权端点时,会引发 CORS 异常。

我认为第二个客户端应该能够在不再次通过授权/令牌端点的情况下获取用户信息。上述方法是否正确?并且:我应该如何使用 Spring Security Oauth2 库处理这种情况(涉及 2 个或更多具有相同客户端 ID 和密码的客户端后端 Java 应用程序)?如何从第二个客户端应用程序获取用户信息?

当我尝试上述操作时,第二次 API 调用导致以下错误(成功登录后第一次 API 调用成功):

Retrieving domain category:
:8082/review-web/app/home:1 Access to XMLHttpRequest at 'https://gateway.cert.auth.com/affweb/CAS/oidc/EXTERNAL_v0/**authorize?**response_type=code&client_id=596346&scope=openid%20profile%20credential_data%20email&state=wmy3woFyTjrbhyE2aHXLrpFSEnbXnUG4rcx4pdcSZso%3D&redirect_uri=https://dev.local.com:8083/core-api/app/login/oauth2/code/core-api-client&nonce=ridDePx0JMeSv4qJkvv74xkV5ev-lvVMb7inhG8wzBs' (redirected from 'https://dev.local.com:8083/core-api/app/api/all/category') from origin 'https://dev.local.com:8082' has been blocked by CORS policy: No 'Access-Control-Allow-Origin' header is present on the requested resource.

【问题讨论】:

    标签: angular spring-boot spring-security cors spring-security-oauth2


    【解决方案1】:

    OAuth2 写法:

    • 授权服务器(不是身份验证)对用户进行身份验证并证明身份(发出访问、ID 和刷新令牌)
    • 客户是消耗 REST 资源的一个(在您的情况下是 Angular 应用程序)
    • 资源服务器提供资源(Spring 应用程序 @RestController

    我的 2 美分猜测是您使用 spring-boot-starter-oauth2-client 配置了用于 OAuth2 登录的 spring 应用程序。如果是这样,这是错误的。你应该改为:

    • 从您的 Angular 应用程序验证用户并发送授权请求(使用有效的访问令牌设置 Authorization 标头)。为此,请使用 OIDC 客户端库。我最喜欢的 Angular 是angular-auth-oidc-client
    • 使用spring-boot-starter-oauth2-resource-server(不是spring-boot-starter-oauth2-client)来保护 REST API 端点。不知道怎么做的请参考this tutorials

    最后,当从富客户端验证用户时,您应该使用“公共”客户端(没有客户端机密,因为这样的客户端无法获得实际上是机密的机密)。使用的流程应该是授权码与 PKCE.

    【讨论】:

    • ch4mp - 你是对的。我的意思是授权(不是身份验证)服务器,我使用 spring-boot-starter-oauth2-client。让我浏览一下您发送的链接。谢谢您的帮助!
    • ch4mp - 一些问题 1) 是否有任何特定原因选择 angular-auth-oidc-client(而不是 angular-oauth2-oidc)。 2)什么情况下可以使用spring-boot-starter-oauth2-client? 3)您是否有多个资源服务器(即多个后端 API)和一个身份验证服务器的示例。在这种情况下,我认为我们可以对所有资源服务器使用一个访问令牌或使用多个访问令牌(即每个资源服务器一个访问令牌)。
    • angular-auth-oidc-client 能够进行多租户:它可以同时保持多个身份验证上下文(使用来自授权服务器的访问令牌向 URI_A 发送请求,并使用来自另一个授权的访问令牌向 URI_B 发送请求-服务器)。它被广泛使用,即使不如 Angular-Oauth2-oidc 那么多,当我遇到阻塞问题时,维护人员似乎更关心。
    • 如果所有资源服务器都接受来自您的授权服务器的身份,是的,使用单个访问令牌。只需将您的客户端库配置为使用访问令牌定位授权标头(angular-auth-oidc-client 为此提供了一个 HTTP 拦截器)。但是,如果您的客户向其他域发出请求(例如调用 Facebook 或 Google API),则您必须使用不同的访问令牌授权请求。这是多配置上下文功能跳入的地方。
    • 谢谢。我相信最新版本(angular-auth-oidc-client 15.0.2)可以与 Angular 9.x 版本一起使用?
    猜你喜欢
    • 2015-06-25
    • 2012-10-22
    • 1970-01-01
    • 1970-01-01
    • 2021-03-07
    • 2013-06-20
    • 2017-11-16
    • 1970-01-01
    • 2017-07-06
    相关资源
    最近更新 更多