2013-09-29 41 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中的某个地方(如您所见)。尝试删除额外的网址编码,看看是否有帮助。

相关问题