Authorization_code 授予重定向问题
Authorization_code grant redirection issue
我已经实施了 authorization_code 授权流程,当我的 Auth 服务器在本地 运行 时,它工作正常。
客户端正在重定向到身份验证服务器登录页面
/oauth/authorize
终点.
在 成功登录后 它被重定向到 /oauth/authorize
调用中提供的 redirect_uri
并在那里获得 authorization_code
.
很好。
问题是当授权服务器放在代理后面时成功登录客户端后的最后一步是假定 获取重定向资源上的 authorization_code
根本不起作用。它总是被重定向到 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
但是上面的 none 有效。我也尝试了其他一些选项,但我想它们在这里不值得一提。
我不知道是漏掉了什么还是配置有误。
更新: 成功登录重定向不会发生在 /ouath/authorize
本身,但如果登录失败,它会被重定向到 /login?error
登录页面
此外,它在 Tomcat 上本地 运行ning,但在代理后面的 Wildfly 上。我调试了它,发现 Tomcat 中有一个库:org.apache.coyote.http11.AbstractHttp11Processor
它维护一个 RequestInfo
对象,其中包含带有所有参数的原始 /oauth/authorize
请求。当通过 Wildfly 调试时,找不到这样的对象。我分享以下供参考。我想现在它与服务器的关系比与代理的关系更大。
调试 tomcat
由于最初的问题仍然是个谜,我最终实现了该实现(虽然不是一个合适的解决方案)。下面是完整的设置
我尝试将 运行 应用程序打包为 jar,但随后遇到了加载 JSP 的问题。为此,一些解决方案建议将所有 JSP 放在 /src/main/resources/META-INF/resources/WEB-INF/jsp
文件夹下。但就我而言,我无法让它工作。
作为一种解决方案,我没有将应用程序打包为 jar,而是将其打包为 WAR,默认使用 JSP,运行 将其打包为 带有嵌入式 Apache Tomcat 的 jar
版本 8.5.27 (Spring Boot 1.5.10.RELEASE)
对于 运行 超过 Tomcat 的 JSP,在 pom 文件中添加了下面
注意: 我遇到的一些解决方案建议 <scope>
被重视 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>
我希望这对遇到同样问题的人有所帮助。欢迎任何answers/comments。
我已经实施了 authorization_code 授权流程,当我的 Auth 服务器在本地 运行 时,它工作正常。
客户端正在重定向到身份验证服务器登录页面
/oauth/authorize
终点.在 成功登录后 它被重定向到
/oauth/authorize
调用中提供的redirect_uri
并在那里获得authorization_code
.
很好。
问题是当授权服务器放在代理后面时成功登录客户端后的最后一步是假定 获取重定向资源上的 authorization_code
根本不起作用。它总是被重定向到 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
但是上面的 none 有效。我也尝试了其他一些选项,但我想它们在这里不值得一提。
我不知道是漏掉了什么还是配置有误。
更新: 成功登录重定向不会发生在 /ouath/authorize
本身,但如果登录失败,它会被重定向到 /login?error
登录页面
此外,它在 Tomcat 上本地 运行ning,但在代理后面的 Wildfly 上。我调试了它,发现 Tomcat 中有一个库:org.apache.coyote.http11.AbstractHttp11Processor
它维护一个 RequestInfo
对象,其中包含带有所有参数的原始 /oauth/authorize
请求。当通过 Wildfly 调试时,找不到这样的对象。我分享以下供参考。我想现在它与服务器的关系比与代理的关系更大。
调试 tomcat
由于最初的问题仍然是个谜,我最终实现了该实现(虽然不是一个合适的解决方案)。下面是完整的设置
我尝试将 运行 应用程序打包为 jar,但随后遇到了加载 JSP 的问题。为此,一些解决方案建议将所有 JSP 放在
/src/main/resources/META-INF/resources/WEB-INF/jsp
文件夹下。但就我而言,我无法让它工作。 作为一种解决方案,我没有将应用程序打包为 jar,而是将其打包为 WAR,默认使用 JSP,运行 将其打包为 带有嵌入式 Apache Tomcat 的 jar 版本 8.5.27 (Spring Boot 1.5.10.RELEASE)对于 运行 超过 Tomcat 的 JSP,在 pom 文件中添加了下面
注意: 我遇到的一些解决方案建议 <scope>
被重视 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>
我希望这对遇到同样问题的人有所帮助。欢迎任何answers/comments。