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

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

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

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

подсказка

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

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

POST

https://public-api.rustore.ru/public/auth/

АтрибутТипОбяз.РасположениеОписаниеПример
̶c̶o̶m̶p̶a̶n̶y̶I̶d̶
Устарело
̶s̶t̶r̶i̶n̶g̶̶Д̶а̶,̶ ̶е̶с̶л̶и̶ ̶н̶е̶ ̶у̶к̶а̶з̶а̶н̶ ̶k̶e̶y̶I̶d̶̶b̶o̶d̶y̶̶i̶d̶ ̶к̶о̶м̶п̶а̶н̶и̶и̶̶1̶2̶3̶
keyIdstringДаbodyid ключа
timestampstringДаbodyВремя отправки запроса. Не должно отличаться от текущего серверного времени более, чем на 60 секунд.2022-07-08T13:24:41.8328711+03:00
signaturestringДаbodyRSA-подпись SHA-512 hash от строки, содержащей timestamp запроса.
Алгоритм создания и проверки подписи: SHA512withRSA.

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

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

Пример:
keyId: 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

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

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 файл для генерации данного параметра.

Передайте ID ключа и полученный приватный ключ. В ответ вы получите тело для запроса POST /public/auth/ с параметрами 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
400Signature encode errorПараметр signature сгенерирован некорректноНеобходимо заново сгенерировать параметр signature.
400KeyId must not be null, please use this parameter for token generationОбязательно использование одного из параметров keyId.Проверьте, что указан параметр keyId.

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

curl --location 'https://public-api.rustore.ru/public/auth' \
--header 'Content-Type: application/json' \
--data '{
"keyId":"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:17.580+03:00"
}