LoginSignup
0

More than 5 years have passed since last update.

[Rails] TwitterAPI(omniauth-twitter)とdeviseを使用して新規登録(サインアップ)できないとき

Last updated at Posted at 2019-03-23

問題

deviseとomniauth-twitterを使ってTwitterログインできるようにしようと
各種設定を行ったが、新規登録をするとエラーが発生してしまう。

自分はmodels/user.rbにはこのような記述をした

models/user.rb
  def self.from_omniauth(auth)
    find_or_create_by(provider: auth[:provider], uid: auth[:uid]) do |user|
      user.uid = auth[:uid],
      user.provider = auth[:provider],
      user.username = auth[:username]
    end
  end

その結果、新規登録ボタンを押しても

  User Load (0.3ms)  SELECT  "users".* FROM "users" WHERE "users"."provider" = ? AND "users"."uid" = ? LIMIT ?  [["provider", "twitter"], ["uid", "伏せますね"], ["LIMIT", 1]]
   app/models/user.rb:9
   (0.0ms)  begin transaction
   app/models/user.rb:9
   (0.0ms)  rollback transaction

とロールバックしてしまい登録できない。


原因

原因はすぐにわかった。
Userモデルには、Twitter登録用にuid, provider, usernameという3つの
カラムを登録したが、それとは別に通常ログイン用の emailpasswordカラムもある。
rails g devise:model User時に自動設定されるはず)


てことはemailpasswordにはvalidationが設定されているため、
uid, provider, usernameと一緒にemail, passwordにもvalidationを
満たすような値を設定しなければならない。


解決策

email, passwordにダミーの値を入れて解決した。

models/user.rb
#  def self.from_omniauth(auth)
#    find_or_create_by(provider: auth[:provider], uid: auth[:uid]) do |user|
#      user.uid      = auth[:uid],
#      user.provider = auth[:provider],
#      user.username = auth[:username],
      user.email    = self.dummy_email(auth),       #emailにダミーを設定する
      user.password = Devise.friendly_token[0, 10]  #passwordに適当な値を設定する
#    end
#  end

  private

  def self.dummy_email(auth)
    "#{auth[:username]}_#{auth[:uid]}@example.com"
  end

ちなみに

userが一人も登録されていないとする。

user.rbuid, provider, usernameだけ設定してTwitterでログインしようとすると、
登録失敗後、uid, provider, usernameがキャッシュされる場合がある。

その場合、その後に(通常の)新規登録画面で、emailpasswordを入力して新規登録すると、
フォームで設定された値によってはuid, providerm usernameがキャッシュされたまま
id=1のユーザとして登録されてしまう
ので、注意が必要。

つまり、uid, provider, usernameで登録(失敗)して、
それとは別にemail, passwordで登録したはずなのに
uid, provider, username, email, passwordをもつuserが作られてしまうということ。



登録後にコンソールでUser.all打って確認する必要がありそう。。



おわり

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
0