diff --git a/app/controllers/users/omniauth_callbacks_controller.rb b/app/controllers/users/omniauth_callbacks_controller.rb index 802d2c8..050e463 100644 --- a/app/controllers/users/omniauth_callbacks_controller.rb +++ b/app/controllers/users/omniauth_callbacks_controller.rb @@ -7,27 +7,28 @@ class Users::OmniauthCallbacksController < Devise::OmniauthCallbacksController protected def oauthorize(provider) - @user = find_for_oauth(provider) - return unless @user - if @user.active_for_authentication? - flash[:notice] = I18n.t "devise.omniauth_callbacks.success", kind: provider.camelcase - session["devise.google_apps_data"] = env["omniauth.auth"] - @user.remember_me! if session.delete(:user_remember_me) == "1" - end - if user_signed_in? - redirect_to :back - else - sign_in_and_redirect @user, event: :authentication - end + return redirect_to(:back) if user_signed_in? + @user = find_or_create_user(provider) + return redirect_to(:back) unless @user && @user.active_for_authentication? + flash[:notice] = I18n.t "devise.omniauth_callbacks.success", kind: provider.camelcase + session["devise.google_apps_data"] = env["omniauth.auth"] + @user.remember_me! if session.delete(:user_remember_me) == "1" + sign_in_and_redirect @user, event: :authentication end - def find_for_oauth(provider) + def find_or_create_user(provider) user = if resource then resource - elsif email then find_or_create_by_email(email) - elsif uid then find_or_create_by_uid(uid) + elsif email then User.where(email: email).first + elsif uid then Authentication.where(uid: uid).first.try(:user) else raise "Bad provider data: #{auth.inspect}" end + if !user + user = User.new(user_attrs.merge(password: Devise.friendly_token[0,20])) + user.skip_confirmation! + user.save!(validate: false) + end + authentication = user.authentications.where(provider: provider).first if authentication.nil? authentication_attrs = authorization_attrs.merge(provider: provider) @@ -37,24 +38,6 @@ class Users::OmniauthCallbacksController < Devise::OmniauthCallbacksController return user end - - def find_or_create_by_uid(uid) - auth = Authentication.where(uid: uid).first - return auth ? auth.user : make_user - end - - def find_or_create_by_email(email) - user = User.where(email: email).first - return user ? user : make_user - end - - def make_user - return current_user if user_signed_in? - user = User.new(user_attrs.merge(password: Devise.friendly_token[0,20])) - user.skip_confirmation! - user.save!(validate: false) - return user - end def auth; env["omniauth.auth"] end def uid; @uid ||= auth['uid'] rescue nil end