首页 文章

Bitbucket API OAuth无法正确重定向

提问于
浏览
0

我正在尝试为我的网站设置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网址,如下所示:

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

这显然会导致Bitbucket 404页面 . 有没有人知道为什么重定向到我的回调网址不能正常工作?

2 回答

  • 1

    根据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 . 替换这个:

    '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流量监视器(调试器),如free Fiddler . 它允许您查看从浏览器发送的所有HTTP数据,从而使您能够通过自己的示例进行学习 .

  • 1

    我不确定您的框架是如何工作的,但回调参数可能在请求发出之前由框架进行url编码 . 由于您还对其进行了网址编码,因此您的网址会被网址编码两次 . Bitbucket将解码它一次,留下一个url编码的url,它没有方案集(在这种情况下是http),你的浏览器将不知道它是一个绝对的URL,因此将导航到Bitbucket内的某个地方(正如你所观察到的) . 尝试删除额外的网址编码,看看是否有帮助 .

相关问题