Работа с API. Не могу авторизоваться на тестовом API СДЭК

Делаю запрос на https://api.edu.cdek.ru/v2/calculator/tariff

(отсюда https://api-docs.cdek.ru/63345430.html)
(и отсюда https://api-docs.cdek.ru/29923849.html)

Передаю:

{
    "type": "2",
    "date": "2020-11-03T11:49:32+0700",
    "currency": "1",
    "tariff_code": "11",
    "from_location": {
        "code": 270
    },
    "to_location": {
        "code": 44
    },
    "services": [
        {
            "code": "CARTON_BOX_XS",
            "parameter": "2"
        }
    ],
    "packages": [
        {
            "height": 10,
            "length": 10,
            "weight": 4000,
            "width": 10
        }
    ]
}

И в headers:

Account EMscd6r9JnFiQ3bLoyjJY6eM78JrJceI
Secure password PjLZkKBHEiLK3YsjtNrt3TGNG0ahs3kG

Но когда пишу пробел в Secure password, то POSTMAN жалуется, а когда убираю его, возвращает:

{
    "requests": [
        {
            "type": "AUTH",
            "date_time": "2024-04-23T10:43:02+0000",
            "state": "INVALID",
            "errors": [
                {
                    "code": "v2_authorization_incorrect",
                    "message": "Authorization header is incorrect"
                }
            ]
        }
    ],
    "related_entities": []
}

Помогите пожалуйста


Ответы (1 шт):

Автор решения: nörbörnën

Прочитайте очень внимательно раздел Авторизация клиентов, там рассказано про то, что вам нужно получить токен аутентификации перед тем как выполнять запросы.

Последовательность действий должна выглядеть так:

Получение токена

const authRequestData = new FormData();
authRequestData.append('grant_type', 'client_credentials');
authRequestData.append('client_id', 'EMscd6r9JnFiQ3bLoyjJY6eM78JrJceI');
authRequestData.append('client_secret', 'PjLZkKBHEiLK3YsjtNrt3TGNG0ahs3kG');

// content-type должен быть "x-www-form-urlencoded"
const authRes = await fetch('https://api.edu.cdek.ru/v2/oauth/token', {
    method: 'POST',
    body: authRequestData
});
const { access_token } = await authRes.json();

Выполнение запроса

// content-type должен быть "application/json"
const tarifRes = await fetch('https://api.edu.cdek.ru/v2/calculator/tariff', {
    method: 'POST',
    headers: {
        Authorization: `Bearer ${access_token}`,
        'Content-Type': 'application/json'
    },
    body: JSON.stringify({ })
});
console.log(await tarifRes.json());

Кстати, в разделе "Калькулятор. Расчет по коду тарифа" приведён устаревший пример, данные в нём не проходят валидацию, но мой код будет работать и показывать диагностические сообщения, которыми ответил сервер.

→ Ссылка