Rails 只要六步,轻松添加 Google 两步认证

elizachen · 2017年09月15日 · 最后由 biechao 回复于 2019年12月02日 · 11348 次阅读
本帖已被管理员设置为精华贴

公众号_爱莉莎的雪月花.jpg

明天就要在西子湖畔,参加 RubyChina 大会了。 猛然发现,自己还从来没在论坛里发过帖,没共享过任何知识。好心虚! 一拍大腿,前一阵不是试过 Google 两步认证吗? 赶紧写一篇使用心得! 奉上 github 示例代码:https://github.com/elizachen/google-authenticator-example 再开个网站演示:https://elizarorlab.herokuapp.com/ 以表达爱莉莎的心意!

什么是 Google 两步认证?

Google 两步认证,是 Google 公司提供的,一种增强账户安全性的方式。 它使用 TOTP 算法(基于时间的一次性密码算法)。 借助两步验证,可以为你的网站用户增加一重安全防护。

它包括两个部分

  • 网页端应用
  • 手机端应用(iPhone,Android 均有)

使用前的准备

使用步骤: 一般,在关键步骤(比如需要付费),网站要求你输入授权码第一步,打开手机应用,查看当前的授权码

公众号_爱莉莎的雪月花.jpg

第二步,回到网站,输入授权码,进行验证。

超级简单,有没有!

为啥要用 Google 两步认证?

第一,安全性能大大提高! 如果用户帐户只有密码这道安全防线,密码被盗后,就完了!作恶的人可以尽情狂欢,转钱、高买低卖,好恐怖! 启用两步验证后,即使有坏人破解了您的密码,对于那些要花钱的项目坏人仍需要借助您的手机,才能继续操作。你的手机也被偷了?纳尼?如果你是苹果用户,赶快通过【查找我的 iPhone】挂失,让 iphone 立马变砖头呀!(不要问我怎么知道的,我的小六 plus 就是被偷的)。 第二,google 不作恶。google 出品,安全可靠第三,只要两步,超级简单! 第四,不用花钱。短信验证码,条数超过配额,是要花银子的啊! 第五,更专业!多一道屏障,用户也觉得你靠谱。

如何添加 Google 两步认证?

作者的技术栈是 RoR, 以 Rails 举例。

1.安装 google-authenticator-rails gem。 在 Gemfile 里添加: gem 'google-authenticator-rails'

2.创建用户数据模型,启用 acts_as_google_authenticated。 $ rails g model user name:string email:string salt:string google_secret:string $ rake db:migrate #app / models / user.rb class User < ActiveRecord::Base acts_as_google_authenticated lookup_token: :salt, drift: 30, issuer: 'eliza''s ROR Lab' before_save {|record| record.salt = SecureRandom.hex unless record.salt } after_create {|record| record.set_google_secret } end

acts_as_google_authenticated:添加必要的验证功能。 drift: 是授权码的有效时限。比如设定为 30,30 秒内的验证码有效。 issuer: 显示发行人,如下图:

1.jpg

3.创建 UserMfaSession 和 UserMfaSessionController UserMfaSession 是一个处理 MFA session 的 class。 继承自: GoogleAuthenticatorRails :: Session :: Base。 # app / models / user_mfa_session.rb

class UserMfaSession < GoogleAuthenticatorRails::Session::Base
  # no real code needed here
end

$ rails g controller user_mfa_sessions UserMfaSessionController 是处理 UserMfaSession 的 Controller 类。 # app/controllers / user_mfa_sessions_controller.rb

class UserMfaSessionsController < ApplicationController
  skip_before_filter :check_mfa

  def new
    @user = current_user
  end

  def create
    @user = current_user
    if @user.google_authentic?(params[:auth][:mfa_code])
      UserMfaSession.create(@user)
      redirect_to root_url
    else
      flash[:error] = "Wrong code"
      render :new
    end
  end
end

4.更改 View 代码:验证授权码是否正确。 #app / views / user_mfa_sessions / new.html.erb

<% if flash[:error] %>
  <%= flash[:error] %>
  <br />
<% end %>
<img src="<%= @user.google_qr_uri %>">
<br />
<%= form_tag user_mfa_session_path, method: :post do %>
  <div class="actions">
    <%= text_field :auth, :mfa_code %>
    <%= submit_tag 'authenticate' %>
  </div>
