|
@@ -0,0 +1,78 @@
|
|
|
+class Users::OmniauthCallbacksController < Devise::OmniauthCallbacksController
|
|
|
+ before_action :set_service
|
|
|
+ before_action :set_user
|
|
|
+
|
|
|
+ attr_reader :service, :user
|
|
|
+
|
|
|
+ def facebook
|
|
|
+ handle_auth "Facebook"
|
|
|
+ end
|
|
|
+
|
|
|
+ def twitter
|
|
|
+ handle_auth "Twitter"
|
|
|
+ end
|
|
|
+
|
|
|
+ def github
|
|
|
+ handle_auth "Github"
|
|
|
+ end
|
|
|
+
|
|
|
+ private
|
|
|
+
|
|
|
+ def handle_auth(kind)
|
|
|
+ if service.present?
|
|
|
+ service.update(service_attrs)
|
|
|
+ else
|
|
|
+ user.services.create(service_attrs)
|
|
|
+ end
|
|
|
+
|
|
|
+ if user_signed_in?
|
|
|
+ flash[:notice] = "Your #{kind} account was connected."
|
|
|
+ redirect_to edit_user_registration_path
|
|
|
+ else
|
|
|
+ sign_in_and_redirect user, event: :authentication
|
|
|
+ set_flash_message :notice, :success, kind: kind
|
|
|
+ end
|
|
|
+ end
|
|
|
+
|
|
|
+ def auth
|
|
|
+ request.env['omniauth.auth']
|
|
|
+ end
|
|
|
+
|
|
|
+ def set_service
|
|
|
+ @service = Service.where(provider: auth.provider, uid: auth.uid).first
|
|
|
+ end
|
|
|
+
|
|
|
+ def set_user
|
|
|
+ if user_signed_in?
|
|
|
+ @user = current_user
|
|
|
+ elsif service.present?
|
|
|
+ @user = service.user
|
|
|
+ elsif User.where(email: auth.info.email).any?
|
|
|
+ # 5. User is logged out and they login to a new account which doesn't match their old one
|
|
|
+ flash[:alert] = "An account with this email already exists. Please sign in with that account before connecting your #{auth.provider.titleize} account."
|
|
|
+ redirect_to new_user_session_path
|
|
|
+ else
|
|
|
+ @user = create_user
|
|
|
+ end
|
|
|
+ end
|
|
|
+
|
|
|
+ def service_attrs
|
|
|
+ expires_at = auth.credentials.expires_at.present? ? Time.at(auth.credentials.expires_at) : nil
|
|
|
+ {
|
|
|
+ provider: auth.provider,
|
|
|
+ uid: auth.uid,
|
|
|
+ expires_at: expires_at,
|
|
|
+ access_token: auth.credentials.token,
|
|
|
+ access_token_secret: auth.credentials.secret,
|
|
|
+ }
|
|
|
+ end
|
|
|
+
|
|
|
+ def create_user
|
|
|
+ User.create(
|
|
|
+ email: auth.info.email,
|
|
|
+ #name: auth.info.name,
|
|
|
+ password: Devise.friendly_token[0,20]
|
|
|
+ )
|
|
|
+ end
|
|
|
+
|
|
|
+end
|