GoogleのService Account認証に潜む invalid_grant 問題

| 2件の返信

Appleのイベントは見ましたか?
Spring forward.のことです。
いやぁ、まさかあんなサプライズがあるとは。。。
どうも、DiceK Mikamiです。

さて、今回は(Appleとは全然関係なく)Google API使うにあたって利用することになるService Account認証に潜む罠に関して取り上げてみたいと思います。

 

対象読者

  • Google APIを利用したことがある
  • Google OAuth2 Service Account認証を利用している
  • invalid_grantがこわい
     
     

invalid_grantエラーの恐怖

Google APIを利用しているとたまに目にするのが、HTTP 400 Bad Requestと言うエラーです。
Googleは親切にもこのエラーを返却する際、エラーの内容も返却してくれます。
大抵の場合、きちんと修正すべきポイントも込みで教えてくれるのですが、教えてくれない場合もあります。

それがinvalid_grantです。

このエラーは、リクエストに付随している認証トークンが不正である場合に発行されるのですが、そのトークンがなぜ不正なのかは全く教えてくれません。
こうなると総当たりで調べていくことになります。

クライアントIDやシークレットは正しいのか。
スコープは正しいのか。
有効期限は問題ないか。

などなど。
もちろん一つずつ検証していけば問題を解決することはできます。
なので、このエラーに遭遇すると「ちょーめんどくさい」なわけです。
コンパイル時に出力されないエラーとか、HibernateのXMLファイルエラーとか、そういう類のものです。
 
 

OAuth2 Service Account認証だと見えない問題

OAuth2の仕組みを利用して認証を行う場合、アクセストークン等の発行に関する問題が付いて回ります。
仕組みを理解する上でプリミティブなAuthorization Codeを利用した方式であれば、問題をステップバイステップで確定させることができます。
しかし、業務アプリケーション等でService Accountを利用した方式を使いたいと思うのも、また人情というものでしょう。
Authorization Code方式であれ、Service Account方式であれ、どちらにしても最終的にアクセストークンを利用することになります。

Google APIの場合、Service Accountを利用するとブラックボックス化してしまう要素があります。
それは、アクセストークンの有効期限です。

多くの場合、アクセストークンの有効期限はライブラリが管理してくれます。
Authorization Code方式の場合、自前で実装することも多いので、問題にはなりませんが、Service Account方式の場合、自動的にOSの時刻設定を利用することがほとんどです(ライブラリにもよりますが)。
これが解けない invalid_grantを生むことになります。
 
 

OSの時刻はズレる

昨今、仮想環境(クラウド環境)はテストや開発といった現場だけでなく、サービスの運用などにも使われるようになってきました。
こうした仮想環境に設置したOSは、まぁ時刻がズレる。
こうしたズレを改善するために、NTPサーバをインストールしたりするのが妥当なのですが、諸事情によりセットアップしないこともあったりします。

さて、前項にてOAuth2 Service Account方式では、OSの時刻設定を利用すると書きました。
つまり、時刻がズレた状態でアクセストークンが生成されます。
当然ながらトークンは認証サーバー(今回の場合はGoogle)が発行するものです。
GoogleとサーバーOSの時刻は当然ながらズレています。
場合によっては、発行された段階で有効期限が切れているアクセストークンが発行される可能性があります。

当然ながらこうして出来上がったアクセストークンを利用して、APIをたたくと、invalid_grantエラーが返却されるわけです。
こうしてアプリケーションとは、全く関係ないところでエラーが発生してしまうのでした。
 
 

まとめ

  • invalid_grantの対策
  • 外部サービスを利用する場合、対象サービスと時刻合わせをしよう。
  • OAuth2 Serivce Account認証を利用する場合、NTPサーバを立てよう。
     
     

参考文献

Management API – Authorization|Google Analitics
VMware で Linux を動かした際の時刻のずれを解消する|WebOS Goodies

GoogleのService Account認証に潜む invalid_grant 問題」への2件のフィードバック

  1. ピンバック: Google API「Error refreshing the OAuth2 token」の対処メモ | Design Hack and Slash

  2. ピンバック: Google Analytics APIとD3.jsでアクセス数をビジュアライズ

コメントを残す

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

次のHTML タグと属性が使えます: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>