0

我正在尝试为我的网站设置 Bitbucket OAuth,但由于某种原因,Bitbucket 没有正确重定向回我的网站。我已经创建了 OAuth 密钥和秘密,并且在我的 Silex 应用程序中使用了 Guzzle OAuth 插件。

首先,我通过 oauth/request_token 端点请求一个临时令牌。使用该令牌我重定向到 oauth/authenticate 端点:

$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 应该重定向回之前指定的回调 url,但它会将我的回调 url 附加到 Bitbucket url,如下所示:

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

这显然会产生一个 Bitbucket 404 页面。有谁知道为什么重定向到我的回调 url 不能正常工作?

4

2 回答 2

1

我不确定你的框架是如何工作的,但是回调参数可能是在发出请求之前由框架编码的 url。由于您还对其进行了 url 编码,因此您的 url 被 url 编码了两次。Bitbucket 将对其进行一次解码,留下一个 url 编码的 url,它不会设置方案(在本例中为 http),并且您的浏览器不会知道它是一个绝对 URL,因此将导航到 Bitbucket 内部的某个位置(如您所见)。尝试删除额外的 url 编码,看看是否有帮助。

于 2013-10-20T04:54:41.333 回答
1

根据文档,当从 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



另外,不要对您的回调 URL 进行 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 方法的误解。还要检查维基百科页面。与在 URL 中传递参数的 GET 不同,POST 请求方法将其数据存储在正文中。这允许我们发送任意长度的任何数据类型。

在请求正文中传递的数据会自动编码,如本例所示(从 Wikipedia 页面复制):

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

手动编码数据时看起来类似于 GET 方法,对吧?但是,如果您在 POST 请求中对数据进行 urlencode,您实际上最终会得到双重编码的数据,这会导致您的情况出现问题。


我真的认为在使用任何 API 之前都需要一些 HTTP 方法和 Internet 协议的基本知识。

另外,检查一些 HTTP 流量监视器(调试器),例如免费的Fiddler。它将允许您查看从浏览器发送的所有 HTTP 数据,基本上使您能够通过自己的示例进行学习。

于 2013-10-20T21:12:53.170 回答