2012-09-09 172 views
7

我一直试图将BitBucket整合到我的应用程序过去4个小时无济于事。从BitBucket请求OAuth令牌

尽管通读BitBucket's RESTful API documentation,我注意到,你需要使用OAuth - 没关系,我使用JR康林的OAuthSimple库,如果罚款由我(我试过oauth-php但它有点复杂 - 我没必要所有这些小集成的选项)。

据我所知,使用OAuth进行身份验证的第一步是通过POST请求新令牌。当提供必要的参数,你应该从到位桶的响应,这样的:

oauth_token=Z6eEdO8lOmk394WozF9oJyuAv899l4llqo7hhlSLik&oauth_token_secret=Jd79W4OQfb2oJTV0vzGzeXftVAwglnEJ9lumzYcl&oauth_callback_confirmed=true

为了做到这一点,我使用的卷曲和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据我所知,这是这样的:

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

如果我在浏览器中手动输入该地址为我的地址栏,我会得到一个身份验证对话框到位桶API,但是我无法用我的凭据登录。然后它会继续说“无法验证OAuth请求”。

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

任何帮助的赞赏!

+0

任何运气吗?我得到了和你一样的错误... – ericbae

+0

@ericbae我最终与BitBucket的技术支持人员进行了一次对话 - 事实证明,他们的手册中的信息已经过时,并且已被纠正。只要他们告诉我(我做了必要的路径变更),一切都像魅力一样。确保你使用的是正确的路径(因为[OAuthSimple](https://github.com/jrconlin/oauthsimple/)效果很好) – AeroCross

+0

@AeroCross是你能够把你的答案和或导致你的正确路径固定? –

回答

1

问题是Curl会验证SSL证书。

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

curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); 
+0

尝试,但没有最好的让你知道 –