【发布时间】: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 上进行调试时,找不到这样的对象。我分享以下内容以供参考。我想现在它与服务器的关系比代理更重要。
【问题讨论】:
标签: apache spring-boot proxy wildfly spring-security-oauth2