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:
Изображение

Затем он возвращается к 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
Ответить

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

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

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

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

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