Перейти к основному содержимому

Метод получения токена авторизации

Общие сведения

Метод позволяет сгенерировать JWE-токен с помощью приватного ключа, полученного в системе RuStore Консоль. Также метод проводит проверку активности владельца приложения.

подсказка

Для успешного выполнения запроса сгенерируйте приватный ключ.

Параметры взаимодействия

POST /public/auth/

warning

C 30.07 авторизация с помощью параметра companyId будет невозможна. Используйте параметр keyId для получения токена авторизации.

АтрибутТипОбяз.РасположениеОписаниеПример
companyIdstringДа, если не указан keyIdbodyid компании. Параметр будет недоступен с 30.07.123
keyIdstringДа, если не указан companyIdbodyid ключа
timestampstringДаbodyВремя отправки запроса. Не должно отличаться от текущего серверного времени более, чем на 60 секунд.2022-07-08T13:24:41.8328711+03:00
signaturestringДаbodyRSA-подпись SHA-512 hash от строки, содержащей companyId и timestamp запроса.
Алгоритм создания и проверки подписи: SHA512withRSA.

Необходимые действия для формирования signature:

1. Cоздаём сообщение для подписи, конкатенируя идентификатор ключа keyId или идентификатор комапнии companyId и текущую дату timestamp.

Пример:
keyId/companyId: 123
timestamp: 2024-06-18T11:49:08.290+03:00
• Получившееся сообщение (итог конкатенации): 1232024-06-18T11:49:08.290+03:00

2. Вычисляем хэш сообщения из п.1 с использованием алгоритма SHA-512, получаем 9d864a0…………3d757f.

3. Полученный в RuStore Консоль приватный ключ, который представлен в формате Base64 декодируем, чтобы получить приватный ключ RSA. Используем его для создания цифровой подписи хэша из п.2.

4. Кодируем подпись из п.3 в Base64 для получения signature, получившийся итог AkLM0pQM……….xw== и есть параметр signature.
N/A
примечание

Если у вас создано более 1 ключа, то необходимо использовать параметр keyId вместо companyId, для авторизации по всем приватным ключам и генерации параметра signature.

Пример получения токена авторизации

import sys
import base64
import datetime
import json
from Crypto.PublicKey import RSA
from Crypto.Signature import pkcs1_15
from Crypto.Hash import SHA512

def generate_signature(key_id, private_key_content):
private_key = RSA.import_key(base64.b64decode(private_key_content))

timestamp = datetime.datetime.now(datetime.timezone.utc).isoformat(timespec='milliseconds')
message_to_sign = key_id + timestamp
print("Message to sign:", message_to_sign)

hash_obj = SHA512.new(message_to_sign.encode())
signer = pkcs1_15.new(private_key)
signature_bytes = signer.sign(hash_obj)
signature_value = base64.b64encode(signature_bytes).decode()

return json.dumps({
"keyId": key_id,
"timestamp": timestamp,
"signature": signature_value
}, indent=2)

def main():
if len(sys.argv) < 3:
print("Обязательные параметры: keyId - id ключа, privateKey - приватный ключ\nПример: python ruStoreTokenGenerator.py 354751 MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQClnpt+5Ndcz/GBz5cXL0Z5u/nowqXWv+KwyQijSLClgar/r1jy2bnTAnvBssTOqQN...")
else:
key_id = sys.argv[1]
private_key_content = sys.argv[2]
print(generate_signature(key_id, private_key_content))

if __name__ == "__main__":
main()

В случае проблем с пониманием алгоритма генерации параметра signature используйте .jar файл для генерации данного параметра:

.jar файл для companyId;

.jar файл для keyId.

Передайте ID компании или ID ключа и полученный приватный ключ. В ответ вы получите тело для запроса POST /public/auth/ с параметрами companyId/keyId, timestamp и signature.

подсказка

Сформированный параметр параметра signature действует 1 минуту, так как напрямую зависит от timestamp.

Параметры ответа

АтрибутТипОбязателенОписаниеПример
codestringДаКод ответа.error/OK
messagestringНетРасшифровка кода ответа, в случае ошибки.Range timestamp not valid
body{}objectДаN/AN/A
timestamptimestamptzДаВремя ответа.2022-07-08T13:24:41.8328711+03:00

body

АтрибутТипОбязателенОписаниеПример
jwestringДаТокен доступа к RuStore API (содержимое payload ниже). Многоразового использования.eyJjdHkiOiJK…sv16aBl8tTg.VkWuTw
ttlintДаСрок жизни токена в секундах. Срок жизни составляет 900 секунд.900

Возможные ошибки

codemessageОписаниеВозможные действия
400Range timestamp not validПараметр timestamp отличается более чем на 60 секунд.Обновите timestamp и signature
404Company key not foundНе найден закрытый ключ по переданному companyId.Проверьте создан ли закрытый ключ у данной companyId и его актуальность.
400Company key disabledПриватный ключ по переданному companyId удален.Проверьте создан ли приватный ключ у данной companyId и его актуальность.
400Signature encode errorПараметр signature сгенерирован некорректноНеобходимо заново сгенировать параметр signature.
404You cannot use this action because the company is not foundКомпания с переданным companyId отсутвует или не активна.Проверьте параметр companyId на его актуальность.
400You can't use this action because the company is bannedКомпания с переданным companyId заблокирована.Проверьте параметр companyId на его актуальность.
400KeyId or companyId must be not nullОбязательно использование одного из параметров keyId или companyId.Проверьте, что указан параметр keyId или companyId.
400Incorrect usage of companyId. Please use keyIdУ вас создано более одного приватного ключа, необходимо использовать параметр keyId.Воспользуйтесь параметром keyId.

Пример запроса

curl --location 'https://public-api.rustore.ru/public/auth' \
--header 'Content-Type: application/json' \
--data '{
"companyId":"1275328",
"timestamp":"2023-08-11T13:31:17.580+03:00",
"signature":"U4kh.......nFkbuw=="
}

Пример успешного ответа

{
"code": "OK",
"message": null,
"body": {
"jwe": "eyJlbmMiOiJBM......nuuM227D_O1A",
"ttl": 900
},
"timestamp": "2023-08-11T13:31:33.171847393+03:00"
}