Emi Matchu
5cc219c795
including validation logic to make sure it's not already connected to another one! The `intent` param on the NeoPass form is part of the key! Thanks OmniAuth for making it easy to pass that data through!
96 lines
2.7 KiB
Ruby
96 lines
2.7 KiB
Ruby
class Devise::OmniauthCallbacksController < ApplicationController
|
|
rescue_from AuthUser::AuthAlreadyConnected, with: :auth_already_connected
|
|
rescue_from AuthUser::MissingAuthInfoError, with: :missing_auth_info
|
|
rescue_from ActiveRecord::RecordInvalid, with: :validation_failed
|
|
|
|
def neopass
|
|
case intent_param
|
|
when "login"
|
|
sign_in_with_neopass
|
|
when "connect"
|
|
connect_with_neopass
|
|
else
|
|
flash[:alert] = "Hrm, the NeoPass form you used was missing some " +
|
|
"\"intent\" information. That's surprising! Maybe try again?"
|
|
redirect_to root_path
|
|
end
|
|
end
|
|
|
|
def failure
|
|
flash[:warning] =
|
|
"Hrm, something went wrong in our connection to NeoPass, sorry! " +
|
|
"Maybe wait a moment and try again?"
|
|
redirect_to new_auth_user_session_path
|
|
end
|
|
|
|
private
|
|
|
|
def sign_in_with_neopass
|
|
@auth_user = AuthUser.from_omniauth(request.env["omniauth.auth"])
|
|
|
|
if @auth_user.previously_new_record?
|
|
flash[:notice] =
|
|
"Welcome to Dress to Impress! We've set up a DTI account for you, " +
|
|
"attached to your NeoPass. Click Settings in the top right to learn " +
|
|
"more, or just go ahead and get started!"
|
|
else
|
|
flash[:notice] =
|
|
"Welcome back, #{@auth_user.name}! You are now logged in. 💖"
|
|
end
|
|
|
|
sign_in_and_redirect @auth_user, event: :authentication
|
|
end
|
|
|
|
def connect_with_neopass
|
|
raise AccessDenied unless auth_user_signed_in?
|
|
|
|
current_auth_user.connect_omniauth!(request.env["omniauth.auth"])
|
|
|
|
flash[:notice] = "We've successfully connected your NeoPass!"
|
|
redirect_to edit_auth_user_path
|
|
end
|
|
|
|
def auth_already_connected(error)
|
|
flash[:alert] = "This NeoPass is already connected to another account. " +
|
|
"You'll need to log out of this account, log in with that NeoPass, " +
|
|
"then disconnect it from the other account."
|
|
redirect_to return_path
|
|
end
|
|
|
|
def missing_auth_info(error)
|
|
Sentry.capture_exception error
|
|
Rails.logger.error error.full_message
|
|
|
|
flash[:warning] =
|
|
"Hrm, our connection with NeoPass didn't return the information we " +
|
|
"usually expect, sorry! If this keeps happening, please email me at " +
|
|
"matchu@openneo.net so I can help investigate!"
|
|
redirect_to return_path
|
|
end
|
|
|
|
def validation_failed(error)
|
|
Sentry.capture_exception error
|
|
Rails.logger.error error.full_message
|
|
|
|
flash[:warning] =
|
|
"Hrm, the connection with NeoPass worked, but we had trouble saving " +
|
|
"your account, sorry! If this keeps happening, please email me at " +
|
|
"matchu@openneo.net so I can help investigate!"
|
|
redirect_to return_path
|
|
end
|
|
|
|
def intent_param
|
|
request.env['omniauth.params']["intent"]
|
|
end
|
|
|
|
def return_path
|
|
case intent_param
|
|
when "login"
|
|
new_auth_user_session_path
|
|
when "connect"
|
|
edit_auth_user_path
|
|
else
|
|
root_path
|
|
end
|
|
end
|
|
end
|