我正在尝试为我的网站设置Bitbucket OAuth,但由于某种原因,Bitbucket没有正确地重定向回我的网站 . 我创建了一个OAuth密钥和秘密,我在我的Silex应用程序中使用了Guzzle OAuth插件 .
首先,我通过oauth / request_token endpoints 请求临时令牌 . 使用该令牌,我重定向到oauth / authenticate endpoints :
$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页面 . 有没有人知道为什么重定向到我的回调网址不能正常工作?
2 回答
根据documentation,当从bitbucket的API请求令牌时,你必须在向https://bitbucket.org/api/1.0/oauth/request_token发送POST请求时拥有这些参数:
oauth_consumer_key
oauth_nonce
oauth_signature
oauth_signature_method
oauth_timestamp
oauth_callback
另外,请勿对您的回调网址进行urlencode . 替换这个:
有了这个:
当您发送POST请求时,您不需要编码任何参数 .
确实,正如您在评论中提到的,文档确实在示例中显示了编码参数,如:
问题你没有错误的文件,但误解了POST method . 另请检查Wikipedia page . 与在URL中传递参数的GET不同,POST请求方法将其数据存储在正文中 . 这允许我们发送任意数据类型,任意长 .
在请求正文中传递的数据会自动编码,如本例所示(从维基百科页面复制):
手动编码数据时看起来类似于GET方法,对吧?但是,如果您在POST请求中对数据进行了urlencode,则实际上最终会出现双重编码数据,这是导致问题的原因 .
我真的认为在使用任何API之前需要一些HTTP方法和Internet协议的基本知识 .
另外,检查一些HTTP流量监视器(调试器),如free Fiddler . 它允许您查看从浏览器发送的所有HTTP数据,从而使您能够通过自己的示例进行学习 .
我不确定您的框架是如何工作的,但回调参数可能在请求发出之前由框架进行url编码 . 由于您还对其进行了网址编码,因此您的网址会被网址编码两次 . Bitbucket将解码它一次,留下一个url编码的url,它没有方案集(在这种情况下是http),你的浏览器将不知道它是一个绝对的URL,因此将导航到Bitbucket内的某个地方(正如你所观察到的) . 尝试删除额外的网址编码,看看是否有帮助 .