1 # frozen_string_literal: true
3 class Auth
::SessionsController < Devise
::SessionsController
4 include Devise
::Controllers::Rememberable
8 skip_before_action
:require_no_authentication, only
: [:create]
9 prepend_before_action
:authenticate_with_two_factor, if: :two_factor_enabled?, only
: [:create]
26 if session
[:otp_user_id]
27 User
.find(session
[:otp_user_id])
28 elsif user_params
[:email]
29 User
.find_by(email
: user_params
[:email])
34 params
.require(:user).permit(:email, :password, :otp_attempt)
37 def after_sign_in_path_for(_resource
)
38 last_url
= stored_location_for(:user)
40 if [about_path
].include?(last_url
)
47 def two_factor_enabled
?
48 find_user
.try(:otp_required_for_login?)
51 def valid_otp_attempt
?(user
)
52 user
.validate_and_consume_otp!
(user_params
[:otp_attempt]) ||
53 user
.invalidate_otp_backup_code!
(user_params
[:otp_attempt])
54 rescue OpenSSL
::Cipher::CipherError => _error
58 def authenticate_with_two_factor
59 user
= self.resource
= find_user
61 if user_params
[:otp_attempt].present
? && session
[:otp_user_id]
62 authenticate_with_two_factor_via_otp(user
)
63 elsif user
&& user
.valid_password
?(user_params
[:password])
64 prompt_for_two_factor(user
)
68 def authenticate_with_two_factor_via_otp(user
)
69 if valid_otp_attempt
?(user
)
70 session
.delete(:otp_user_id)
74 flash
.now
[:alert] = I18n
.t('users.invalid_otp_token')
75 prompt_for_two_factor(user
)
79 def prompt_for_two_factor(user
)
80 session
[:otp_user_id] = user
.id