状況
Railsでomniauth-google-oauth2を利用してログイン認証を行っていた際に、以下エラー「JWT::InvalidIatError」が発生した。
その解決方法の備忘録になります。
解決策
結論
config/initializers/devise.rbに以下を追記する。
(Deviseを実装していた)
config.omniauth :google_oauth2, ENV['GOOGLE_APP_ID'], ENV['GOOGLE_APP_SECRET'], name: :google
config.omniauth :google_oauth2, ENV['GOOGLE_APP_ID'], ENV['GOOGLE_APP_SECRET'], name: :google, skip_jwt: true
原因
セッショントークン生成時にOSの時間のずれがあり、JWT(ジョット)のデコーディング時にエラーが発生している。
omniauth-google-oauth2の公式ドキュメントにも以下の記述がありました。
skip_jwt: Skip JWT processing. This is for users who are >seeing JWT decoding errors with the iat field. Always try >adjusting the leeway before disabling JWT processing.
原因確認中に遠回りしたこと
まず、エラーの原因はOSの時間のずれであり、時間設定を変更すれば解決するという情報を発見したため、時間設定を変更しようと考えたが、それでは解決できませんでした。
Railsではシステムや環境変数で設定されている日時を
Time.now
で取得ができます。
それとは別にapplication.rbにデフォルトのタイムゾーンを設定でき、
その日時はTime.zone.now
で取得ができます。
現在日時を取得してみると、以下の通り
irb(main):001:0> Time.now
=> 2019-12-05 17:16:52 +0900
irb(main):002:0> Time.zone.now
=> Thu, 05 Dec 2019 08:16:57 UTC +00:00
irb(main):003:0>
Time.zone.now
ではUTC(協定世界時:Coordinated universal time)になっているということは、RailsではデフォルトではUTC設定になっています。
こちらを日本時間(JST)に変更することにしました。
config.time_zone = 'Tokyo'
config.active_record.default_timezone = :local
上記コードを追加し、JSTにて日時取得できるようになりました。
irb(main):001:0> Time.now
=> 2019-12-05 17:31:29 +0900
irb(main):002:0> Time.zone.now
=> Thu, 05 Dec 2019 17:31:33 JST +09:00
irb(main):003:0>
しかし、エラーは解決されませんでした。今回のエラーでは関係がない模様。。。
◆参考URL
Qiita、githubのissueを参考にしました。
https://github.com/zquestz/omniauth-google-oauth2/issues/195
https://qiita.com/sutoh/items/b7d23990abb9c5083daa
https://qiita.com/takuchan9104/items/1b588e125f8a1e0c7605