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

Problem z autoryzacją moich żądań do Spotify API za pośrednictwem Postmana

Object Storage Arubacloud
0 głosów
71 wizyt
pytanie zadane 22 września 2023 w Java przez MKolaj15 Bywalec (2,270 p.)

Buduję serwis Spring Boot przy użyciu Spotify Web API i chciałem przetestować metody kontrolera. Za pomocą przeglądarki mogłem sprawdzić żądanie GET i wszystko działało poprawnie - otrzymałem oczekiwane odpowiedzi. Problem wystąpił, gdy chciałem sprawdzić żądania POST za pomocą Postmana. Pomimo skonfigurowania autoryzacji poprzez OAuth 2.0 w Postmanie i otrzymania tokenów dostępu, przy każdej próbie złożenia żądania zwracany był kod źródłowy strony logowania Spotify, niezależnie od tego, czy było to żądanie POST, czy GET.

Tak wygląda moja konfiguracja Spotify w pliku application.properties:
 

spring.security.oauth2.client.registration.spotify.client-id=${SPOTIFY_CLIENT_ID}
spring.security.oauth2.client.registration.spotify.client-secret=${SPOTIFY_CLIENT_SECRET}
spring.security.oauth2.client.registration.spotify.authorization-grant-type=authorization_code
spring.security.oauth2.client.registration.spotify.redirect-uri=http://localhost:8080/login/oauth2/code/spotify
spring.security.oauth2.client.registration.spotify.scope=user-read-email,user-read-private
spring.security.oauth2.client.provider.spotify.authorization-uri=https://accounts.spotify.com/authorize
spring.security.oauth2.client.provider.spotify.token-uri=https://accounts.spotify.com/api/token

spring.security.oauth2.client.registration.spotify.provider=spotify
spring.security.oauth2.client.provider.spotify.user-info-uri=https://api.spotify.com/v1/me
spring.security.oauth2.client.provider.spotify.user-name-attribute=id

Mam ten sam identyfikator przekierowania URI ustawiony w ustawieniach aplikacji na stronie Spotify.

Serwis, w której znajduje się przykładowa metoda, którą chciałem przetestować, wygląda następująco:
 

@Service
@RequiredArgsConstructor
public class SpotifyService {

    private final RestTemplate restTemplate;
    private final String BASE_URL = "https://api.spotify.com/v1/";

    private final ObjectMapper objectMapper;

    public <T> T fetchData(String id, String endpoint, String accessToken, Class<T> responseType) {
        HttpHeaders headers = new HttpHeaders();
        headers.setBearerAuth(accessToken);
        HttpEntity<String> entity = new HttpEntity<>("parameters", headers);

        ResponseEntity<String> response = restTemplate.exchange(
                BASE_URL + endpoint + "/" + id,
                HttpMethod.GET,
                entity,
                String.class
        );

        try {
            return objectMapper.readValue(response.getBody(), responseType);
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }
    }

    public ArtistDto getArtist(String artistId, String accessToken) {

        return fetchData(
                artistId,
                "artists",
                accessToken,
                ArtistDto.class
        );
    }
}

I kontroler do tego:
 

@RestController
@RequiredArgsConstructor
@RequestMapping("/api/spotify")
public class SpotifyController {

    private final SpotifyService spotifyService;
    private final TokenService tokenService;

    @GetMapping("/artists/{id}")
    public ResponseEntity<ArtistDto> getArtist(@PathVariable String id) {
        String accessToken = tokenService.getAccessToken();
        ArtistDto artistDto = spotifyService.getArtist(id, accessToken);

        return ResponseEntity.ok(artistDto);
    }
}

mam również ten TokenService, który zapewnia mi token dostępu:
 

@Service
@RequiredArgsConstructor
public class TokenService {
    private final OAuth2AuthorizedClientService authorizedClientService;

    public String getAccessToken() {
        Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
        OAuth2AuthenticationToken oauthToken = (OAuth2AuthenticationToken) authentication;
        OAuth2AuthorizedClient client = authorizedClientService.loadAuthorizedClient(
                oauthToken.getAuthorizedClientRegistrationId(),
                oauthToken.getName()
        );

        return client.getAccessToken().getTokenValue();
    }
}

Tak jak mówiłem, gdy sprawdzam działanie tej metody w przeglądarce, zwraca mi poprawne dane w formacie JSON, natomiast gdy robię to w Postmanie, otrzymuję kod źródłowy strony logowania Spotify.

Tak wygląda moja konfiguracja OAuth 2.0 w Postman:

Nie używam zakresów, ponieważ chcę dostać się do danych publicznych. Próbowałem także zmienić Typ przyznania na Client Credentials, ale wynik jest taki sam - token jest wygenerowany poprawnie i zawarty w nagłówkach, ale odpowiedzią nadal jest strona logowania.

Próbowałem także utworzyć endpoint, który zwraca bieżący token dostępu za pośrednictwem przeglądarki i wklejać ten token do Postmana przy użyciu autoryzacji Bearer Token, ale nadal bezskutecznie.

Naprawdę mam nadzieję, że ktoś pomoże mi rozwiązać ten problem.

1 odpowiedź

+2 głosów
odpowiedź 22 września 2023 przez Wiciorny Ekspert (270,230 p.)

Jeśli otrzymujesz poprawne dane w formacie JSON, gdy próbujesz tę samą operację w przeglądarce, ale otrzymujesz stronę logowania Spotify w Postmanie, to definitywnie uważam, żę  Postman nie przekazuje odpowiednich danych uwierzytelniających lub nagłówków w twoim rządaniu. 

Prześledź, czy POSTMAN nie nadpisuje kodowania nagłówków: Spotify wymaga Base64 w zakresie  kodowania autoryzacji np (Authorization: Basic {base64_encoded_client_credentials}), content do Spotfiy api to głównie Content-Type: application/x-www-form-urlencoded

Nie wiem czy logowanego użtykownika, masz w ramach tokenowej sesji natomiast, nie wiem też czy postman faktycznie traktuje "usera" za zalogowanego i OAuth- nie traktuje Postaman jako zewnętrznego requestu z niezaufanego źródła, blokując autoryzacje 


Postman ma wbudowaną funkcję do obsługi OAuth 2.0. Wieć sprawdź, że korzystasz z niej i poprawnie skonfigurowałeś tam autoryzację tzn  w środowisku Postman.

Podobne pytania

0 głosów
1 odpowiedź 527 wizyt
pytanie zadane 10 marca 2023 w Inne języki przez kubekszklany Gaduła (3,190 p.)
0 głosów
1 odpowiedź 780 wizyt
pytanie zadane 2 grudnia 2017 w C# przez Resho Nowicjusz (190 p.)
+3 głosów
2 odpowiedzi 668 wizyt
pytanie zadane 16 kwietnia 2018 w Offtop przez kevin Mądrala (5,010 p.)

92,583 zapytań

141,434 odpowiedzi

319,668 komentarzy

61,966 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.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...