現在作っているアプリの認証にdeviseを用いているのですが、それにgoogle認証を付け加えたいと思っています。
google認証に関しては以下の記事を参考にして追加してください
user認証時に確認メールを飛ばす設定をしているので、確認ができないとuserの登録ができないようになっています。
ですが、googleアカウントを登録する際はその確認メールがいらないと思うのでどうしようか悩みました。
deviseのconfirmable
これは送られてきた確認メールに記載されているリンクをクリックするとトークンを取得できconfirmed_atに値が入ります
これがnilのままだと登録できないのでgoogleアカウントを用いたuser情報を作成した時にconfirmed_atを入れるようにします。
def self.from_omniauth(auth)
where(provider: auth.provider, uid: auth.uid).first_or_create do |user|
user.email = auth.info.email
user.nickname = auth.info.name
user.password = Devise.friendly_token[0,20]
end
end
現在こんな感じでgoogleの情報をとっています。
・gmailアドレス
・googleアカウント名
・ランダムのパスワード
ここに付け加えてconfirmed_atを作成します。
まずはconfirmed_atにどんな値があるか確認したいので、テストとして適当なアカウントをアプリに登録します
その後コンソールでuserの中身を見てみましょう!
rails c
#コンソール立ち上げ
User.all
#全userを取得
@user = User.find(1)
#1番のuserの情報を@userに入れる
これを実行するとuserの情報が取得できるのでそこで
@user.confirmed_at #を実行すると
=> Fri, 15 Oct 2021 15:10:13 JST +09:00
確認メールをクリックした瞬間の時間が入っていると思いますので、同じようなことをuser.rbに書きます。
def self.from_omniauth(auth)
where(provider: auth.provider, uid: auth.uid).first_or_create do |user|
user.email = auth.info.email
user.nickname = auth.info.name
user.password = Devise.friendly_token[0,20]
user.confirmed_at = Time.current
end
end
付け加えたのはTime.current
つまり現在の時間です
googleで認証した瞬間のtimeを入れるのでconfirmed_atがnilにならず確認メールと同じ型のデータが入ることがわかりました。
時間の設定はconfig/applicationでtimezoneをtokyoとしているので、設定していない人とは時間が違うかもしれませんのでご確認ください
これでgoogleで認証後、googleアカウントに紐づけてnickname,email,passwordカラムを取得できるようになりました!
ですかこれではまだメールが送られてしまうので、送られないようにします。
skip_confirmation!
というヘルパーメソッドを使用することで確認メールの送信をスキップすることができます!
これを先ほどのコードに入れると
def self.from_omniauth(auth)
where(provider: auth.provider, uid: auth.uid).first_or_create do |user|
user.email = auth.info.email
user.skip_confirmation!
user.nickname = auth.info.name
user.password = Devise.friendly_token[0,20]
user.confirmed_at = Time.current
end
end
最後にちゃんとconfirmed_atが追加されているかの確認と、google認証を使わず、そのままメールアドレスを使った新規登録した場合にちゃんとメールが送られてくるのを確認できたら実装完了です!