はじめに
この記事では、Gem「sorcery
」を使用したGoogle認証に関する注意点をまとめました。具体的な実装方法の解説は行わず、確認すべき重要なポイントについて触れています。
Google認証を導入するなら「devise
」の方が一般的でおすすめですが、既に「sorcery
」を用いてログイン機能を実装している方のために書いています。私自身、sorceryでGoogle認証を実装する際に情報が少なく苦戦したため、同様に苦戦している方々の助けになれば幸いです。
環境
- ruby 3.2.3
- rails 7.1.3
- Docker
前提条件としてsoceryによるログイン機能に加えて、Google認証導入までも一通りできている(エラー・不具合込み)とします。
確認すべきこと・詰まるポイント
sorceryを使用してGoogle認証を導入する際の確認事項と詰まりやすいポイントについて解説します。
承認済みリダイレクトURI
まず、Google Cloudコンソールに登録した承認済みリダイレクトURIと、Railsの設定ファイルであるconfig/settings/development.yml
に記述したURIが一致しているかを確認します。
config>settings>development.yml
に記述します。
sorcery:
google_callback_url: 'http://localhost:3000/oauth/callback?provider=google'
これがなってないとエラーが発生したり、認証に失敗します。
私の場合、http://localhost:3000/oauth/callback
の記述でやったらエラーが発生して、試行錯誤して上記のように記述したところ解消しました。
また本番環境向けにも承認済みリダイレクトURIを用意して、
config>settings>production.yml
に記述します。
sorcery:
google_callback_url: '{本番環境のURL貼り付ける}/oauth/callback?provider=google'
上記の{本番環境のURL貼り付ける}
には、デプロイ先のURLを貼り付けてください。上記のままだと、失敗します。
念の為記載しておりますが、RSpecテストを行うという方は下記の記事にも目を通した方が良いかも知れません。URIの記述をローカルと本番用で分けないとエラーが発生するようです。RSpecテストはしないという方は不要です。
soceryで実装したカラムの確認
userモデルにあるカラムはusername
もしくはname
、その他か確認します。
これが異なっていると認証に失敗します。
確認したらsocery.rb
を修正します。
config.google.user_info_mapping = { email: "email", name: "name" }
私の場合、user
のカラムがname
だったので、下記のようにusername
としたところ失敗しました。
config.google.user_info_mapping = { email: "email", :username => "name" }
なので、email
とname
カラムが自分のと合っているか確認が必要です。
そして、crypted_password
とsalt
の制約が必須になってないか確認します。
googleAPIではそれらが任意となっているため、ここが必須になってしまっていると認証に失敗します。
私の場合
create_table "users", force: :cascade do |t|
t.string "name", null: false
t.string "email", null: false
t.string "crypted_password", null: false
t.string "salt", null: false
t.datetime "created_at", null: false
t.datetime "updated_at", null: false
t.index ["email"], name: "index_users_on_email", unique: true
end
crypted_password
とsalt
を必須の設定にしていたため認証に失敗していました。
なので、変更のマイグレーションファイルを追加して、任意としました。
rails g migration ChangeUsersCryptedPasswordAndSalt
追加されたファイルを
class ChangeUsersCryptedPasswordAndSalt < ActiveRecord::Migration[7.1]
def change
change_column_null :users, :crypted_password, true
change_column_null :users, :salt, true
end
end
として、rails db:migrate
して完了です。
これで解消できるかと思われます。
参考記事
こちらの記事を見れば一通り実装できます。
Google API設定
おわりに
この記事が、sorceryを使ってGoogle認証を導入しようとしている方々の助けになれば幸いです。もし、この記事の内容に不備や改善点などがありましたら、ご指摘いただけると嬉しいです。
それでは、開発頑張ってください!