13
6

【Rails】Sorcery使用によるGoogle認証の注意点

Last updated at Posted at 2024-06-08

はじめに

この記事では、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が一致しているかを確認します。

スクリーンショット 2024-06-08 20.31.39.png

config>settings>development.ymlに記述します。

development.yml
sorcery:
  google_callback_url: 'http://localhost:3000/oauth/callback?provider=google'

これがなってないとエラーが発生したり、認証に失敗します。

私の場合、http://localhost:3000/oauth/callbackの記述でやったらエラーが発生して、試行錯誤して上記のように記述したところ解消しました。

また本番環境向けにも承認済みリダイレクトURIを用意して、
config>settings>production.ymlに記述します。

production.yml
sorcery:
  google_callback_url: '{本番環境のURL貼り付ける}/oauth/callback?provider=google'

上記の{本番環境のURL貼り付ける}には、デプロイ先のURLを貼り付けてください。上記のままだと、失敗します。

念の為記載しておりますが、RSpecテストを行うという方は下記の記事にも目を通した方が良いかも知れません。URIの記述をローカルと本番用で分けないとエラーが発生するようです。RSpecテストはしないという方は不要です。

soceryで実装したカラムの確認

userモデルにあるカラムはusernameもしくはname、その他か確認します。
これが異なっていると認証に失敗します。
確認したらsocery.rbを修正します。

socery.rb
config.google.user_info_mapping = { email: "email", name: "name" }

私の場合、userのカラムがnameだったので、下記のようにusernameとしたところ失敗しました。

socery.rb
config.google.user_info_mapping = { email: "email", :username => "name" }

なので、emailnameカラムが自分のと合っているか確認が必要です。

そして、crypted_passwordsaltの制約が必須になってないか確認します。
googleAPIではそれらが任意となっているため、ここが必須になってしまっていると認証に失敗します。

私の場合

schema.rb
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_passwordsaltを必須の設定にしていたため認証に失敗していました。
なので、変更のマイグレーションファイルを追加して、任意としました。

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認証を導入しようとしている方々の助けになれば幸いです。もし、この記事の内容に不備や改善点などがありましたら、ご指摘いただけると嬉しいです。

それでは、開発頑張ってください!

13
6
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
13
6