我试图使用springboot 1.5.3和thymeleaf客户端应用程序来实现自己的SSO服务器以对其进行测试。
但是对于客户端应用程序使用authorization_code流时出现问题。
我以为服务器配置中的某些问题是错误的,这就是为什么我尝试使用邮递员获取令牌并且它运行良好的原因。
不起作用的情况是:
我尝试打开受保护的页面。
假设8080是授权服务器的端口,而客户端应用程序的8081是端口。
因此,当我阅读authorization_code流时,它应该像这样工作:
1.打开securePage(8081)
3.重定向到授权服务器(8080)的登录页面
3.您编写凭据。
4.将您与代码一起重定向到页面(8081)。
5.发送带有令牌代码的请求。 (/ oauth / token)
6.您将使用令牌重定向到您的网站。
但是对于我来说,它是有效的:
1.打开securePage(8081)
2。重定向到XYZ(8081)
3.重定向到授权服务器(8080)的登录页面
4.您编写凭据。
5. 将您与代码一起重定向到XYZ(8081)。
6.错误页面出现
XYZ =客户端应用程序路径/ login下的页面。
奇怪的是,此路径下没有任何东西。在浏览器中,我只能看到Whitelabel错误页面
发生意外错误(类型=未经授权,状态= 401)。
身份验证失败:无法获取访问令牌
授权服务器应用程序配置:
授权服务器
@Configuration
@EnableAuthorizationServer
public class AuthServerConfig extends AuthorizationServerConfigurerAdapter
{
private final AuthenticationManager authenticationManager;
@Autowired
public AuthServerConfig(AuthenticationManager authenticationManager) {
this.authenticationManager = authenticationManager;
}
@Override
public void configure(final AuthorizationServerEndpointsConfigurer endpoints) {
endpoints.tokenStore(tokenStore())
.authenticationManager(authenticationManager);
}
@Override
public void configure(final ClientDetailsServiceConfigurer clients) throws Exception {
clients.inMemory()
.withClient("clientId")
.secret("secret")
.scopes("read", "write")
.authorizedGrantTypes("password", "client_credentials", "authorization_code", "implicit")
.accessTokenValiditySeconds(3600)
.autoApprove(true)
.redirectUris("http://localhost:8081/login");
}
@Override
public void configure(
AuthorizationServerSecurityConfigurer oauthServer) {
oauthServer.tokenKeyAccess("permitAll()")
.checkTokenAccess("isAuthenticated()");
}
@Bean
public TokenStore tokenStore() {
return new InMemoryTokenStore();
}
}
网络安全:
@Configuration
@Order(1)
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
http.requestMatchers()
.antMatchers("/login", "/oauth/authorize")
.and()
.authorizeRequests()
.anyRequest().authenticated()
.and()
.formLogin().permitAll();
}
客户端应用配置:
Web配置
@Configuration
@EnableOAuth2Sso
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
@Override
public void configure(HttpSecurity http) throws Exception {
http
.antMatcher("/**")
.authorizeRequests()
.antMatchers("/", "/login**", "/index**")
.permitAll()
.anyRequest()
.authenticated().and().csrf().disable();
}
}
所以我的两个最大问题是:
为什么它通过客户端应用程序的登录页面重定向我(不存在),而不是直接将我重定向到授权服务器的登录页面?
为什么我只为获取授权码而被重定向时却收到关于获取访问令牌的错误消息?而且,成功了,因为在此错误页面上,我的参数中包含代码。
更新#1
错误是由于客户端应用的属性
security.oauth2.client.client-authentication-scheme = form
如果是
security.oauth2.client.client-authentication-scheme = header
它可以正常工作,但是仍然不能回答为什么将其重定向到:8081 / login然后重定向到:8080 / login而不是仅仅重定向到:8080 / login吗?