我正在尝试为我的网站设置Bitbucket OAuth,但由于某种原因,Bitbucket没有正确地重定向回我的网站。我已经创建了一个OAuth密钥和秘密,我在我的Silex应用程序中使用了Guzzle OAuth插件。
首先,我通过oauth / request_token端点请求临时令牌。使用该令牌,我重定向到oauth / authenticate endpoint:
$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']));
}
);
这将打开Bitbucket网站上的页面,用户可以在该网站上授予或拒绝访问其帐户。单击“授予访问权限”后,Bitbucket应重定向回到之前指定的回调网址,但它会将我的回调网址附加到Bitbucket网址,如下所示:
这显然会导致Bitbucket 404页面。有没有人知道为什么重定向到我的回调网址不能正常工作?
答案 0 :(得分:1)
我不确定您的框架是如何工作的,但回调参数可能在请求发出之前由框架进行url编码。由于您还对其进行了网址编码,因此您的网址会被网址编码两次。 Bitbucket将解码它一次,留下一个url编码的url,它没有方案集(在这种情况下为http),你的浏览器将不知道它是一个绝对的URL,因此将导航到Bitbucket内的某个地方(正如你所观察到的)。尝试删除额外的网址编码,看看是否有帮助。
答案 1 :(得分:1)
根据documentation,当从bitbucket的API请求令牌时,你必须在向https://bitbucket.org/api/1.0/oauth/request_token发送POST请求时拥有这些参数:
另外,请勿对您的回调网址进行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请求中对数据进行了urlencode,那么实际上最终会出现双重编码数据,这会导致您遇到问题。
我真的认为在使用任何API之前需要一些HTTP方法和Internet协议的基本知识。
另外,检查一些HTTP流量监视器(调试器),如免费Fiddler。它允许您查看从浏览器发送的所有HTTP数据,实际上使您可以通过自己的示例进行学习。