Eu tento executar todos os 3 componentes oAuth do oAuth usando o Spring Boot 3.4.1. Eu usei os documentos oauth-server-docs e client + resource-server para implementar.
O cliente oAuth pode ter 2 modos:
- para fazer login de usuários usando OAuth 2.0 ou OpenID Connect 1.0, e
- para obter um token de acesso para usuários (usando RestClient/WebClient).
Quero usar ambos, o que é possível de acordo com a documentação .
Meu código - todos os componentes - está no GitHub: https://github.com/OhadR/oAuth2-sample
Tudo parece funcionar bem, exceto por uma coisa: quando o aplicativo cliente tenta chamar o servidor de recursos antes que o usuário tenha efetuado login, o servidor de recursos retorna 401 (o que é aceitável, eu acho), mas o aplicativo cliente, em vez de redirecionar para o servidor oauth, apenas retorna 500.
Tentei depurar o Spring, mas sem sucesso.
Vejo que em OAuth2AuthorizationRequestRedirectFilter.doFilterInternal()
, quando uma exceção é lançada do resto da cadeia de filtros, o Spring verifica se é ClientAuthorizationRequiredException
e, se for, ele sendRedirectForAuthorization()
. Mas no meu caso, por algum motivo, esse código nunca é executado (coloquei um ponto de interrupção lá e ele nunca para lá).
Além disso, vejo que AuthorizationCodeOAuth2AuthorizedClientProvider.authorize()
, que é o que supostamente lança o ClientAuthorizationRequiredException
, não é chamado. (Ele é chamado apenas no fluxo de "login", quando o aplicativo cliente chama o servidor de recursos depois que o usuário já está logado).
o que funciona? modo (1) acima, significando que o aplicativo cliente tem um botão "login", que chama /login/oauth2/code/{registrationId}. Isso redireciona para o servidor oauth, o usuário faz login e, então, quando o aplicativo cliente tenta chamar o servidor de recursos, ele funciona bem, obtém 200 com resposta.
Mas o modo (2) não está funcionando. O que estou perdendo?
Obrigado!