Поток авторизации возвращает 400 - PullRequest
0 голосов
/ 14 февраля 2020

Я пытался решить эту проблему в течение хорошего часа, и я не могу исправить это. Я использую node-fetch для своих запросов (это просто копия API Fetch для браузеров, но клонированная для Node). У меня есть следующий код:

fetch("https://accounts.spotify.com/api/token", {
    body: `grant_type=authorization_code&code=${req.query.code}&redirect_uri=${encodeURIComponent("http://localhost:3000/callback")}`,
    headers: {
        Authorization: `Basic ${btoa(my_client_id)}:${btoa(my_client_secret)}`,
        "Content-Type": "application/x-www-form-urlencoded"
    },
    method: "POST"
})

Это должно взять код из обратного вызова и отправить его в Spotify для токена refre sh.

Ожидаемое поведение:

Возвращаемое значение должно быть следующим: image

Фактическое поведение:

400 Bad Request (последовательно)

1 Ответ

2 голосов
/ 14 февраля 2020

Это работает. Похоже, вы неправильно кодируете учетные данные. Его base64({id}:{secret}) не base64({id}):base64({secret}).

Я использовал request-promise исключительно для удобства, поэтому, если вы исправите заголовок Authorization в своей выборке, он должен работать.

const rp = require('request-promise');

const clientId = 'xxx';
const clientSecret = 'xxx';

async function auth() {
    const credentialsBuffer = Buffer.from(`${clientId}:${clientSecret}`);
    const options = {
        method: 'POST',
        uri: 'https://accounts.spotify.com/api/token',
        form: {
            grant_type: 'client_credentials'
        },
        headers: {
            Authorization: `Basic  ${credentialsBuffer.toString('base64')}`
        },
    };
    const resp = await rp(options);
    console.log(resp);
}

(async () => {
    await auth();
})()
...