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

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

公众号_爱莉莎的雪月花.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: '[email protected]')
  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 回复

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

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

martin91 回复

原来如此

pathbox 回复

不会的,正在使用中

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

这个不错!

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

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

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

pynix 回复

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

elizachen 回复

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

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

elizachen 回复

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

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

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

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

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