@ -39,7 +39,7 @@ module Devise
drift = options [ :drift ] || self . class . allowed_otp_drift_seconds
drift = options [ :drift ] || self . class . allowed_otp_drift_seconds
raise " authenticate_totp called with no otp_secret_key set " if totp_secret . nil?
raise " authenticate_totp called with no otp_secret_key set " if totp_secret . nil?
totp = ROTP :: TOTP . new ( totp_secret , digits : digits )
totp = ROTP :: TOTP . new ( totp_secret , digits : digits )
new_timestamp = totp . verify_with_drift_and_prior ( code , drift , totp_timestamp )
new_timestamp = totp . verify_with_drift_and_prior ( without_spaces ( code ) , drift , totp_timestamp )
return false unless new_timestamp
return false unless new_timestamp
self . totp_timestamp = new_timestamp
self . totp_timestamp = new_timestamp
true
true
@ -103,6 +103,10 @@ module Devise
private
private
def without_spaces ( code )
code . gsub ( / \ s / , '' )
end
def random_base10 ( digits )
def random_base10 ( digits )
SecureRandom . random_number ( 10 ** digits ) . to_s . rjust ( digits , '0' )
SecureRandom . random_number ( 10 ** digits ) . to_s . rjust ( digits , '0' )
end
end