Код: Выделить всё
@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:

Затем он возвращается к Oauth2AuthorizationRequestRedirectFilter:< /p>

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

Но тогда данные, видимо, сохраняются некоторыми фильтрами:

и все вернется к первый Oauth2 фильтр:

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

Однако после этого выполнение возвращается к Oauth2AuthorizationRequestRedirectFilter, и он сохраняет DefaultSavedRequest в сеансе, он содержит код, возвращаемый Discord:

А затем страница обновится, и снова появится окно аутентификации Discord.
Выполнение переходит к AbstractAuthenticationProcessingFilter, и оно всегда переходит к следующему фильтру; код на этом этапе также сохраняется в сеансе:

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