OAuth2表单登录成功后未跳转至授权决策页问题求助
问题排查与解决方案
我一眼就定位到了问题的核心:你的授权服务器没有为客户端注册合法的重定向URI(redirect_uri),这就是触发invalid_request错误的直接原因。OAuth2的授权码模式要求客户端必须预先在授权服务器登记允许的跳转地址,授权服务器会严格校验请求中的redirect_uri是否在注册列表内,不匹配就会直接拒绝请求。
步骤1:修改授权服务器配置,注册重定向URI
在你的AuthorizationServerConfig类的客户端配置块中,添加.redirectUris()方法,指定客户端请求中使用的http://localhost:8090/showEmployees地址:
@Configuration @EnableAuthorizationServer public class AuthorizationServerConfig extends AuthorizationServerConfigurerAdapter { @Bean public BCryptPasswordEncoder passwordEncoder() { return new BCryptPasswordEncoder(); } @Override public void configure(ClientDetailsServiceConfigurer clients) throws Exception { clients.inMemory() .withClient("javainuse") .secret("{noop}secret") .authorizedGrantTypes("authorization_code") .scopes("read") .authorities("CLIENT") // 关键:添加注册的重定向URI,必须和客户端请求的完全一致 .redirectUris("http://localhost:8090/showEmployees"); } }
重要注意点:
- 注册的
redirect_uri必须和客户端请求中的值完全匹配,包括协议(http/https)、域名、端口、路径,甚至大小写都不能出错 - 如果需要支持多个重定向地址,可以用逗号分隔,比如
.redirectUris("http://localhost:8090/showEmployees", "http://localhost:8090/callback")
步骤2:(可选)调整客户端请求的提交方式
你的JSP表单用了POST方法请求/oauth/authorize端点,虽然Spring Security OAuth2兼容POST,但授权码模式的标准请求方式是GET。建议把表单的method改成GET,避免潜在的兼容性问题:
<form:form action="http://localhost:8081/oauth/authorize" method="get" modelAttribute="emp">
验证修改后的流程
- 重启授权服务器和客户端服务
- 访问客户端的
/getEmployees页面,点击提交按钮 - 跳转到登录页,输入
admin/admin完成登录 - 此时应该会正常显示授权决策页,让你确认是否允许客户端访问
readscope的资源 - 授权后,会自动跳转到
http://localhost:8090/showEmployees,并在URL中带上授权码(code参数)
内容的提问来源于stack exchange,提问作者Mohit Darmwal
相关产品推荐
相关产品推荐

