노래하듯 이야기하고, 춤추듯 정복하라.

[Ruby On Rails] Devise 젬을 사용한 Email 인증 본문

프로그래밍/Ruby & Rails

[Ruby On Rails] Devise 젬을 사용한 Email 인증

hyeoke 2019. 1. 24. 16:20

인사글

안녕하세요. 멋쟁이사자처럼 6기를 수료하고, 현재 스타트업에 근무하고 있는 25살 모닝버드 니다 ^^

요즘 레일즈르 서비스를 개발중이라 정신이 없어서.. 오랜만에 포스팅을 하는데요..!


개발과정에 있어서 새롭게 배워나가는 부분을 중심으로 규칙적인 포스팅을 다시 시작하려 합니다. 

오늘은 레일즈의 Devise 젬을 사용한 이메일 인증을 구현 해 보겠습니다.


이메일 인증


# 사전 세팅

본 포스트에서의 이메일 인증 구현은, 사전에 Devise 젬 설치 및 세팅(간단한 Post 모델 생성: Scaffold)이 되어 있는 것으로 가정한다.

- devise 설치 및 User 모델 생성: https://github.com/plataformatec/devise/

- Post 모델 생성: rails g model post title:string body:text


# 참고 자료(링크)

- https://blog.naver.com/kbs4674/221068186479


# /db/migrat/(날짜)_devise_create_user.rb 수정

1. 줄 24~33, 40~41 주석 해제

# frozen_string_literal: true

class DeviseCreateUsers < ActiveRecord::Migration[5.0]
  def change
    create_table :users do |t|
      ## Database authenticatable
      t.string :email,              null: false, default: ""
      t.string :encrypted_password, null: false, default: ""

      ## Recoverable
      t.string   :reset_password_token
      t.datetime :reset_password_sent_at

      ## Rememberable
      t.datetime :remember_created_at

      ## Trackable
      # t.integer  :sign_in_count, default: 0, null: false
      # t.datetime :current_sign_in_at
      # t.datetime :last_sign_in_at
      # t.string   :current_sign_in_ip
      # t.string   :last_sign_in_ip

      # Confirmable
      t.string   :confirmation_token
      t.datetime :confirmed_at
      t.datetime :confirmation_sent_at
      t.string   :unconfirmed_email # Only if using reconfirmable

      # Lockable
      t.integer  :failed_attempts, default: 0, null: false # Only if lock strategy is :failed_attempts
      t.string   :unlock_token # Only if unlock strategy is :email or :both
      t.datetime :locked_at

      t.timestamps null: false
    end

    add_index :users, :email,                unique: true
    add_index :users, :reset_password_token, unique: true
    add_index :users, :confirmation_token,   unique: true
    add_index :users, :unlock_token,         unique: true
  end
end

2. DB 적용

- $ rails db:drop

- $ rails db:migrate


# app/models/user.rb 수정

3번째 줄과 같이, 맨 끝에 :confirmable을 추가한다.

class User < ApplicationRecord
  devise :database_authenticatable, :registerable,
         :recoverable, :rememberable, :validatable, :confirmable
end


# config/environments/development.rb 수정

- 주의사항: 포트번호 587 유지, 추 후 구글 정책에 따라 변경될 수 있음

- user_name: 인증 메일을 보낼 구글 이메일(회사 or 개인)

- password: 구글 이메일 비밀번호

* 환경 세팅(environments)이 완료 되면 항상 서버 재부팅 해줄 것. Ctrl+c -> $ rails s

# for email verification
  config.action_mailer.delivery_method = :smtp
  config.action_mailer.perform_deliveries = true
  config.action_mailer.default_url_options = { host: 'http://localhost:3000/', port: 3000  }
  ActionMailer::Base.smtp_settings = {
    :address              => 'smtp.gmail.com',
    :domain               => 'mail.google.com',
    :port                 => 587,
    :user_name            => "hyeok0902e@gmail.com",
    :password             => "Newlife4829!",
    :authentication       => 'login',
    :enable_starttls_auto => true,
  }


- 아래쪽 코드 변경: false -> true

config.action_mailer.raise_delivery_errors = true


# 구글계정 Access 허용 및 보안수준 앱 접근에 대해 허용하기 

- 구글 Access 허용 https://myaccount.google.com/u/0/lesssecureapps?pageId=none

- 보안수준앱 접근 허용https://accounts.google.com/DisplayUnlockCaptcha


★ 페이스북 인증 시 Email Confirmation 스킵하기

- 참고자료: https://stackoverflow.com/questions/7489914/skipping-email-confirmation-for-omniauth-users-using-devise

- /app/models/user.rb -> user.save! 전에 아래 코드 추가하기

user.skip_confirmation!


★ (Local)회원가입 후 Redirect 페이지 만들기

1. registration 컨트롤러에서 protected action 넣기 

- Email Confirmation 메일의 확인을 요청하는 메세지 넣기

- /app/controllers/users/registrations_controller.rb

-> create 액션 주석 해제 후-> redirect_to 세팅하기

* 참고자료: https://github.com/plataformatec/devise/wiki/How-To:-Redirect-to-a-specific-page-on-successful-sign-up-(registration)

def after_inactive_sign_up_path_for(resource)
  '/home/please_confirm'
end

2. routes.rb 에서 devise 관련 부분 수정하기

devise_for :users, :controllers => {
  registrations: 'users/registrations' # for eamil confirmation +a
}


2. home 컨트롤러에서 페이지 생성

- /views/home/please_confirm.html.erb


< Contact: 레일즈 서비스 개발 및 스타트업 관련 문의 >

- Email: hyeok0902e@gmail.com

Comments