当对具有多个查询参数的URL进行请求时,PHP OAuth生成的签名不正确:
$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
参数值。
查看PECL Oauth库的源代码,似乎签名生成应该符合规范(请参阅*oauth_generate_sig_base
)。在oauth_parse_str
和oauth_http_build_query
之后我有点迷茫。
我知道parse_str
仅保留最后一个值,除非有方括号。正在调用的服务需要keyword
而不是keyword[]
,因此我不能简单地更改名称以包括方括号。
我做错什么了吗?这是PHP Oauth库的限制吗?如果是这样,我可以使用OAuth 1.0a进行服务器到服务器的API调用吗?我见过的大多数库都面向Twitter / Tumblr,并涉及带有回调URL和令牌的整个三足OAuth 1.0a流。