使用 Ruby 的双重身份验证(通过设计)
Two factor auth with Ruby (through devise)
我要为我的 Ruby 应用程序添加两因素身份验证。我需要用简单的用例来真正简单地实现它:
能够通过短信或电子邮件生成和发送代码(意思是,我不想用这个附加到 Google 验证器);
能够首先显示登录密码表单,然后是代码表单(就像 github 现在所做的那样)。
听起来还不像火箭科学。但不知何故我卡住了。
所以我的问题是:有没有人尝试实现这个,如果是的话,你使用了什么策略来实现这个?
我试过使用 devise-two-factor
gem,它被描述为 "Barebones two-factor authentication with Devise"。
在后台,它使用登录名+密码+代码(同时)对用户进行身份验证。但在我的用例中,我希望用户先输入登录名+密码(通过表单发布),然后在用户之前将代码发送给用户,然后在下一个屏幕上输入代码。
我找到的唯一解决方案是将登录名和密码存储在会话中(原文如此!),并在用户输入 2 元代码后用于对用户进行身份验证。我对这个策略不是很自信。
devise-two-factor 对您的登录应该如何工作自以为是。我认为您最好直接使用 ROTP gem(设计双因素使用)并实施自定义解决方案。
来自 Twilio 的瑞奇。
我们构建了一个 Two-Factor Authentication application in Ruby 如果您正在寻找灵感,可以查看一下。我们的应用程序使用的是 Authy,代码中有几个相关位可以启动它。
首先,当您创建新用户时,您需要向 Authy 注册他们以启用 2FA:
@user = User.new(user_params)
if @user.save
session[:user_id] = @user.id
authy = Authy::API.register_user(
email: @user.email,
cellphone: @user.phone_number,
country_code: @user.country_code
)
@user.update(authy_id: authy.id)
redirect_to account_path
else
render :new
end
然后当用户尝试登录时,您可以使用 Authy 通过短信发送令牌,然后验证他们输入的令牌:
def send_token
@user = User.find(session[:pre_2fa_auth_user_id])
Authy::API.request_sms(id: @user.authy_id)
render plain: 'sending token'
end
def verify
@user = User.find(session[:pre_2fa_auth_user_id])
token = Authy::API.verify(id: @user.authy_id, token: params[:token])
if token.ok?
session[:user_id] = @user.id
session[:pre_2fa_auth_user_id] = nil
redirect_to account_path
else
flash.now[:danger] = "Incorrect code, please try again"
redirect_to new_session_path
end
end
希望对您有所帮助!
感觉最好在这里回答自己:毕竟我发现 gitlab 做这个 2FA 的方式最符合我的需要:https://gitlab.com/gitlab-org/gitlab-ce/merge_requests/474
所以我使用了这段代码中的一些想法。
谢谢gitlab的各位,帮了我大忙!
我要为我的 Ruby 应用程序添加两因素身份验证。我需要用简单的用例来真正简单地实现它:
能够通过短信或电子邮件生成和发送代码(意思是,我不想用这个附加到 Google 验证器);
能够首先显示登录密码表单,然后是代码表单(就像 github 现在所做的那样)。
听起来还不像火箭科学。但不知何故我卡住了。
所以我的问题是:有没有人尝试实现这个,如果是的话,你使用了什么策略来实现这个?
我试过使用 devise-two-factor
gem,它被描述为 "Barebones two-factor authentication with Devise"。
在后台,它使用登录名+密码+代码(同时)对用户进行身份验证。但在我的用例中,我希望用户先输入登录名+密码(通过表单发布),然后在用户之前将代码发送给用户,然后在下一个屏幕上输入代码。
我找到的唯一解决方案是将登录名和密码存储在会话中(原文如此!),并在用户输入 2 元代码后用于对用户进行身份验证。我对这个策略不是很自信。
devise-two-factor 对您的登录应该如何工作自以为是。我认为您最好直接使用 ROTP gem(设计双因素使用)并实施自定义解决方案。
来自 Twilio 的瑞奇。
我们构建了一个 Two-Factor Authentication application in Ruby 如果您正在寻找灵感,可以查看一下。我们的应用程序使用的是 Authy,代码中有几个相关位可以启动它。
首先,当您创建新用户时,您需要向 Authy 注册他们以启用 2FA:
@user = User.new(user_params)
if @user.save
session[:user_id] = @user.id
authy = Authy::API.register_user(
email: @user.email,
cellphone: @user.phone_number,
country_code: @user.country_code
)
@user.update(authy_id: authy.id)
redirect_to account_path
else
render :new
end
然后当用户尝试登录时,您可以使用 Authy 通过短信发送令牌,然后验证他们输入的令牌:
def send_token
@user = User.find(session[:pre_2fa_auth_user_id])
Authy::API.request_sms(id: @user.authy_id)
render plain: 'sending token'
end
def verify
@user = User.find(session[:pre_2fa_auth_user_id])
token = Authy::API.verify(id: @user.authy_id, token: params[:token])
if token.ok?
session[:user_id] = @user.id
session[:pre_2fa_auth_user_id] = nil
redirect_to account_path
else
flash.now[:danger] = "Incorrect code, please try again"
redirect_to new_session_path
end
end
希望对您有所帮助!
感觉最好在这里回答自己:毕竟我发现 gitlab 做这个 2FA 的方式最符合我的需要:https://gitlab.com/gitlab-org/gitlab-ce/merge_requests/474
所以我使用了这段代码中的一些想法。
谢谢gitlab的各位,帮了我大忙!