サーバーサイドのGoogle+ログインで redirect_uri_mismatch のエラーにハマった
Google+ログインの機能うちの1つである「サーバー側アプリ用の Google+ ログイン」に説明されているワンタイムコードフローの処理を実装していてハマったのでメモ。
ドキュメントに従って実装しているはずなのになぜか「redirect_uri_mismatch」というエラーが出てしまう。
PHP Fatal error: Uncaught exception 'Google_AuthException' with message 'Error fetching OAuth2 access token, message: 'redirect_uri_mismatch'' in
実装には google-api-php-client – Google APIs Client Library for PHP – Google Project Hosting のライブラリを使っていて、
$client = new Google_Client(); $client->setClientId(CLIENT_ID); $client->setClientSecret(CLIENT_SECRET); $client->setRedirectUri(REDIRECT_URI); $code = $HTTP_RAW_POST_DATA; // ここでこのタイミングでエラーが。 $client->authenticate($code);
こんな感じできちんと API Console に設定した値を $client にセットして authenticate() を実行してるのに、リダイレクトURIが一致していないと言われる。
ドキュメントを読み込んでもググってみても全く原因が分からないので、「PHP のクイック スタート – Google+ Platform — Google Developers」にあるサンプルコード https://github.com/googleplus/gplus-quickstart-php の signin.php のコードを眺めてみると、
$client->setRedirectUri('postmessage');
引数が「postmessage」になっている・・・!
ドキュメントで「postmessage」を検索してみると、「ログイン ボタンをウェブページに追加し、data-redirecturi を postmessage に設定して」という記述はあるものの、これは HTML 上に置くサインインボタンの属性のこと。
サーバーサイドでリクエストする際のリダイレクトURIに postmessage をセットしようとはどこにも書かれていない。これで2時間くらいハマッてしまった。
「redirect_uri_mismatch」というエラーは通常は API Console に設定した値と一致しない場合に出るものだけど、ワンタイムコード フローを使用する場合には API Console のほうは値を空にして、コードの中では「postmessage」をセットしないといけない。
最初からクイックスタートのコードを流用すればよかったなぁと思ったけど、色々理解できたのでまぁいいや。
» Google+ Platform — Google Developers
コメントを残す