Spring Cloud Gateway OAuth2 with Spring Security OAuth2 Authorization Server = loop

Posted

技术标签:

【中文标题】Spring Cloud Gateway OAuth2 with Spring Security OAuth2 Authorization Server = loop【英文标题】: 【发布时间】:2020-07-04 00:19:13 【问题描述】:

我正在尝试将 Spring Authorization Server 与 Spring Cloud Gateway 一起使用,但我一直无法获取用户信息。我可以在网关日志中看到类似

的消息

[2020-03-23 13:36:35,061] TRACE org.springframework.web.HttpLogging - [45961b04] Decoded [access_token=5b5a13f1-2b47-4739-bda2-74785f6e3828, token_type=bearer, expires_in=33556, scope=read]

这意味着授权工作正常,但在 302 FOUND Location: /res (protected resource) 之后它会将我转发回授权服务器。

完整代码在此处的演示项目中:https://github.com/looksworking/gw-oauth

授权服务器:

build.gradle.kts

application.yml

WebSecurityConfig

AuthZServerConfig

Spring Cloud 网关:

build.gradle.kts

application.yml

GatewayApplication

非常感谢任何帮助。

【问题讨论】:

【参考方案1】:

网关无法从授权服务器获取用户信息来创建主体。因此,由于缺少主体,它再次重定向到授权服务器。尝试在授权服务器中创建自定义用户信息端点。 (/userinfo 而不是 /oauth/userinfo)。您可能需要在安全配置中允许 /userinfo。

@RestController
public class UserInfoEndpoint 

    @PostMapping("/userinfo")
    public Map<String, Object> user() 
        Map<String, Object> map = new HashMap<>();
        String name = SecurityContextHolder.getContext().getAuthentication().getName();
        map.put("user_name", name);
        return map;
    


另外,将 user-info-authentication-method: form 添加到您的提供商。

【讨论】:

你绝对是对的——我错过了那个端点,我添加了它,我还在项目中添加了 UAA 服务器,这样我就可以从 100% 工作的 oauth 服务器切换到我的。当我切换到 UAA 时,我可以在日志中看到网关将 GET 到 /userinfo。我添加了这个端点,但我仍然得到这个循环,当我切换到我的授权服务器时,我没有在日志中看到任何 /userinfo 请求。相应地更新了 github 项目。 首先,让我们确保将 gw-oauth-auth 添加到本地 dns (/etc/host)。如果没有,请在网关提供商 yml 中使用 172.10.16.1 更改它们。其次,您在身份验证服务器中创建了端点。它在地图中返回“user_name”,但您在网关中设置了“user-name-attribute: sub”。在 auth 的 return 语句中更改为 user_name 或更改 sub。此外,您不需要提供程序中的 check-token-uri 和 jwk-set-uri 属性。多一个。您的重定向 uri 缺少注册 ID。设置为重定向 uri:“baseUrl/login/oauth2/code/registrationId”。 是的,在尝试一切的时候有点搞砸了名字,在我的情况下,你说的主要原因是正确的——redirect-uri 中没有注册 ID。非常感谢您的宝贵时间!

以上是关于Spring Cloud Gateway OAuth2 with Spring Security OAuth2 Authorization Server = loop的主要内容,如果未能解决你的问题,请参考以下文章

spring cloud gateway 如何工作

Spring Cloud Gateway集成

spring cloud gateway 的执行流程

spring cloud gateway 某些路由中跳过全局过滤器

spring cloud gateway 报错 Unable to find GatewayFilterFactory with name

Spring Cloud(18)——gateway