F.Ko-Jiの「一秒後は未来」

サーバーサイドの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-phpsignin.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

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

著者について

fkoji

F.Ko-Ji

Webエンジニアやってます。最近は ドットインストール の開発がお仕事です。その傍ら、個人で Meity電車遅延なう梅酒.in#グラドル自画撮り部 の部室といったネットサービスを開発・運営してます。梅酒と草野球とリアル脱出ゲームが好きです。

» 詳しいプロフィールや運営サービスの一覧など