Метод получения токена авторизации
Общие сведения
Метод позволяет сгенерировать 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̶ |
keyId | string | Да | body | id ключа | |
timestamp | string | Да | body | Время отправки запроса. Не должно отличаться от текущего серверного времени более, чем на 60 секунд. | 2022-07-08T13:24:41.8328711+03:00 |
signature | string | Да | body | RSA-подпись 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 |
Пример получения токена авторизации
- Python
- Java
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()
import java.security.InvalidKeyException;
import java.security.KeyFactory;
import java.security.NoSuchAlgorithmException;
import java.security.PrivateKey;
import java.security.Signature;
import java.security.SignatureException;
import java.security.spec.InvalidKeySpecException;
import java.security.spec.PKCS8EncodedKeySpec;
import java.text.SimpleDateFormat;
import java.util.Base64;
import java.util.Date;
public class SignatureGenerator {
public static void main(String[] args) throws NoSuchAlgorithmException, SignatureException, InvalidKeySpecException, InvalidKeyException {
if (args.length < 2) {
System.out.print("Обязательные параметры: keyId - id ключа, privateKey - приватный ключ\nПример: ruStoreTokenGenerator.jar 354751 MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQClnpt+5Ndcz/GBz5cXL0Z5u/nowqXWv+KwyQijSLClgar/r1jy2bnTAnvBssTOqQN...");
} else {
System.out.println(generateSignature(args[0], args[1]));
}
}
private static String generateSignature(String keyId, String privateKeyContent) throws NoSuchAlgorithmException, InvalidKeySpecException, InvalidKeyException, SignatureException {
KeyFactory kf = KeyFactory.getInstance("RSA");
PKCS8EncodedKeySpec keySpecPKCS8 = new PKCS8EncodedKeySpec(Base64.getDecoder().decode(privateKeyContent));
PrivateKey privateKey = kf.generatePrivate(keySpecPKCS8);
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSXXX");
String timestamp = dateFormat.format(new Date());
String messageToSign = keyId.concat(timestamp);
System.out.println("Message to sign: " + messageToSign);
Signature signature = Signature.getInstance("SHA512withRSA");
signature.initSign(privateKey);
signature.update(messageToSign.getBytes());
byte[] signatureBytes = signature.sign();
String signatureValue = Base64.getEncoder().encodeToString(signatureBytes);
return String.format("{\n \"keyId\":\"%s\",\n \"timestamp\":\"%s\",\n \"signature\":\"%s\"\n}\n", keyId, timestamp, signatureValue);
}
}
В случае проблем с пониманием алгоритма генерации параметра signature используйте .jar файл для генерации данного параметра.
Передайте ID ключа и полученный приватный ключ. В ответ вы получите тело для запроса POST /public/auth/
с параметрами keyId
, timestamp
и signature
.
подсказка
Сформированный параметр параметра signature действует 1 минуту, так как напрямую зависит от timestamp
.
Параметры ответа
Атрибут | Тип | Обязателен | Описание | Пример |
---|---|---|---|---|
code | string | Да | Код ответа. | error /OK |
message | string | Нет | Расшифровка кода ответа, в случае ошибки. | Range timestamp not valid |
body{} | object | Да | N/A | N/A |
timestamp | timestamptz | Да | Время ответа. | 2022-07-08T13:24:41.8328711+03:00 |
body{}
Атрибут | Тип | Обязателен | Описание | Пример |
---|---|---|---|---|
jwe | string | Да | Токен доступа к RuStore API (содержимое payload ниже). Многоразового использования. | eyJjdHkiOiJK…sv16aBl8tTg.VkWuTw |
ttl | int | Да | Срок жизни токена в секундах. Срок жизни составляет 900 секунд. | 900 |
Возможные ошибки
code | message | Описание | Возможные действия |
---|---|---|---|
400 | Range timestamp not valid | Параметр timestamp отличается более чем на 60 секунд. | Обновите timestamp и signature |
400 | Signature encode error | Параметр signature сгенерирован некорректно | Необходимо заново сгенерировать параметр signature . |
400 | KeyId 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"
}