Виды авторизации
На данный момент для пользователей существует 2 вида авторизации: авторизация по apiKey пользователя и авторизация по apiSecret пользователя (включает и apiKey авторизацию).
Авторизация по API-ключу пользователя apiKey
Необходимо указать в запросе заголовок с ключом Authorization и значением apiKey значение_ключа:
--header 'Authorization: apiKey iudu37-e3iu-e3yug3e'
Возможные ошибки:
- AuthorizationEmpty - не указан header Authorization;
- ApiKeyEmpty - не указан apiKey;
- ApiKeyWrong - указан некорректный apiKey;
Авторизация с использованием HMAC через ключ apiSecret
Для данного вида авторизации необходимо получить дополнительный к apiKey ключ - apiSecret. В заголовках теперь необходимо указывать 3 обязательных заголовка:
--header 'Authorization: apiKey iudu37-e3iu-e3yug3e'
--header 'Timestamp: 1694159260'
--header 'Hmac: 83845a422fea5c66b1f43ac49bfc760619b73792516602e20f8ab7f0d86ab24ef9c3eafb83775fc4bc40e9db4302a8c76b5b09fb07908f2bc3d0c298901920dd'
Authorization - базовый ключ авторизации: apiKey значение_ключа.
Timestamp - временная метка в utc формате (0 часовой пояс). Метка действительна в течение 10 минут. Для проверки метки можно воспользоваться данным сервисом.
Hmac - SSH-хэш (SHA512), посчитанный из строки "apiKey + apiSecret + Timestamp + тело_запроса".
Как собрать Hmac?
Для того чтобы получить хэш Hmac, необходимо следовать следующим этапам:
- Преобразование тела запроса: удаление из него специальных символов и всех пробелов. Если тело запроса пустое, следует использовать пустую строку.
Как итог, должна получиться примерно следующая строка:
{"sender":{"contactType":1,"countryId":"RU","cityId":"d4dadcfd"},"receiver":{"contactType":1,"countryId":"RU","cityId":"d4dadcfd"},"cargo":{"cargoType":2,"cargoItems":[{"weight":0.5,"qty":1,"l":13.5,"h":10,"w":20,"volumeWeight":0,"description":"Ноутбук"}],"description":"Важныедокументы","customsValue":100.99,"customsCurrency":"RUB"},"pickupInfo":{"autoChangeTakeDate":true,"takeDate":"2023-06-30","timeFrom":"12:00","timeTo":"15:00"}}
- Составление строки для кодирования: apiKey + apiSecret + timestamp + преобразованное-тело-запроса.
- Получение строки для кодирования с помощью алгоритма SHA512. Ниже приведен пример:
var apiKey = "123qwerty";
var apiSecret = "secret";
var timestamp = 1694159260;
var str = "телозапроса";
var strToEncode = apiKey + apiSecret + timestamp + str; // strToEncode = "123qwertysecret1694159260телозапроса";
var hmac = ComputeHash(strToEncode); // hmac = "95b4e3c78e10759a1feb648b7f20a3496139d121fa43ad7022411bb835ca621602cea262b471223dcb34d94fe34fc0f08b6fcbd5f6278974f1ddf2843a488348";
Возможные ошибки:
- AuthorizationEmpty - не указан header Authorization;
- ApiKeyEmpty - не указан apiKey;
- ApiKeyWrong - указан некорректный apiKey;
- AuthorizationTimestampEmpty - не указан header Timestamp;
- TimestampWrong - указан некорректный Timestamp (метка устарела, указана позже текущего времени или указана не в utc);
- AuthorizationHmacEmpty - не указан header Hmac;
- HmacWrong - указан некорректный Hmac (зависит от всех полей, может быть неверным apiSecret ключ).