docbrown/app/controllers/omniauth_callbacks_controller.rb
Vaidehi Joshi c7a1bd9449
Fix logging for dev and test environments (#5922)
* Fix logging for dev and test environments

We had some unused code for Timber in our config files for development and test.
However, this was completely clobbering Rails' default behavior of logging out to log/development.log and log/test.log. We should allow for logging in these environments in particular, and since we're not using Timber there, we can just revert to using the Rails default debugging log levels.

* Add Timber logger to specs that explicitly require it

* Restore default Rails.logger in specs using Timber logger

* Explicitly use Rails.logger in OmniauthCallbacksController

We seem to have different logger classes leaking into this controller in tests.
I'm not entirely sure why this is/haven't been able to investigate yet, but I do think we should be using the Rails.logger explicitly until we can figure that out.
2020-02-07 10:15:08 -05:00

67 lines
2.6 KiB
Ruby

class OmniauthCallbacksController < Devise::OmniauthCallbacksController
LEGACY_COOKIE_NAME = "_PracticalDeveloper_session".freeze
# Don't need a policy for this since this is our sign up/in route
include Devise::Controllers::Rememberable
def twitter
callback_for("twitter")
end
def github
callback_for("github")
end
def failure
Rails.logger.error "Omniauth failure",
omniauth_failure: {
error: request.env["omniauth.error"]&.inspect,
error_type: request.env["omniauth.error.type"].to_s,
auth: request.env["omniauth.auth"],
provider: request.env["omniauth.strategy"].to_s,
cookie: request.env["rack.request.cookie_hash"]
}
super
end
private
def callback_for(provider)
cta_variant = request.env["omniauth.params"]["state"].to_s
@user = AuthorizationService.new(request.env["omniauth.auth"], current_user, cta_variant).get_user
if persisted_and_valid?
# delete legacy session based cookie once the user has logged in again
request.cookie_jar.delete(LEGACY_COOKIE_NAME) if request.cookies[LEGACY_COOKIE_NAME]
remember_me(@user)
sign_in_and_redirect @user, event: :authentication
set_flash_message(:notice, :success, kind: provider.to_s.capitalize) if is_navigational_format?
elsif persisted_but_username_taken?
redirect_to "/settings?state=previous-registration"
else
session["devise.#{provider}_data"] = request.env["omniauth.auth"]
user_errors = @user.errors.full_messages
Rails.logger.error "Log in error: sign in failed. username: #{@user.username} - email: #{@user.email}"
Rails.logger.error "Log in error: auth data hash - #{request.env['omniauth.auth']}"
Rails.logger.error "Log in error: auth data hash - #{request.env['omniauth.error']&.inspect}"
Rails.logger.error "Log in error: user_errors: #{user_errors}"
flash[:alert] = user_errors
redirect_to new_user_registration_url
end
rescue StandardError => e
Rails.logger.error "Log in error: #{e}"
Rails.logger.error "Log in error: auth data hash - #{request.env['omniauth.auth']}"
Rails.logger.error "Log in error: auth data hash - #{request.env['omniauth.error']&.inspect}"
flash[:alert] = "Log in error: #{e}"
redirect_to new_user_registration_url
end
def persisted_and_valid?
@user.persisted? && @user.valid?
end
def persisted_but_username_taken?
@user.persisted? && @user.errors.full_messages.join(", ").include?("username has already been taken")
end
end