Я попытался реализовать свой собственный SSO-сервер, используя springboot 1.5.3 и клиентское приложение thymeleaf для его тестирования.
Но возникла проблема с использованием потока authorization_code для клиентского приложения.
Я подумал, что, возможно, что-то не так в конфигурации сервера, поэтому я попытался использовать почтальон для получения токена, и он работал отлично.
Случай, который не работает:
Я пытаюсь открыть защищенную страницу.
Допустим, 8080 - это порт сервера авторизации и 8081 - клиентское приложение.
Итак, когда я прочитал о потоке authorization_code, он должен работать следующим образом:
1. Откройте securedPage (8081)
3. Перенаправляет на страницу входа на сервер авторизации (8080)
3. Вывведите свои учетные данные.
4. Перенаправляет вас на страницу (8081) вместе с кодом.
5. Отправьте запрос с кодом токена.(/ oauth / token)
6. Вы будете перенаправлены на ваш сайт с помощью токена.
Но в моем случае это работает:
1. Откройте securedPage (8081)
2.Перенаправляет на XYZ (8081)
3. Перенаправляет на страницу входа на сервер авторизации (8080)
4. Вы вводите свои учетные данные.
5. Перенаправляет вас на XYZ (8081) вместе с кодом.
6. Появляется страница ошибки
XYZ = страница под путем / логином клиентского приложения.
Странно то, что по этому пути ничего нет.А в браузере я вижу только страницу ошибки 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();
}
Конфигурация клиентского приложения:
Веб-конфигурация
@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();
}
}
Итак, два моих самых больших вопроса:
Почему он перенаправляет меня через страницу входа в клиентское приложение(ЧТО НЕ СУЩЕСТВУЕТ), вместо того, чтобы перенаправить меня прямо на страницу входа сервера авторизации?
Почему я получаю сообщение об ошибке при получении токена доступа, а меня перенаправляют только для получения кода авторизации?Более того, это удалось, потому что на этой странице ошибки у меня есть код в параметрах.
UPDATE # 1
Ошибка произошла из-за свойства клиентского приложения
security.oauth2.client.client-authentication-схема = форма
, если это
security.oauth2.client.client-аутентификация-схема = заголовок
этоработает правильно, но все равно не отвечает, почему он перенаправляется на: 8081 / login и затем на: 8080 / login вместо просто на: 8080 / login?