2013-09-29 40 views
0

我試圖爲我的網站設置Bitbucket OAuth,但由於某種原因,Bitbucket沒有正確重定向回我的網站。我創建了一個OAuth密鑰和祕密,並且在我的Silex應用程序中使用了Guzzle OAuth插件。Bitbucket API OAuth沒有正確重定向

首先我通過oauth/request_token端點請求臨時令牌。使用該令牌我重定向到OAuth /驗證端點:

$app->get(
    '/auth/bitbucket', 
    function() use ($app) { 
     $client = new Client('https://bitbucket.org/api/1.0'); 
     $oauth = new OauthPlugin(
      array(
       'consumer_key' => $app['bitbucket.key'], 
       'consumer_secret' => $app['bitbucket.secret'], 
       'signature_method' => 'HMAC-SHA1', 
       'callback' => urlencode('http://mysite.local/auth/bitbucket/callback') 
      ) 
     ); 
     $client->addSubscriber($oauth); 

     $response = $client->post('oauth/request_token')->send(); 

     parse_str($response->getBody(), $result); 

     return $app->redirect(sprintf('https://bitbucket.org/api/1.0/oauth/authenticate?oauth_token=%s', $result['oauth_token'])); 
    } 
); 

這將彈出頁面上的到位桶網站,用戶可以授予或拒絕訪問他們的帳戶。當我點擊「允許訪問」到位桶應重定向回先前指定的回調URL,而是將我的回調URL追加到位桶網址是這樣的:

https://bitbucket.org/api/1.0/oauth/http%3A%2F%2Fmysite.local%2Fauth%2Fbitbucket%2Fcallback?oauth_verifier=xxxxxxxxxx&oauth_token=xxxxxxxxxxxxxxxxxx

這顯然導致到位桶404頁。有沒有人有一個想法,爲什麼重定向到我的回調網址不能正常工作?

回答

1

documentation,從到位桶的API請求令牌時,必須在發送POST請求https://bitbucket.org/api/1.0/oauth/request_token當這些參數:

  • oauth_consumer_key
  • oauth_nonce
  • oauth_signature
  • oauth_signature_method
  • oauth_timestamp
  • oauth_call返回



另外,請勿對您的回叫網址進行urlencode編碼。替換此:

'callback' => urlencode('http://mysite.local/auth/bitbucket/callback') 

有了這個:

'callback' => 'http://mysite.local/auth/bitbucket/callback' 

當您發送POST請求,你不需要任何編碼參數。




事實上,正如您在評論中提及,文件並顯示編碼例如參數,如:你有

https://bitbucket.org/api/1.0/oauth/request_token?oauth_version=1.0&oauth_nonce=7f2325b3c36bd49afa0a33044d7c6930&oauth_timestamp=1366243208&oauth_consumer_key=HUpRcDUduZrepL6sYJ&oauth_callback=http%3A%2F%2Flocal%3Fdump&oauth_signature_method=HMAC-SHA1&oauth_signature=qZyTwVA48RzmtCHvN9mYWmlmSVU%3D 

問題是沒有錯的文件,但POST method誤解。另請查看Wikipedia page。與URL中傳遞參數的GET不同,POST請求方法將其數據存儲在主體中。這允許我們發送任意數據類型,任意長。

是在請求體後,數據就在本實施例中自動地編碼爲(維基百科頁複製):

Name=Jonathan+Doe&Age=23&Formula=a+%2B+b+%3D%3D+13%25%21 

類似於當手動將數據編碼到GET方法,是嗎?但是,如果您在POST請求中urlen編碼數據,則實際上最終會產生雙重編碼數據,這是您的案例中存在問題的原因。


我真的認爲在使用任何API之前,都需要一些HTTP方法和Internet協議的基本知識。

此外,檢查一些HTTP流量監視器(調試器),如免費Fiddler。它將允許您查看從瀏覽器發送的所有HTTP數據,從而使您可以通過自己的示例進行學習。

+0

這是其中一個「我敢肯定我嘗試過,並沒有工作」的。回調中的urlencode是個問題。我以前沒有嘗試過urlencode,但當時顯然還有其他問題。很奇怪,bitbucket API文檔中的示例url是編碼的。僅供參考,OauthPlugin實際上添加了我沒有設置的必需參數。 – kielabokkie

+0

編輯我的答案。請檢查。 – dario111cro

1

我不確定你的框架是如何工作的,但回調參數可能是在請求發出之前由框架編碼的url。由於您還對網址進行了編碼,因此您的網址會被網址編碼兩次。 Bitbucket會解碼一次,留下一個url編碼的url,它不會有方案集(在這個例子中是http),你的瀏覽器不會知道它是一個絕對的URL,因此會導航到Bitbucket中的某個地方(如您所見)。嘗試刪除額外的網址編碼,看看是否有幫助。

相關問題