Search code examples
ruby-on-railsgoogle-oauthgoogle-authenticationomniauth-google-oauth2

Login google outh2 in rails


Whenever I tried to update first name and last name while logged-in through Google, It updates value. But when I re-logged in than It shows the old value (previous value were not saved).

Here is my code:

  def self.create_user_for_google(data)      
    where(uid: data['email']).first_or_initialize.tap do |user|
      user.provider = 'google_oauth2'
      user.uid = data['email']
      user.first_name = data['given_name']
      user.last_name = data['family_name']
      user.avatar = data['picture']
      user.email = data['email']
      user.password = Devise.friendly_token[0, 20]
      user.password_confirmation = user.password
      user.save!
    end
  end

Terminal log while login:

User Load (13.3ms)  SELECT  "users".* FROM "users" WHERE "users"."uid" = $1 ORDER BY "users"."id" ASC LIMIT $2  [["uid", "[email protected]"], ["LIMIT", 1]]
   (0.3ms)  BEGIN
  SQL (0.5ms)  UPDATE "users" SET "encrypted_password" = $1, "updated_at" = $2 WHERE "users"."id" = $3  [["encrypted_password", "$2a$11$ZciQXx/CT002PMF9H39YNeEKG2PntUGY7He700b.2jf1AxQ5wRh5."], ["updated_at", "2018-03-26 11:50:30.371416"], ["id", "5b069a90-fb67-4ecb-8d50-35f7db998968"]]
   (20.2ms)  COMMIT
   (0.2ms)  BEGIN
  SQL (0.6ms)  UPDATE "users" SET "tokens" = $1, "updated_at" = $2 WHERE "users"."id" = $3  [["tokens", "{\"5-4d695IrkWxSCZIvRVKPA\":{\"token\":\"$2a$10$xa12/ZD9X.WFlkl9hpsYj.Ft3Ru.wkmbAPd1YjS5rBFwLHYN9Apd.\",\"expiry\":1522151430,\"last_token\":null,\"updated_at\":\"2018-03-26T17:35:30.394+05:45\"}}"], ["updated_at", "2018-03-26 11:50:30.506272"], ["id", "5b069a90-fb67-4ecb-8d50-35f7db998968"]]
   (85.0ms)  COMMIT
   (0.4ms)  BEGIN
   (0.6ms)  COMMIT

Solution

  • Try following:

    where(uid: data['email']).first_or_create do |user|
      user.provider = 'google_oauth2'
      user.first_name = data['given_name']
      user.last_name = data['family_name']
      user.avatar = data['picture']
      user.email = data['email']
      user.password = Devise.friendly_token[0, 20]
      user.password_confirmation = user.password
    end
    

    Your implementation updates a user on each login through Google with the old data

    where(uid: data['email']).first_or_initialize.tap do |user|
      ...
      user.save!
    end