OAuth:oauth_signature无效

时间:2017-08-21 12:35:18

标签: php oauth

我无法以编程方式生成OAuth签名。 我在使用PHP71的FreeBSD上,不能使用PECL扩展,因为它不适用于PHP> 5.6尚未。

我阅读了RFC和许多SO线程以及博客,这些都有我遇到的相同问题。 但我无法弄清楚我失败的地方。

我正在尝试从XING.com Api获取请求令牌。

我的代码:

$strConsumerKey    = '12345';
$strConsumerSecret = '1234567890';

$arrQueryParams = [

  'oauth_callback'         => 'http://xing.dev/endpoint?hauth.done=XING',
  'oauth_consumer_key'     => $strConsumerKey,
  'oauth_nonce'            => md5(microtime() . mt_rand()),
  'oauth_signature_method' => 'HMAC-SHA1',
  'oauth_timestamp'        => time(),
  'oauth_version'          => '1.0'

];

uksort($arrQueryParams, 'strcmp');

$strNormalizedParams = [];

foreach($arrQueryParams AS $k => $v)
  $strNormalizedParams[] = $k . '=' . $v;

$strRequestTokenUrl = 'https://api.xing.com/v1/request_token';
$strBaseString      = 'GET&' . rawurlencode($strRequestTokenUrl) . '&' . rawurlencode(implode('&', $strNormalizedParams));

$strKey = rawurlencode($strConsumerSecret) . '&';# . rawurlencode($strConsumerKey);

$strOAuthSignature  = base64_encode(hash_hmac('sha1', $strBaseString, $strKey, true));

$arrQueryParams['oauth_signature'] = $strOAuthSignature;
uksort($arrQueryParams, 'strcmp');

$params = [];

foreach($arrQueryParams AS $k => $v)
  $params[] = $k . '=' . rawurlencode($v);

$strFinalRequest = $strRequestTokenUrl . '?' . implode('&', $params);

$ch = curl_init($strFinalRequest);

curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);

$mixResponse = curl_exec($ch);

var_dump($mixResponse);

curl_close($ch);

exit;
  • 我尝试了GET / POST请求(Api Docs说两者都有可能)
  • 我在创建$ strKey时尝试了所有组合,但我认为当前是正确的
  • 我检查了系统时间,尝试了不同的时区

$ strBaseString示例:

  

GET&安培; HTTPS%3A%2F%2Fapi.xing.com%2Fv1%2Frequest_token&安培; oauth_callback%3Dhttp%3A%2F%2Fxing.dev%2Fendpoint%3Fhauth.done%3DXING%26oauth_consumer_key%3D12345%26oauth_nonce%3Daadab05f87028514358e5995dc6728fd%26oauth_signature_method %3DHMAC-SHA1%26oauth_timestamp%3D1503318691%26oauth_version%3D1.0

最终请求示例:

  

https://api.xing.com/v1/request_token?oauth_callback=http%3A%2F%2Fxing.dev%2Fendpoint%3Fhauth.done%3DXING&oauth_consumer_key=12345&oauth_nonce=71f83f72b929a87e5fdd6bf1a7fb2511&oauth_signature=56qc3%252FCrMptnUoy6TgsJtsZclfY%253D&oauth_signature_method=HMAC-SHA1&oauth_timestamp=1503318773&oauth_version=1.0

响应总是:

{"message":"Invalid OAuth signature","error_name":"INVALID_OAUTH_SIGNATURE"}

真正有趣的想法是,https://github.com/xing/xing-api-samples/tree/master/php XING客户端可以在我的机器上运行。我调试了代码,看看他们是如何生成签名,抛弃生成的基本字符串,最后的字符串,参数等等,一切看起来像我做的。 (当然,除了oauth_timestamp和oauth_nonce的值)

另外,我可以在oauth示例中重现结果:https://oauth.net/core/1.0/#sig_base_example

这使它更加奇怪。

有谁知道我做错了什么? 谢谢你和最好的问候

1 个答案:

答案 0 :(得分:1)

发现错误:

$strBaseString = 'GET&' . rawurlencode($strRequestTokenUrl) . '&' . rawurlencode(implode('&', $strNormalizedParams));

应该是

$strBaseString = 'GET&' . rawurlencode($strRequestTokenUrl) . '&' . rawurlencode(http_build_query($arrQueryParams));