PHP OAuth генерирует неверную подпись при выполнении запросов к URL-адресам с несколькими параметрами запроса:
$uri = 'https://example.com/api/v1/person/search?sort=0&keyword=Tyler&keyword=Marissa'
$oauth = new \OAuth($consumerKey, $secret, \OAUTH_SIG_METHOD_HMACSHA1, \OAUTH_AUTH_TYPE_AUTHORIZATION);
$oauth->setVersion('1.0');
echo \oauth_get_sbs('GET', $uri);
// GET&https%3A%2F%2Fexample.com%2Fapi%2Fv1%2Fperson%2Fsearch&keyword%3DMarissa%26sort%3D0
$client = new Client([
RequestOptions::HEADERS => ['Accept' => 'application/json']
]);
return $client->get($uri, [
RequestOptions::HEADERS => ['Authorization' => $oauth->getRequestHeader('GET', $uri)]
]);
Как видно из результатов работы функции oauth_get_sbs
,в сгенерированной базовой строке сигнатуры полностью отсутствует первое значение параметра keyword
.
Если посмотреть на исходный код библиотеки Oauth PECL, похоже, что генерация сигнатуры должна соответствовать спецификации (см. *oauth_generate_sig_base
).Я немного растерялся после oauth_parse_str
и oauth_http_build_query
.
Я знаю, что parse_str
сохраняет только последнее значение, если только нет квадратных скобок.Вызываемая служба ожидает keyword
, а не keyword[]
, поэтому я не могу просто изменить имя, включив квадратные скобки.
Я что-то не так делаю или это ограничение библиотеки PHP Oauth?Если да, есть ли какие-либо альтернативы, которые я могу использовать для межсерверных API-вызовов с использованием OAuth 1.0a?Большинство библиотек, которые я видел, ориентированы на Twitter / Tumblr и включают весь трехсторонний поток OAuth 1.0a с URL-адресами обратного вызова и токенами.