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 サイトのページが表示されます。[Grant access] をクリックすると、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

ドキュメントによると、bitbucket の API からトークンをリクエストする場合、POST リクエストをhttps://bitbucket.org/api/1.0/oauth/request_tokenに送信するときにこれらのパラメーターが必要です。

  • 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 リクエスト メソッドはデータを body に格納します。これにより、任意の長さの任意のデータ型を送信できます。

リクエストの本文で渡されるデータは、次の例のように自動的にエンコードされます (ウィキペディアのページからコピー)。

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

データを手動でエンコードするときの GET メソッドに似ていますね。ただし、POSTリクエストでデータをurlencodeすると、実際には二重にエンコードされたデータになり、これが問題の原因になります。


API をいじる前に、HTTP メソッドとインターネット プロトコルの基本的な知識が必要だと思います。

また、無料のFiddlerなど、いくつかの HTTP トラフィック モニター (デバッガー) を確認してください。これにより、ブラウザから送信されるすべての HTTP データを確認できるようになり、基本的に独自の例で学習できるようになります。

于 2013-10-20T21:12:53.170 に答える
1

フレームワークがどのように機能するかはわかりませんが、コールバック パラメータは、リクエストが行われる前にフレームワークによって URL エンコードされている可能性があります。URL エンコードも行うため、URL は 2 回 URL エンコードされます。Bitbucket はそれを一度デコードし、スキームが設定されていない URL エンコードされた URL を残します (この場合は http)。ブラウザーはそれが絶対 URL であることを認識しないため、Bitbucket 内のどこかに移動します。 (あなたが観察するように)。余分な URL エンコードを削除してみて、それが役立つかどうかを確認してください。

于 2013-10-20T04:54:41.333 に答える