Authorization API - сервис, предоставляющий зашифрованный токен для приложений, требующих распознавания и синтеза речи в Neuro ASR/TTS. Работа с сервисом осуществляется по REST API. Перед началом работы с сервисом необходимо получить ключ в системе ASRaaS.
Пример Ключа:
{
"organization_uuid": "348f5995-f89a-4a11-95d3-5a7d277c2224",
"company_uuid": "4007e862-f598-4729-a209-04e802b1d0a4",
"user_uuid": "830fc260-6895-4ea7-9537-2a9d8075dd27",
"key_name": "testkey",
"key_uuid": "8588e564-8226-4b50-9a0e-92f365cae5c6",
"private_key": "-----BEGIN RSA PRIVATE KEY-----
MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIB ...
4ZllvQIh5roNs8XkZH/7I93Gvdz/dxOxskEle2fz+jfbJObQ/HCI=-----END RSA PRIVATE KEY-----",
"endpoint_asr": "wss://asr-asraas-stage.neuro.net/v2/recognize",
"endpoint_tts": "https://tts-asraas-stage.neuro.net/v2/synthesize",
"auth_url": "https://auth-asraas-test2.neuro.net/api/v1/auth",
"public_key_url": "https://auth-asraas-test2.neuro.net/api/v1/auth/public_key"
}
Ключ содержит все URL, необходимые для авторизации и работы с сервисом.
endpoint_asr |
ASR API |
endpoint_tts |
TTS API |
auth_url |
Authorization API |
public_key_url |
URL для получения публичного ключа сервера |
Перед тем как зашифровать запрос на авторизацию необходимо получить публичный ключ сервера. Для этой цели реализован специальный REST интерфейс. Ссылка содержится в параметре public_key_url
Ключа. Пример:
GET: https://auth-asraas-test2.neuro.net/api/v1/auth/public_key
Ответ возвращается в виде JSON-объекта. Пример:
{
"public_key": "LS0tLS1CRUdJTiBQVUJMSUMgS0VZ .. QU5SUlCQ2dLQ0FtFWS0tLS0t"
}
Значение ключа public_key
закодировано в base64
. В примере на Python для раскодирования необходимо использовать метод base64.b64decode
.
async def get_server_public_key(asr_aas_authorization_server_url: str):
async with aiohttp.ClientSession(headers={'Content-Type': 'application/json'}) as session:
async with session.get(asr_aas_authorization_server_url) as response:
data_response = await response.json()
data = base64.b64decode(data_response['public_key'])
with open(f"server_public.pem", "wb") as f:
f.write(bytes(data))
На основании приватного ключа пользователя private_key
из Ключа необходимо сгенерировать публичный ключ пользователя. Публичный ключ пользователя потребуется для формирования запроса на авторизацию.
Для операций с ключами в коде на Python используется модуль Crypto. Пример:
from Crypto.PublicKey import RSA
private_key = "-----BEGIN RSA PRIVATE KEY-----
\nMIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIB ...
YnvmsOH3ppczxWw4wqWqbTfE8wJ1Qu5Y12-----END RSA PRIVATE KEY-----"
client_private_key = RSA.importKey(private_key)
client_public_key = client_private_key.publickey()
JSON-структура для авторизации создается путем копирования параметров organization_uuid
, company_uuid
, user_uuid
, key_name
, key_uuid
из Ключа и добавлением публичного ключа пользователя public_key сгенерированного на предыдущем шаге.
{
"organization_uuid": "348f5995-f89a-4a11-95d3-5a7d277c2224",
"company_uuid": "4007e862-f598-4729-a209-04e802b1d0a4",
"user_uuid": "830fc260-6895-4ea7-9537-2a9d8075dd27",
"key_name": "testkey",
"key_uuid": "8588e564-8226-4b50-9a0e-92f365cae5c6",
"public_key": "-----BEGIN RSA PUBLIC KEY-----
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA34XSCoaI00 ...
aK7ePyEJJFEWrI11T65E0E1vWT7SDXteZjLTuUgQIDAQAB-----END RSA PUBLIC KEY-----",
}
Имея JSON-структуру для авторизации, публичный ключ сервера и приватный ключ пользователя, можно приступить к шифрованию запроса на авторизацию. Для шифрования используется алгоритм RSA. Результатом шифрования являются три зашифрованные строки:
Для шифрования в коде на Python используется модуль Crypto. Пример:
from Crypto.Signature import PKCS1_v1_5
from Crypto.Hash import SHA256 as SHA
from Crypto.PublicKey import RSA
from Crypto.Cipher import PKCS1_OAEP, AES
from Crypto import Random
def encrypt_message(plaintext: bytes, _from: str, to: str):
client_private, _ = load_keys(_from)
_, server_public = load_keys(to)
# Sign the message using client private key
text_hash = SHA.new(plaintext)
client_signature = PKCS1_v1_5.new(client_private)
client_signature = client_signature.sign(text_hash)
# Encrypt the signature with server's public key
server_cipher = PKCS1_OAEP.new(server_public)
client_signature_final = server_cipher.encrypt(client_signature[:128])
client_signature_final += server_cipher.encrypt(client_signature[128:])
# Generate random session key and init vector (iv)
session_key = Random.new().read(32)
iv = Random.new().read(16)
# Encrypt the message with symmetric algorithm AES
obj = AES.new(session_key, AES.MODE_CFB, iv)
cipher_text = iv + obj.encrypt(plaintext)
# Encrypt the session key with server's public key
session_key_encrypted = server_cipher.encrypt(session_key)
return cipher_text, session_key_encrypted, client_signature_final
После завершения шифрования создается JSON-структура, состоящая из трех строк описанных выше и UUID Ключа (key_uuid
):
{
"key_uuid": "8588e564-8226-4b50-9a0e-92f365cae5c6",
"cipher_text": "wqvjwbM0aW6NKE8s1FX0Xk8 .. ABBoc1W3CSSz8yZ1",
"session_key_encrypted": "B9BR1QMYG .. 0k9VPMnh9Q==",
"signature_final": "EDEu1luvdlS3/03zVsG47KoMC .. W1T8EUU3QGTwD79vkRvFzXZHVk="
}
Сформированную на предыдущем шаге JSON-структуру необходимо отправить сервису авторизации в теле запроса POST. Ссылка для авторизации содержится в параметре auth_url
Ключа. Пример:
POST: https://auth-asraas-test2.neuro.net/api/v1/auth
Сервис авторизации расшифровывает полученные данные, используя публичный ключ пользователя и приватный ключ сервера. Сервис авторизации проверяет расшифрованные данные. Если проверка успешна, то формируется ответ, содержащий JWT:
{
"access_token": 'eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJleHAiOjE3MDA0NzkwMzksImtleV91
dWlkIjoiOTc4MDJkMWMtMGI2YS00MTU2LTk5MmYtZWUwZjA0NzY2YTJiIn0.iCIZy3G
Z1ZnykPiAvYadnefPKnGyWA_6XZk9j2JKyqI'
}
Если операция прошла неуспешно, сервис авторизации возвращает ответ вида:
{
'status': 'fail',
'message': 'key not found'
}