Ошибка ответа DocuSign JWT invalid_request с использованием PHP - PullRequest
0 голосов
/ 18 июня 2020

У меня возникли проблемы с попыткой получить токен JWT из DocuSign, пока это фрагмент кода того, что я сделал (с использованием учетной записи DEVELOPER SANDBOX):

// Developer exmple
$header = [
    'typ' => 'JWT',
    'alg' => 'RS256',
];
$time = time();
$body = [
    // Integration key provded by DocuSign at Admin > API and Keys > Apps.
    'iss' => '[Integration key]',
    // User ID provded by DocuSign at Admin > API and Keys.
    'sub' => '[User ID]',
    'iat' => $time,
    'exp' => strtotime( '+45 minutes', $time ),
    'aud' => 'account-d.docusign.com',
    'scope' => 'signature impersonation',
];

// RSA Private key provided by DocuSign
// When integration APP was created
$rsa_key = '-----BEGIN RSA PRIVATE KEY----- [.........]';

// Base64 + URL Encoding
$header = urlencode( base64_encode( json_encode( $header ) ) );
$body = urlencode( base64_encode( json_encode( $body ) ) );

// JWT signature created using Firebase\JWT\JWT package
$signature = JWT::encode(
    $header . '.' . $body,
    $rsa_key,
    'RS256'
);

// Get request using Curl (10quality/php-curl package)
$response = curl_request(
    'https://account-d.docusign.com/oauth/token',
    'POST',
    [
        'grant_type' => 'urn:ietf:params:oauth:grant-type:jwt-bearer',
        'assertion' => $header . '.' . $body . '.' . $signature,
    ]
);

// Process response
if ( $response ) {
    $response = json_decode( $response );
    if ( isset( $response->error ) )
        throw new Exception( 'DocuSign error: ' . $response->error );
    var_dump( $response );
}

Это руководство, которое у меня есть следовал: https://developers.docusign.com/esign-rest-api/guides/authentication/oauth2-jsonwebtoken

Согласно этому руководству, выданная ошибка указывает на то, что JWT был создан неправильно, хотя я просматривал свой код несколько раз, и он соответствует всему, что описано в руководстве .

Я как бы застрял, и я не знаю, что не так с моим кодом, я даже провел обратный инжиниринг, чтобы проверить правильность кодировки.

Кто-нибудь работал с DocuSign JWT раньше или знает, что я делаю неправильно?


ОБНОВЛЕНИЕ: Рабочий фрагмент с использованием клиента https://github.com/docusign/docusign-php-client Рабочий фрагмент:

$api = new ApiClient( new Configuration );
$api->getOAuth()->setOAuthBasePath( 'account-d.docusign.com' );
$response = $api->requestJWTUserToken(
    '[Integration key]',
    '[User ID]',
    $rsa_key,
    'signature impersonation',
);

Ответы [ 2 ]

0 голосов
/ 11 августа 2020

Я считаю, что вы хотите заменить свои строки:

    $header = urlencode( base64_encode( json_encode( $header ) ) );
    $body = urlencode( base64_encode( json_encode( $body ) ) );

на

    $header = str_replace('=', '', strtr(base64_encode($header ), '+/', '-_'));
    $body = str_replace('=', '', strtr(base64_encode($body), '+/', '-_'));

То же самое с вашей подписью:

    $signature = str_replace('=', '', strtr(base64_encode($signature), '+/', '-_'));

Я взял эту идею из jwt phpjquery.

0 голосов
/ 18 июня 2020

Пожалуйста, подумайте об использовании SDK и не пытайтесь выполнять кодирование JWT самостоятельно. Это сделало бы его проще, безопаснее и, в конечном итоге, позволило бы вам другие функции. для начала клонируйте это репозиторий , который находится в PHP и имеет поддержку JWT и Auth Code Grant. Если у вас возникнут проблемы - дайте мне знать, и я буду рад помочь.

...