从BitBucket请求OAuth令牌


Request OAuth token from BitBucket

在过去的4个小时里,我一直试图将BitBucket集成到我的应用程序中,但没有成功。

在阅读BitBucket的RESTful API文档时,我注意到您需要使用OAuth-没关系,我使用的是J.R Conlin的OAuthSimple库,如果我可以的话(我尝试了OAuth-php,但它有点复杂-我不需要所有这些选项来进行如此小的集成)。

据我所知,使用OAuth进行身份验证的第一步是通过POST请求新的令牌。当提供必要的参数时,您应该从BitBucket得到响应,如下所示:

oauth_token=Z6eEdO8lOmk394WozF9oJyuAv899l4llqo7hhlSLik&oauth_token_secret=Jd79W4OQfb2oJTV0vzGzeXftVAwglnEJ9lumzYcl&oauth_callback_confirmed=true

为此,我使用cURL和OAuthSimple:

$key    = 'key_provided_by_bitbucket';
$secret = 'key_provided_by_bitbucket';
$path   = 'https://api.bitbucket.org/1.0/oauth/request_token';
$params = array(
    'oauth_consumer_key'        => $key,
    'oauth_nonce'               => base_convert(mt_rand(10000, 90000), 10, 32) . 'a',
    'oauth_signature'           => 'HMAC-SHA1',
    'oauth_signature_method'    => 'HMAC-SHA1',
    'oauth_timestamp'           => time(),
    'oauth_callback'            => base_url('dashboard'),
    'oauth_version'             => '1.0a'
);
$oauth  = new OAuthSimple($key, $secret);
$result = $oauth->sign(array(
    'action'        => 'POST',
    'path'          => $path,
    'parameters'    => $params
));
// load resulting url into a string
$ch = curl_init($result['signed_url']);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$r = curl_exec($ch);
curl_close($ch);

问题是,当我发送请求时,会发生两件事之一:

  1. 如果我像这里发布的那样发送,我会收到401错误(我可以通过curl_getinfo($ch)看到)
  2. 如果我设置curl_setopt($ch,CURLOPT_POST,1),我会得到一个400坏的请求

结果字符串(存储在$r中)是一个空字符串。signed_url是一个格式正确的URL AFAIK,其内容如下:

https://api.bitbucket.org/1.0/oauth/request_token?oauth_callback=http%3A%2F%2Flocalhost%2Fidv&oauth_consumer_key=key_provided_by_bitbucket&oauth_nonce=b47a&oauth_signature=3A1R%2FoKxTqh6Q23poaS%2BVNzhwpE%3D&oauth_signature_method=HMAC-SHA1&oauth_timestamp=1347167282&oauth_version=1.0a

如果我在浏览器的地址栏中手动输入该地址,我将获得BitBucket API的验证对话框,端口443。不过,我不能用我的凭据登录。然后它会一直说"无法验证OAuth请求"

我不知道我做错了什么,因为这是我第一次使用OAuth。

感谢您的帮助!

问题是Curl将验证SSL证书。

为了解决这个问题,您可以告诉Curl忽略SSL证书的验证:

curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);