Подпись PHP OAuth не соответствует Подпись почтальона для тех же значений - PullRequest
0 голосов
/ 26 января 2019

(Я нашел ответ. Он указан как ответ ниже, на случай, если у кого-то возникнет такая же проблема.)

Для вызова API WordPress с использованием OAuth 1.0, Postman создает код PHP cURL, который работаетв совершенстве.Итак, я знаю, пробуя их код «как есть», что генерируемый ими oauth_signature правильный.

Но, следуя каждому уроку и вопросу переполнения стека, которые я могу найти по этому вопросу, я не могу заставить свою реализацию создатьoauth_signature, совпадающее с тем, которое генерирует Postman с использованием тех же переменных.

Обычно одноразовые номера и текущее время будут уникальными значениями, но, конечно, я копирую их из данных Postman, чтобы у меня были все те же данныепри попытке создать подпись, совпадающую с подписью, которую придумывает Почтальон.

Вот мой код, и это именно те данные, которые были введены в Почтальон, даже если есть фиктивный URL и фиктивные токены.Я ищу помощи на этапе генерации подписи, а не на самом деле подключения к API (эта часть работает нормально).

Я считаю, что есть проблема с моим методом генерации подписи, потому что всеelse соответствует, и единственная информация, которую мне не нужно проверять, - это исходный код Postman, чтобы точно узнать, как Postman генерирует подпись с данными, которые вы ей предоставляете, поэтому я ищу помощи в этой реализации.

Да, я знаю, что есть библиотеки (и я посмотрел на некоторые из них, чтобы сравнить реализацию моего кода с их), но я пытаюсь сделать это без библиотеки, поскольку это действительно не должно быть так сложно.

<?php

$oauthconsumerkey = "oconsumerkey";
$oauthtoken = "otoken";
$clientsecret = "oclientsecret";
$tokensecret = "otokensecret";

$key = rawurlencode($clientsecret) . "&" . rawurlencode($tokensecret);

$method = "GET";

$baseurl = "https://test.com/wp-json/wp/v2/users/me/";

// these 2 variables were generated by Postman

$nonce = "1TT5UggZswB";
$timenow = "1548458598";

$paramstring = "oauth_consumer_key=" . $oauthconsumerkey . "&oauth_token=" . $oauthtoken . "&oauth_signature_method=HMAC-SHA1" . "&oauth_timestamp=" . $timenow . "&oauth_nonce=" . $nonce;

$encodeurl = $method . "&" . rawurlencode($baseurl) . "&" . rawurlencode($paramstring);

$signature = hash_hmac( 'sha1', $encodeurl, $key, TRUE );

$signature = base64_encode( $signature );

$curlurl = $baseurl . "?" . $paramstring . "&oauth_signature=" . $signature;

print $signature;

?>

Из этих переменных почтальон дает подпись: 4TJtCPkjrkBnIthdUujQ4j / ​​RHtY =

Но приведенный выше код дает подпись: plKJeIp4tWC4J2RebyNuelr7vgg =1023 * (Я также понимаю, что в моей строке есть «&» для генерации подписи, но «?» В моем URL-адресе cURL. «?» В URL-адресе cURL - то, как это имеет Postman, и это требуется для сайта, чтобыузнайте маршрут. И чтобы быть уверенным, я попытался сгенерировать подпись в обоих направлениях, используя «&» или «?», потому что я видел, как разные люди говорили разные вещи о том, что требуется в спецификации для генерации подписи.)

1 Ответ

0 голосов
/ 26 января 2019

Я понял проблему! И документы из Твиттера помогли (https://developer.twitter.com/en/docs/basics/authentication/guides/creating-a-signature.html),, поэтому спасибо @ RamRaider.

Мои компоненты $ paramstring были в неправильном порядке. Я взял порядок из их порядка в URL-адресе cURL в PHP-коде, сгенерированном Postman, но этот порядок был случайным, я думаю, не связанным с порядком, необходимым для генерации подписи, который является алфавитным. Эта переменная в моем коде должна была быть построена так:

$paramstring = "oauth_consumer_key=" . $oauthconsumerkey . "&oauth_nonce=" . $nonce . "&oauth_signature_method=HMAC-SHA1" . "&oauth_timestamp=" . $timenow . "&oauth_token=" . $oauthtoken;
...