• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

question-closed Jak wykonać requesty do API chronionego OAuth2 (Spring)

Cloud VPS
+2 głosów
551 wizyt
pytanie zadane 5 lipca 2023 w Java przez Mikołaj Pątkowski Użytkownik (530 p.)
zamknięte 8 lipca 2023 przez Mikołaj Pątkowski
Korzystam ze Spring Boot 3 i Security 6. W mojej aplikacji działa zalogowanie się poprzez OAuth2. Teraz chcę wykonywać requesty do serwisu i dostawać z powrotem JSON. Problem jest w tym, że każdy request musi być autoryzowany przez access token.

W jaki sposób to zrobić? Muszę pobierać w jakiś sposób access token (może z obiektu Authorization) i dodawać go do każdego rest template, czy może jest jakieś lepsze rozwiązanie?

Pozdrawiam
komentarz zamknięcia: v

2 odpowiedzi

+2 głosów
odpowiedź 5 lipca 2023 przez Wiciorny Ekspert (281,450 p.)
wybrane 8 lipca 2023 przez Mikołaj Pątkowski
 
Najlepsza

No po to robisz autoryzacje, aby access token przydzielić i autoryzować użytkownika, więc wykonanie REQUESTU wymagające tokena jest niczym innym jak normalnym requrestem, z tym, że poprawna autoryzacja i identyfikacja klienta-  powoduje, że przydzielony jest mu token, który umożliwia dostęp. Ten token zwykle przesyłany jest w nagłówkach, nie jest trzymany na serwerze 

Nic nie musisz pobrać, bo tak naprawdę jeśli użytkownik jest autoryzowany, to ten token ma i on poleci w nagłówku.

Utworzyłeś jakąś klasę - tj. INTERCEPTOR, który będzie obsługiwał autoryzacje tokena  dla żądania? Np. poprzez automatyczne dodawanie access tokena do nagłówków? 
https://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/http/client/ClientHttpRequestInterceptor.html

Jeśli korzystasz z RestControlerów to możesz tez posiłkować się odbieraniem tego w RequestHeader 
https://docs.spring.io/spring-framework/reference/web/webflux/controller/ann-methods/requestheader.html
 

@GetMapping("/example")
    public String exampleRequest(@RequestHeader("Authorization") String authorizationHeader)

Ważne: 
- Twój frontend musi uzyskać token dostępu od serwera uwierzytelniającego,

- po stronie klienta token jest przchowywany zazwyczaj jest to przechowywane w pamięci podręcznej (np. w pamięci lokalnej lub w magazynie sesji
-  Przy wysyłaniu żądań z frontendu do backendu, token dostępu musi być dołączony jako nagłówek Authorization. Jest to zazwyczaj realizowane przez dodanie prefiksu "Bearer " przed tokenem dostępu i umieszczenie go w nagłówku Authorization.

+1 głos
odpowiedź 8 lipca 2023 przez Mikołaj Pątkowski Użytkownik (530 p.)

Dodałem Interceptor, który do każdego żądania dodaje access token

@Component
public class AccessTokenInterceptor implements ClientHttpRequestInterceptor {
    private OAuth2AuthorizedClientService authorizedClientService;

    @Autowired
    public AccessTokenInterceptor(OAuth2AuthorizedClientService authorizedClientService) {
        this.authorizedClientService = authorizedClientService;
    }

    @Override
    public ClientHttpResponse intercept(HttpRequest request, byte[] body, ClientHttpRequestExecution execution) throws IOException {
        // Add access token to request
        OAuth2AccessToken accessToken = getAccessToken();
        HttpHeaders headers = request.getHeaders();
        headers.add("Authorization", "Bearer " + accessToken.getTokenValue());

        return execution.execute(request, body);
    }

    private OAuth2AccessToken getAccessToken() {
        Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
        OAuth2AuthorizedClient auth2AuthorizedClient = authorizedClientService.loadAuthorizedClient("spotify", authentication.getName());
        return auth2AuthorizedClient.getAccessToken();
    }
}

Teraz do każdego RestTemplate dodaje ten intenceptor (lub deklaruję jeden restTeplate jako bean) i wszystkie żądania są automatycznie autoryzowane.

Podobne pytania

+1 głos
1 odpowiedź 772 wizyt
pytanie zadane 18 czerwca 2022 w Java przez `Krzychuu Stary wyjadacz (13,940 p.)
0 głosów
1 odpowiedź 640 wizyt
pytanie zadane 13 czerwca 2023 w Java przez Mikołaj Pątkowski Użytkownik (530 p.)
0 głosów
2 odpowiedzi 1,622 wizyt
pytanie zadane 10 sierpnia 2019 w Java przez Aisekai Nałogowiec (42,190 p.)

93,459 zapytań

142,454 odpowiedzi

322,724 komentarzy

62,837 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj

Kursy INF.02 i INF.03
...