Создание XML-запроса oauth с подписью тела для службы LTI Outcomes с использованием pecl oauth

Я использую библиотеку pecl oAuth, можно ли создать подписанный телом запрос oauth, который выглядит так:

POST http://www.imsglobal.org/developers/BLTI/service_handle.php HTTP/1.0
Host: 127.0.0.1:80
Content-Length: 757
Authorization: OAuth realm="",oauth_version="1.0",
oauth_nonce="29f90c047a44b2ece73d00a09364d49b",
oauth_timestamp="1313350943",oauth_consumer_key="lmsng.school.edu",
oauth_body_hash="v%2BxFnmDSHV%2Fj29qhxLwkFILrtPo%3D",
oauth_signature_method="HMAC-SHA1",
oauth_signature="8auRpRdPY2KRXUrOyz3HKCs92y8%3D"
Content-type: application/xml
<?xml version = "1.0" encoding = "UTF-8"?>
... more xml data ...

Я пытаюсь связаться с Instructure Canvas LMS, используя стандартный интерфейс IMS Global LTI. Служба результатов позволяет отправлять результаты обратно в LMS, используя подписанные сообщения XML


person iturgeon    schedule 06.04.2012    source источник


Ответы (2)


Как оказалось, pecl oAuth в настоящее время не поддерживает oaut_body_hash.

В итоге я использовал библиотеку oAuth из этого репозитория кода Google http://code.google.com/p/oauth/ и сам вычисляю тело:

$bodyHash = base64_encode(sha1($body, TRUE)); // build oauth_body_hash
$consumer = new \OAuthConsumer($key, $secret);
$request = \OAuthRequest::from_consumer_and_token($consumer, '', 'POST', $endpoint, array('oauth_body_hash' => $bodyHash) );
$request->sign_request(new \OAuthSignatureMethod_HMAC_SHA1(), $consumer, '');
$header = $request->to_header() . "\r\nContent-Type: application/xml\r\n"; // add content type header
person iturgeon    schedule 07.04.2012

Стандартная функция OAuth::generateSignature допускает дополнительные параметры в качестве третьего аргумента. Это можно использовать для передачи пользовательского хеш-параметра тела:

$oauth = new OAuth($credentials["oauthKey"], $credentials["oauthSecret"]);

$timestamp = time();
$oauth->setTimestamp($timestamp);

$nonce = mt_rand();
$oauth->setNonce($nonce);

$bodyHash = base64_encode(sha1($content, true)); // $content contains the body
$sig = $oauth->generateSignature('GET', $url, Array("oauth_body_hash" => $bodyHash));

Затем мы можем использовать это для создания нашего заголовка OAuth:

$header = array
(
    'Content-Type: application/xml'
);
$header[] = 'Authorization: OAuth '.
            'oauth_version="1.0",'.
            'oauth_nonce="'.$nonce.'",'.
            'oauth_timestamp="'.$timestamp.'",'.
            'oauth_body_hash="'.$bodyHash.'",'.
            'oauth_consumer_key="'.$credentials["oauthKey"].'",'.
            'oauth_signature_method="HMAC-SHA1",'.
            'oauth_signature="'.urlencode($sig).'"';
person janw    schedule 15.07.2020