2012-09-09 222 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

嘗試,但沒有最好的讓你知道 –