Oauth HMAC-SHA1身份验证可从Yahoo!获取联系人联系人API

时间:2013-01-10 13:46:50

标签: php oauth yahoo-api

  

可能重复:
  Get contacts using Yahoo Contacts API

我正在开发一个sysyem来获取用户的Yahoo联系人。我已经完成了http://developer.yahoo.com/oauth/guide/oauth-auth-flow.html的所有步骤,并且我已经获得了访问令牌和令牌密钥。

我在使用HMAC-SHA1算法签名时遇到问题,我已按照http://developer.yahoo.com/oauth/guide/oauth-signing.html的步骤生成签名密钥,但当我请求给定用户的联系时,我收到错误:

<yahoo:error xmlns:yahoo='http://yahooapis.com/v1/base.rng'
    xml:lang='en-US'>
    <yahoo:description>Please provide valid credentials. OAuth oauth_problem="signature_invalid", realm="yahooapis.com"</yahoo:description>
</yahoo:error>

以下是负责生成签名密钥的代码:

$s =  'oauth_consumer_key='.rawurlencode($yahoo_consumer_key).'&';
$s .= 'oauth_nonce='.rawurlencode(uniqid()).'&';
$s .= 'oauth_signature_method='.rawurlencode('HMAC-SHA1').'&';
$s .= 'oauth_timestamp='.rawurlencode(time()).'&';
$s .= 'oauth_token='.rawurlencode($ouathToken).'&';
$s .= 'oauth_version='.rawurlencode('1.0').'&';
$s .= 'realm='.rawurlencode('yahooapis.com');

$baseString ='GET&'.rawurlencode('http://social.yahooapis.com/v1/user/'.$guid.'/contacts').'&'.rawurlencode($s);

$signingKey = rawurlencode($yahoo_consumer_secret).'&'.rawurlencode($ouathTokenSecret);

$signature = urlencode(base64_encode(hash_hmac('sha1', $baseString, $signingKey, true)));

curl_setopt_array($ch, array(
            CURLOPT_RETURNTRANSFER => true,
            CURLOPT_FOLLOWLOCATION => TRUE,
            CURLOPT_SSL_VERIFYPEER => false,
            CURLOPT_SSL_VERIFYHOST => 0,
            CURLOPT_HTTPGET => true,
            CURLOPT_POST       => false,
            CURLOPT_URL => 'http://social.yahooapis.com/v1/user/'.$guid.'/contacts'.    
                                  '?realm=yahooapis.com'.
                                  '&oauth_consumer_key='.$yahoo_consumer_key.
                                  '&oauth_nonce='.uniqid().
                                  '&oauth_signature_method=HMAC-SHA1'.
                                  '&oauth_timestamp='.time().
                                  '&oauth_token='.$ouathToken.
                                  '&oauth_version=1.0'.
                                  '&oauth_signature='.$signature
        ));

$result = curl_exec($ch);

任何人都可以帮我告诉我哪里出错了?我没有正确生成签名密钥吗?

谢谢。

1 个答案:

答案 0 :(得分:0)

看起来你在某些地方使用urlencode而不是rawurlencode,其中会使用“+”而不是“%20”这样的空格。雅虎文档(对于这个区域来说不太好)使用rawurlencode而不是urlencode显示“规范化”的标题/ URL字符串。除了您对请求进行编码的方式外,它看起来还不错。

*编辑:我混淆了rawurlencode和urlencode。 Rawurlencode使用OAuth所需的RFC 3986:http://oauth.net/core/1.0/#encoding_parameters

你也是双重编码$ s!不要这样做 - 当创建$ s时根本不使用rawurlencode而不是在构建$ baseString或URL时对其进行编码在创建$ s时将其编码在顶部但是不要再次在$中对其进行编码即basestring。

相关问题