Java HttpsURLConnection — Авторизация с помощью Spotify API

#java #api #authorization #spotify

Вопрос:

Я пытался заставить это работать в течение нескольких дней. Я пытаюсь авторизоваться с помощью Spotify, используя поток авторизации учетных данных клиента с использованием Java. Тем не менее, я продолжаю получать ошибку HTTP с требуемой длиной 411, несмотря на наличие свойства Content-Length.

 HttpsURLConnection spotifyAccounts = null;
            try {
                spotifyAccounts = (HttpsURLConnection) new URL("https://accounts.spotify.com/api/token?grant_type=client_credentials").openConnection();
                spotifyAccounts.setDoOutput(true);
                spotifyAccounts.setDoInput(true);
                spotifyAccounts.setRequestMethod("POST");
                String unencodedAuthorizationKey = "Basic "   "42f48d16044a4c79b5168c5784889827"   ":"   "d6bb7a72e99342319e6b6d8c6fd3cedd";
                String encodedKey = Base64.getEncoder().encodeToString(unencodedAuthorizationKey.getBytes());
                spotifyAccounts.setRequestProperty("Authorization", encodedKey);
                spotifyAccounts.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
                spotifyAccounts.setRequestProperty("User-Agent", "Mozilla/5.0");
                int totalLength = 0;
                for(Entry<String, List<String>> entry : spotifyAccounts.getRequestProperties().entrySet()) {
                    for(String string : entry.getValue()) {
                        totalLength  = string.getBytes().length;
                    }
                }
                spotifyAccounts.setRequestProperty("Content-Length", String.valueOf(totalLength));
                spotifyAccounts.connect();
            } catch(IOException ex) {}
 

Каждый раз, когда я получаю ошибку 411, я выводю значение свойства запроса длины содержимого примерно так:

 int code = 0;
            try {
                code = spotifyAccounts.getResponseCode();
            } catch (IOException ex) {
                ex.printStackTrace();
            }
            if(code != 200) {
                if(code == 411) {
                    System.out.println("Spotify Accounts - Content-Length: "   spotifyAccounts.getContentLength());
                    System.out.println("Spotify Accounts - Connecting User Agent: "   spotifyAccounts.getRequestProperty("User-Agent"));
                }
                // Other error code handling
            }
 

Вывод длины содержимого всегда возвращает значение 1564.

Я перепробовал много вещей, таких как изменение HttpsURLConnection на HttpURLConnection, изменение заголовка типа содержимого и прямое указание длины содержимого на 0. Но все эти решения по-прежнему возвращают ошибку требуемой длины 411. Есть ли что-то еще, что я упускаю, или я чего-то не понимаю?

Ответ №1:

В документации spotify говорится, что вам нужно указать grant_type в теле запроса, однако ?grant_type=client_credentials это не работает. Вместо этого вы можете отправить тело, подобное этому:

     byte[] input = "grant_type=client_credentials".getBytes(StandardCharsets.UTF_8);
    try (OutputStream os = connection.getOutputStream()) {
        os.write(input);
    }