1.本記事の概要
Deviseとomniauth-google-oauthを使ってGoogle認証機能を実現する際に、Googleからrefresh_tokenが発行される設定と発行されない設定をまとめてみたもの。
#2.調べた理由
Google APIを利用するときに必要となるaccess_tokenは、どの設定でも発行されることから、access_tokenの期限が切れる都度認証画面にアクセスしてaccess_tokenを得るようなシステムにすれば、Google APIは問題なく利用できる。
しかし、refresh_tokenを使ってaccess_tokenを発行させる方法はシステム側で処理が可能であり、この方法だとユーザーに余計な操作をさせずに済むことから、そのために必要となるrefresh_tokenが発行される条件を調べた。
#3.調査の前提条件
次の2つの作業を、4.の表に示した組み合わせをテストする前に毎回行った。
- ログイン前に、データベースに保存しているユーザー情報を削除する。
- ログイン前に「Googleアカウント情報 → ログインとセキュリティ → 接続済みのアプリとサイト → アカウントに接続されているアプリ」を開いて、テスト用プログラムの接続許可を取り消す。
#4.問題となる設定とその結果
omniauth.rb
に設定するprompt
とaccess_type
の2つで、この設定の組み合わせにより、refresh_tokenが発行されたりされなかったりする。
それぞれの設定の組み合わせによる結果は以下の表のとおりで、いずれの設定でも、access_tokenは発行される。
prompt: 設定せず | prompt: none | prompt: consent | prompt: select_account | |
---|---|---|---|---|
access_type: online | 発行されない | 認証画面が表示されない | 発行されない | 発行されない |
access_type: offline | 発行される | 認証画面が表示されない | 発行される | 発行される |
#5.まとめ
prompt
のデフォルトは上記の表の「設定せず」で、access_type
のデフォルトは「offline」であることから、特段の設定を加えなければ、refresh_tokenは発行されるはず。
#5.その他参考
refresh_tokenを使ってaccess_tokenを得る方法は、以下のサイトに掲載されている。
google-api-ruby-clientを用いて、Google Calendarにアクセスしてイベントを取得する - Qiita
Google APIのAccess Tokenをお手軽に取得する - Qiita
OAuth2.0によるGoogle+ APIのアクセス方法