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-адресами обратного вызова и токенами.
Задача ещё не решена.
Других решений пока нет …