Authorization_code 授权重定向问题

Posted

技术标签:

【中文标题】Authorization_code 授权重定向问题【英文标题】:Authorization_code grant redirection issue 【发布时间】:2019-12-07 22:27:01 【问题描述】:

我已经实现了 authorization_code 授权流程,当我的身份验证服务器在本地运行时可以正常工作。

客户端通过重定向到身份验证服务器登录页面 /oauth/authorize 端点。

成功登录时,它会被重定向到/oauth/authorize 调用中提供的redirect_uri,它会在其中获得authorization_code

很好。

问题是当 Auth Server 放在代理后面时在成功登录客户端后的最后一步应该获取@987654327 @ 重定向资源根本不起作用。它总是被重定向到 Auth Server 的 root

为了处理这个问题,我创建了一个UsernamePasswordAuthenticationFilter,我在其中配置了 AuthenticationSuccessHandler,如下所示

@Bean
public SavedRequestAwareAuthenticationSuccessHandler successRedirectHandler() 
    SavedRequestAwareAuthenticationSuccessHandler savedSuccessHandler = new SavedRequestAwareAuthenticationSuccessHandler();
    savedSuccessHandler.setUseReferer(true);
    return savedSuccessHandler;


@Bean
public UsernamePasswordAuthenticationFilter usernamePasswordAuthenticationFilter() throws Exception

    UsernamePasswordAuthenticationFilter usernamePasswordAuthenticationFilter = new UsernamePasswordAuthenticationFilter();

    usernamePasswordAuthenticationFilter.setAuthenticationManager(authenticationManager());
    usernamePasswordAuthenticationFilter.setAuthenticationSuccessHandler(successRedirectHandler());

    return usernamePasswordAuthenticationFilter;

我还按照此处的建议在代理级别进行了一些配置。

<VirtualHost *:443>
ServerName my.domain.com
ProxyPass / http://127.0.0.1:8080/
RequestHeader set X-Forwarded-Proto https
RequestHeader set X-Forwarded-Port 443
ProxyPreserveHost On
</VirtualHost>

并在下面添加到我的 application.properties

server.use-forward-headers=true

但上述方法均无效。我也尝试了其他一些选项,但我想它们在这里不值得一提。

我不知道是遗漏了什么还是配置错误。

更新:成功登录重定向不会发生在/ouath/authorize 本身,但如果登录失败,它会被重定向到带有/login?error 的登录页面

此外,它在 Tomcat 上本地运行,但在代理后面的 Wildfly 上运行。我对其进行了调试,发现 Tomcat 中有一个库:org.apache.coyote.http11.AbstractHttp11Processor,它维护了一个 RequestInfo 对象,该对象包含带有所有参数的原始 /oauth/authorize 请求。在 Wildfly 上进行调试时,找不到这样的对象。我分享以下内容以供参考。我想现在它与服务器的关系比代理更重要。

在 tomcat 上调试

【问题讨论】:

【参考方案1】:

由于最初的问题仍然是个谜,我终于得到了实现(虽然不是一个合适的解决方案)。以下是完整的设置

我尝试将应用程序打包并作为 jar 运行,但随后遇到了加载 JSP 的问题。为此,一些解决方案建议将所有 JSP 放在 /src/main/resources/META-INF/resources/WEB-INF/jsp 文件夹下。但就我而言,我无法让它工作。 作为一种解决方案,我没有将应用程序打包为 jar,而是将其打包为带有默认 JSP 的 WAR,并将其作为带有嵌入式 Apache Tomcat 的 jar 运行 版本 8.5.27 (Spring Boot 1.5.10.RELEASE)

为了在 Tomcat 上运行 JSP,以下已添加到 pom 文件中

注意: 我遇到的一些解决方案建议将&lt;scope&gt; 视为provided。就我而言,没有它也可以工作。明确提及它,如下评论。

   <dependency>
        <groupId>org.apache.tomcat.embed</groupId>
        <artifactId>tomcat-embed-jasper</artifactId>
        <!--<scope>provided</scope>-->
    </dependency>
   <dependency>
        <groupId>javax.servlet</groupId>
        <artifactId>jstl</artifactId>
        <!--<scope>provided</scope>-->
    </dependency>

如果有人偶然发现同样的问题,我希望这会有所帮助。欢迎任何答案/cmets。

【讨论】:

以上是关于Authorization_code 授权重定向问题的主要内容,如果未能解决你的问题,请参考以下文章

部分视图和视图的授权重定向

JWT 授权重定向到登录

在 React 和 NodeJS 中未经授权重定向之前刷新令牌

部分视图和视图的授权重定向

Google 数据 API 授权重定向 URI 不匹配

会话到期时的授权重定向不适用于提交 JSF 表单,页面保持不变