将 Keycloak 与 Angular 和 Spring Boot 集成以进行身份验证/授权

问题描述 投票:0回答:1

我目前正在致力于通过 Keycloak 保护使用 Angular 16 和 Spring Boot 3.2 的应用程序。为了实现这一目标,我添加了

spring-boot-starter-oauth2-client
spring-boot-starter-oauth2-resource-server
依赖项。我的目标是在后端实现authorization_code 流程,而不使用公共客户端。这是我当前的安全配置:

httpSecurity
    .cors(Customizer.withDefaults())
    .csrf(AbstractHttpConfigurer::disable)
    .authorizeHttpRequests(this::getAuthorizeRequests)
    .oauth2ResourceServer(oauth2 -> oauth2.jwt(Customizer.withDefaults()))
    .oauth2Login(loginConfig ->
        loginConfig.tokenEndpoint(Customizer.withDefaults()).userInfoEndpoint(Customizer.withDefaults())
    )
    .logout(Customizer.withDefaults())
    .sessionManagement(manager -> manager.sessionCreationPolicy(SessionCreationPolicy.STATELESS));

还有我的财产:



spring.security.oauth2.resourceserver.jwt.issuer-uri=http://localhost:8000/auth/realms/timetable-local

spring.security.oauth2.client.provider.keycloak.issuer-uri=http://localhost:8000/auth/realms/my-realm
spring.security.oauth2.client.registration.keycloak.provider=keycloak
spring.security.oauth2.client.registration.keycloak.client-name=my-client
spring.security.oauth2.client.registration.keycloak.client-id=my-client
spring.security.oauth2.client.registration.keycloak.client-secret=secret
spring.security.oauth2.client.registration.keycloak.scope=openid,offline_access,profile
spring.security.oauth2.client.registration.keycloak.authorization-grant-type=authorization_code

当尝试访问需要授权的 API 端点时,我遇到一系列 HTTP 302 重定向,如下所示:

  • 我对 http://localhost:8000/api/me 的请求导致 302 响应, 重定向到 http://localhost:8000/api/oauth2/authorization/keycloak。
  • 访问 http://localhost:8000/api/oauth2/authorization/keycloak 会导致另一个 302 响应,这次重定向到 Keycloak 认证页面。
  • 对 /auth 端点的最终请求被视为 XHR 请求。

我正在寻求有关调整 Angular 和 Spring Boot 配置的建议,以将浏览器重定向到 Keycloak 登录页面,而不是将其作为 HTTP 请求处理。任何人都可以提供有关如何有效配置 Angular 和 Spring Boot 来实现此行为的指导或分享他们的经验吗?

预先感谢您的协助。

angular spring-boot spring-security oauth-2.0 keycloak
1个回答
0
投票

我想到的解决方案是更改Spring客户端发送的重定向的一些HTTP状态:使用到达单页应用程序代码的

2xx
范围内的内容(而不是由浏览器处理的
3xx
)应用程序的前面)。

我在我的启动器中实现了这一点,并使用我authorizationEdpoint

上配置的
自定义重定向策略。这个入门程序简化了您在某些时候可能需要的许多其他功能的配置:让前端决定在登录后将用户重定向到哪里,正确提供 cookie CSRF 保护(这是强制性的,因为您的前端已获得会话授权,不是代币)等

顺便说一句,配置为客户端的 API

oauth2Login
扩展性很差(它基于切换实例时必须共享或恢复的会话)。推荐的替代方案是使用中间件作为客户端,其职责仅限于:

  • 维持会话
  • 驱动授权代码流程
  • 在会话中存储令牌
  • 将请求从前端路由到资源服务器时,将会话 cookie 替换为会话中的访问令牌(使用令牌保护的 REST API)

带有

spring-boot-starter-oauth2-client
TokenRelay=
过滤器的 Spring Cloud Gateway 非常适合这样的 BFF,我在 Baeldung 上写了关于这一点的教程。

© www.soinside.com 2019 - 2024. All rights reserved.