Код: Выделить всё
@EnableWebSecurity
@Configuration
@EnableGlobalMethodSecurity(prePostEnabled = true, securedEnabled = true, jsr250Enabled = true)
public class SecurityConfig {
@Bean
public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
http.oauth2Login();
http.authorizeHttpRequests()
.anyRequest().authenticated();
return http.build();
}
@Bean
public ClientRegistration clientRegistration() {
ClientRegistration cr =
ClientRegistration.withRegistrationId("discord")
.clientId("123456")
.clientSecret("ABCD")
.scope(new String[]{"email", "identify"})
.authorizationUri("https://discord.com/oauth2/authorize")
.tokenUri("https://discord.com/api/oauth2/token")
.userInfoUri("https://discord.com/api/v10/users/@me")
.userNameAttributeName("username")
.clientName("Discord")
.authorizationGrantType(AuthorizationGrantType.AUTHORIZATION_CODE)
.redirectUri("http://localhost:8082/testauth")
.build();
return cr;
}
@Bean
public ClientRegistrationRepository clientRegistrationRepository() {
// maps each ClientRepository to its registrationId
return new InMemoryClientRegistrationRepository(clientRegistration());
}
}
[img]https://i.sstatic. net/65LXbSyB.png[/img]
Когда я впервые захожу на localhost:8082 (любая конечная точка, поскольку все конечные точки требуют аутентификации), код в Oauth2AuthorizationRequestRedirectFilter выполняется. OAuth2AuthorizationRequest создается и сохраняется в сеансе:


Вкл. первый запрос к localhost:8082 Oauth2AuthorizationRequestRedirectFilter выполняет:
[img]https://i.sstatic. net/CjONYprk.png[/img]
Он переходит в AbstractAuthenticationProcessingFilter:

И на этом этапе данные запроса были добавлено в сеанс:

Появится страница аутентификации Discord. Я нажимаю «Авторизовать», и в OAuth2AuthorizationRequestRedirectFilter он делегирует следующему фильтру:
[img]https://i.sstatic.net /wK3CuSY8.png[/img]
при этом он игнорирует все:
[img]https: //i.sstatic.net/1KGIbxQ3.png[/img]
Но тогда данные, видимо, сохраняются некоторыми фильтрами:

и он возвращается к первому фильтру Oauth2:

В браузере появится страница аутентификации Discord. Затем я нажимаю «Авторизовать».
Затем Oauth2AuthorizationRequestRedirectFilter делегирует следующему фильтру с помощью doFilter:

Однако после этого выполнение возвращается к Oauth2AuthorizationRequestRedirectFilter и сохраняет DefaultSavedRequest в сеансе, он содержит код, возвращенный Discord:
[img]https://i .sstatic.net/QSiPTzcn.png[/img]
А затем страница обновляется, и снова открывается окно аутентификации Discord.
Выполнение переходит к AbstractAuthenticationProcessingFilter , и он всегда переходит к следующему фильтру, код на этом этапе также сохраняется в сеансе:

И снова появляется страница аутентификации Discord.
Так по сути это выглядит как будто он никогда не переходит на второй этап аутентификации, никогда не запрашивает сам токен. Между тем код, который он получает от Discord, действителен, и я могу без проблем получить токен с помощью Postman.
Подробнее здесь: https://stackoverflow.com/questions/791 ... h2loginaut
Мобильная версия