<% end %>

5.在 ApplicationController 中添加 check_mfa。

class ApplicationController < ActionController::Base
  before_filter :check_mfa

  def current_user
    @current_user = User.find_or_create_by(name: 'elizachen', email: 'elizachen34@gmail.com')
  end

  private
  def check_mfa
     if !(user_mfa_session = UserMfaSession.find) && (user_mfa_session ? user_mfa_session.record == current_user : !user_mfa_session)
      redirect_to new_user_mfa_session_url
    end
  end
end

使用checkmfa检查 MFA 身份验证是否完成,如果未通过身份验证,则将其重定向到 MFA 身份验证。

6.路由设定 #config / routes.rb

Rails.application.routes.draw do
  root 'user_mfa_session#new'
  resource :user_mfa_session, only: %i(new create)
end

Screen Shot 2017-09-15 at 13.27.35.png

快来「爱莉莎的 RoR 实验室」试一试

网址:https://elizarorlab.herokuapp.com/

1.在手机上下载 Google Authenticator 认证程序。

2.通过手机扫描网页端的二维码,绑定你的认证账户。

公众号_爱莉莎的雪月花.jpg

公众号_爱莉莎的雪月花.jpg

3.打开手机应用,查看当前的授权码。 4.回到「爱莉莎的 RoR 实验室」https://elizarorlab.herokuapp.com/网站,输入授权码,进行验证。 超级简单,有没有!

是不是很容易呢?

简单、安全、不花钱! Google 两步认证,你的网站,值得拥有!!

示例代码也准备好了,在爱莉莎的 github: https://github.com/elizachen/google-authenticator-example 你不试一试吗?

欢迎留言,欢迎关注我的微信公众号【爱莉莎的雪月花】^_^

第一次发帖,顶

markdown 排版乱啦

很厉害的样子

huacnlee 将本帖设为了精华贴。 09月16日 15:27

会不会有墙?

pathbox #6 回复

不会,你搜下 One Time Password 论坛过去有人有远离解释

@pathbox 原理很简单,核心就是基于时间的散列算法,原理的话我之前在论坛发过,欢迎了解 https://ruby-china.org/topics/32333 。不过我描述的是标准 HOTP 和 TOTP 算法,我不确认 google 是否对 TOTP 进行过改进,但是核心原理是一致的。

martin91 #9 回复

原来如此

pathbox #6 回复

不会的,正在使用中

哇,真是通俗易懂。先收藏了回去实现一下

这个不错!

我开始用上了,后来撤销了,用户如果手机访问网站,登录的时候还要换到 Google 两步认证 APP, 然后再回来填,太麻烦。如果不是很重要的场景,没必要这么安全。

嗯嗯,也可以在用户第一次做涉及资金操作时加。

绑定成功后就不能再绑定了吧?要不然小偷用自己手机绑定,然后继续愉快的转账。如果手机丢了或者 app 卸载了解绑比较麻烦。

pynix #17 回复

可以再绑定,但生成的验证码,是一样一样的。在 APP 上移除账户,不会停用两步验证功能,所以最好在 web 端停用两步验证后,再删除 APP 上的绑定账户,或者卸载 APP。手机丢了,确实很麻烦!但是很多手机有丢失模式,比如 iPhone,直接启用丢失模式,小偷偷了手机,只要联网,一秒手机变废铁或者直接抹除数据,还是比较安全的。

elizachen #18 回复

我的意思是绑定了以后就不能显示私钥了吧,要不然你的账号被爆破了,爆破者可以自己绑定那不就坑了。

修改绑定需要先过验证或者先通过其他方式验证。

elizachen #18 回复

如果在登陆环节就加入那就没问题了。。

2.创建用户数据模型,启用 acts_as_google_authenticated。

的部分,代码格式还是乱的

你这个例子意思是说,只要我有个手机装了 google 的 authenticator 扫描这个二维码就可以得到验证码,通过验证了? 不需要一定用你的手机来扫描?因为扫描二维码的 app 不需要绑定 google 账号,所以我很困惑

需要 登录 后方可回复, 如果你还没有账号请 注册新账号