Rails의 2단계 인증 Gem Devise-Two-Factor의 데모를 만져 보았다

Rails의 2단계 인증



2단계 인증을 구현하기 쉽게 하는 Gem은 몇 종류나 나돌고 있는 것 같습니다. 신뢰할 수 있는 WEB 서비스에는 대체로 2단계 인증 기능이 붙어 있지 않습니까?
  • tinfoil/devise-to-factor htps : // 기주 b. 코 m / 짱 후이 l /
  • mdp/rotp htps : // 기주 b. 코 m/mdp/여 tp

  • 이 두 가지로 헤매었습니다만, 프로젝트에서 Devise를 사용하고 있다면, Devise-Two-Factor 쪽이 궁합 좋지 않아?
    그래서 Devise-Two-Factor를 채용하기로 했습니다.

    실제로 Devise-Two-Factor는 rotp를 래핑하여 해시 값을 만들 때 rotp를 사용합니다.

    당사의 제품에 통합하면 또 별도로 정리를 만들려고합니다.

    환경 및 버전



    Mac OS Ⅹ Yosemite
    Rails: 4.1.0
    Ruby: 2.1.5p273

    절차



    보통 리포지토리에서 git clone 로 떨어지고 와서, 우선 디폴트의 Gemfile로 bundle install 해 보았습니다.

    그러면 pg(PostgreSQL)의 config 파일이 없으면 굉장히 화나게 됩니다. PostgreSQL에 대해 그다지 밝지 않기 때문에, 저는 간편한 SQLite3로 변경했습니다.

    데모의 기본 DB는 PostgreSQL입니다. 코멘트 아웃하고 SQLite로 바꾸자.

    Gemfile
    # gem 'pg'
    gem 'sqlite3'
    

    config/database.yml
    default: &default
      adapter: sqlite3 # postgresql
      encoding: unicode
      # For details on connection pooling, see rails configuration guide
      # http://guides.rubyonrails.org/configuring.html#database-pooling
      pool: 5
    

    그런 다음 명령줄 작업으로 이동합니다.
  • Demo 디렉토리에서 bundle install
  • bundle exec rake db:migrate 로 DB, 테이블을 작성합니다.
  • rails c 에서 User 를 입력하여 제대로 속성이 있는지 확인해 봅시다.


  • rails s 에서 서버를 시작합니다. 디폴트 3000번 포트를 다른 프로젝트에서 사용하고 있었으므로 rails s -p 3003 로 3003번에 액세스.
  • http://localhost:3003 방문

  • 매우 간단하지만 안전한 브라우저로 표시되었습니다.
    Sign up 해 봅시다.







    로그인에 성공하면 Enable 2FA 버튼이 나타납니다.



    users_controller.rb
    class UsersController < ApplicationController
      #
      #  other code...
      #
      def enable_otp
        current_user.otp_secret = User.generate_otp_secret
        current_user.otp_required_for_login = true
        current_user.save!
        redirect_to home_index_path
      end
    end
    

    2단계 인증을 활성화하는 것은 enable_otp 메소드입니다.User.generate_otp_secret 에서 해시 값을 만들고 저장합니다.

    Enable 2FA를 누르자!


    Demo에는 해시 값을 QR 코드로 변환해주는 gem 'rqrcode-rails3'이 들어 있습니다. 
    처음부터 QR 코드를 생성하도록 View에 기재되어 있으므로 Enable 2FA에서 다음 화면으로 전환하면 QR 코드가 표시됩니다.

    index.html.erb
    
    <% if current_user.otp_required_for_login %>
        <%= button_to "Disable 2FA", users_disable_otp_path, :method => :post %>
        <%= raw RQRCode::render_qrcode(current_user.otp_provisioning_uri(current_user.email, issuer: "Devise-Two-Factor-Demo"),
                                       :svg,
                                       :level => :l,
                                       :unit => 2) %>
    


    이것을 GoogleAuthenticator에서 읽어 보면 ...



    했어.
    여기에 표시된 주소는 다른 때에 캡처한 것이므로 다른 것이 입력되어 있습니다만, 실제로는 가입시에 등록한 주소가 표시됩니다.

    이 일회성 경로를 입력하면 2단계 인증이 완료됩니다.
    한 번 로그아웃하여 제대로 표시된 번호로 로그인할 수 있는지 확인해 봅시다.

    요약



    Devise로 로그인 인증이나 세션 관리하고 있다면, 추천 Gem이라고 생각합니다.

    만약 SMS등으로 번호를 단말에 통지하는 등의 기능을 붙이고 싶은 경우는 각 휴대 캐리어에의 요금이나 통신이 발생하므로, 별도 서비스와의 계약이 필요합니다.
    최근에는 Twilio 등이 자주 사용되고 있는 것 같네요.
    Twilio for KDDI Web Communications | 클라우드 전화 API

    Qiita나 Github도 2단계 인증을 구현하고 있으므로, 꼭 해보면 좋을지도 모릅니다! 보안이 매우 중요한 요소인 시대이기 때문에...

    그럼 또.

    좋은 웹페이지 즐겨찾기