首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >OAuth:无效oauth_signature

OAuth:无效oauth_signature
EN

Stack Overflow用户
提问于 2017-08-21 12:35:18
回答 1查看 980关注 0票数 1

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

我读过RFC和许多这样的线程以及博客,它们都有相同的问题。但我不知道我在哪里失败了。

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

我的守则:

代码语言:javascript
复制
$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

最后请求示例:

version=1.0

答复总是:

代码语言:javascript
复制
{"message":"Invalid OAuth signature","error_name":"INVALID_OAUTH_SIGNATURE"}

然而,真正有趣的想法是,https://github.com/xing/xing-api-samples/tree/master/php XING客户端在我的机器上工作。我对代码进行了调试,查看了它们是如何生成签名的,将生成的基本字符串、最终字符串、params等抛出,一切看起来都像我所做的。(当然,oauth_timestamp和oauth_nonce的值除外)

此外,我还可以在oauth示例中再现结果:example

这使它更加奇怪。

有人知道我做错了什么吗?谢谢并致以最良好的问候

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-09-10 15:45:50

发现错误:

代码语言:javascript
复制
$strBaseString = 'GET&' . rawurlencode($strRequestTokenUrl) . '&' . rawurlencode(implode('&', $strNormalizedParams));

应该是

代码语言:javascript
复制
$strBaseString = 'GET&' . rawurlencode($strRequestTokenUrl) . '&' . rawurlencode(http_build_query($arrQueryParams));
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45797295

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档