• 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

Aruba Cloud - Virtual Private Server VPS
0 głosów
132 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 (280,450 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ź 848 wizyt
pytanie zadane 10 marca 2023 w Inne języki przez kubekszklany Gaduła (3,250 p.)
0 głosów
1 odpowiedź 842 wizyt
pytanie zadane 2 grudnia 2017 w C# przez Resho Nowicjusz (190 p.)
0 głosów
3 odpowiedzi 342 wizyt
pytanie zadane 17 listopada 2024 w Systemy operacyjne, programy przez whiteman808 Gaduła (3,430 p.)

93,329 zapytań

142,323 odpowiedzi

322,400 komentarzy

62,663 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

Wprowadzenie do ITsec, tom 1 Wprowadzenie do ITsec, tom 2

Można już zamawiać dwa tomy książek o ITsec pt. "Wprowadzenie do bezpieczeństwa IT" - mamy dla Was kod: pasja (użyjcie go w koszyku), dzięki któremu uzyskamy aż 15% zniżki! Dziękujemy ekipie Sekuraka za fajny rabat dla naszej Społeczności!

...