OAuth2 с Discord: OAuth2AuthorizationRequestRedirectFilter и OAuth2LoginAuthenticationFilter застряли в цикле. ТребуетсяJAVA

Программисты JAVA общаются здесь
Ответить
Anonymous
 OAuth2 с Discord: OAuth2AuthorizationRequestRedirectFilter и OAuth2LoginAuthenticationFilter застряли в цикле. Требуется

Сообщение Anonymous »

Я пытаюсь использовать Oauth2 с Discord в качестве провайдера. У меня такая конфигурация:

Код: Выделить всё

@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());
}
}
Однако всякий раз, когда он перенаправляется, это снова и снова страница аутентификации Discord. После некоторой отладки, описанной ниже, я понял, что, хотя код гранта принимается от Discord и сохраняется в сеансе, запрос на токен доступа никогда не отправляется, а OAuth2LoginAuthenticationFilter всегда завершается преждевременно.Установив точку останова внутри HttpSecurity, я вижу, что присутствуют два фильтра Oauth2:
[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
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «JAVA»