Авторизация

Проекты NetPay используют стандартную схему JWT авторизации (документация: https://jwt.io/ и https://tools.ietf.org/html/rfc7519), то есть для работы с методами API вначале нужно запросить у сервера JWT токен, который уже будет использоваться в Bearer аутентификации.

Полученный токен нужно сохранить и использовать его для запросов. Не нужно создавать новый токен на каждый запрос! Время жизни JWT токена ограничено, и после его истечения токен становится недействительным.

Время жизни JWT определяется параметрами API ключа, и может быть изменено в настройках для каждого API ключа. Минимальное время жизни JWT 30 минут, максимальное 24 часа. По умолчанию значение TTL 24 часа.

Параметры JWT запроса:

  • exp - опциональный, время жизни JWT запроса. Не устанавливать его слишком большим и не оставляйте пустым, если вы не планируете переиспользовать запрос многократно.

  • jti - обязательный, уникальный идентификатор запроса.

  • алгоритм подписи JWT - RS256

  • все остальные опциональные параметры не используются и устанавливать их не обязательно.

Ниже приведены примеры кода для получения токена на Ruby, PHP и NodeJS, Python

<?php
// composer require lcobucci/jwt

// require __DIR__ . '/vendor/autoload.php';
use Lcobucci\JWT\Builder;
use Lcobucci\JWT\Signer\Key;
use Lcobucci\JWT\Signer\Rsa\Sha256;

$host = '{HOST, уточнить у поддержки}'; 
$private_key = '{приватный ключ, полученный на этапе создания API ключей}';
$uid = '{UID, полученный на этапе создания API ключей}';

$time       = time();
$signer     = new Sha256();
$privateKey = new Key(base64_decode($private_key, true));
$token      = (new Builder())->identifiedBy(bin2hex(random_bytes(12)))
                             ->expiresAt($time + 1 * 3600) // JWT Request TTL in seconds since epoch
                             ->getToken($signer, $privateKey);

$post_data = ['kid' => $uid, 'jwt_token' => strval($token)];

$ch = curl_init("https://$host/api/papi/session/jwt/");

curl_setopt_array($ch, [
    CURLOPT_POST           => true,
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_HTTPHEADER     => ['Content-Type: application/json'],
    CURLOPT_POSTFIELDS     => json_encode($post_data)
]);

$response = curl_exec($ch);

if (curl_getinfo($ch, CURLINFO_HTTP_CODE) != 200)
    die('Server error: ' . $response);

$token_data = json_decode($response, true);

var_dump(['$token_data' => $token_data]);
$token = $token_data['token'];

Last updated