質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

88.20%

【php】oauthのaccess_tokenのrefreshがうまく行かない

受付中

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 424

FumiakiNakao

score 180

Laravelでの開発中にエラーで詰まってしまったのでご相談させてください

実現したいこと

概要

現在、eBayのAPIを用いたアプリケーションを開発しております。
eBayのAPIはOauthの認証を用いているため、refresh_tokenを用いて、access_tokenをリフレッシュする処理を書きたいと考えています。

curlでのリクエスト

curl -X POST 'https://api.ebay.com/identity/v1/oauth2/token' \
  -H 'Content-Type: application/x-www-form-urlencoded' \
  -H 'Authorization: Basic RGF2eURldmUtRG2 ... ZTVjLTIxMjg=' \
  -d 'grant_type=refresh_token&
      refresh_token=v^1.1#i^1#p^3# ... fMSNFXjEyODQ=&'


Authorizationheaderには、cliend_id:secretをBase64変換したものを付与するとのことでした
詳しくはここを参照してください

実際に書いたコード

        $header = [
            'Authorization' => 'Basic '.base64_encode(config('app.ec_EBAY_US_client_id').':'.config('app.ec_EBAY_US_secret')),
        ];

        $body = http_build_query([
            'grant_type'    => 'refresh_token',
            'refresh_token' => '実際のrefresh token'
        ]);

        $ch = curl_init();
        curl_setopt($ch, CURLOPT_URL, 'https://api.ebay.com/identity/v1/oauth2/token');
        curl_setopt($ch, CURLOPT_HTTPHEADER, $header);
        curl_setopt($ch, CURLOPT_POSTFIELDS, $body);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
        curl_setopt($ch, CURLOPT_POST, true);
        curl_setopt($ch, CURLOPT_TIMEOUT, 30);

        if (($response = curl_exec($ch)) === false) {
            throw new ApplicationException(curl_error($ch));
        }
        curl_close($ch);

        $response = json_decode((string) $response);

起こっている問題

上記のPHPコードでリクエストをしたところ、以下のようなレスポンスが返却されており、access_tokenを取得できませんでした

{
"error": "invalid_request",
"error_description": "request is missing a required parameter or malformed."
}

試したこと

上記の状態が、どのような状態で起こるのか、curlのリクエストで試したところAuthorization Headerが付与されていない場合であることがわかりました。
したがって、本問題の原因は、最初に定義したHeaderが正しく付与されていないことだと考えました

知りたいこと

  1. 上記のようなPHPコードにおいて、リクエストヘッダーが正しく使われているかを確かめるようなデバッグ手法はあるか(ネットでcurl_getinfoを用いる手法を見つけ試してみたのですが、 PHP Warning:  curl_getinfo(): supplied resource is not a valid cURL handle resource in ファイル名 on line LineNum なるwarningが表示され、うまく行きませんでした)

  2. 上記の問題はeBayだけではなく、他のOAuth系のアプリケーションでも起きるものでしょうか? もし思い当たる原因があれば教えていただきたいです。

以上素人質問で恐縮ですが、よろしくお願い足します!

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

0

上記の状態が、どのような状態で起こるのか、curlのリクエストで試したところAuthorization Headerが付与されていない場合であることがわかりました。
したがって、本問題の原因は、最初に定義したHeaderが正しく付与されていないことだと考えました

PHP: curl_setopt - Manualを見てもらえればヘッダの指定方法に誤りがあることがわかるのではないでしょうか.

$header = [
    'Authorization: Basic '.base64_encode(config('app.ec_EBAY_US_client_id').':'.config('app.ec_EBAY_US_secret')),
];

尤も,Laravel内で使われているということなので,curl APIを直接叩くのではなくLaravelで標準で使われるGuzzleやそのラッパーを使用することでオブジェクト指向で一貫した書き方ができ,このような問題も起こりにくくなるうえ,容易なデバッグや簡単な非同期リクエストなども可能になります.

なお,GuzzleでBasic認証を使用する場合はauthオプションに配列で渡すだけで済みます.


PHP Warning:  curl_getinfo(): supplied resource is not a valid cURL handle resource in ファイル名 on line LineNum

こちらは単にcurl_getinfo()にわたすcURLハンドル($ch)に誤りがあったのでは?例えばcurl_close()のあとであった,など

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 88.20%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る