섭사장의 블로그

devise gem with heroku

March 09, 2018 | 3 Minute Read

devise

Ruby on Rails application의 유저 관리를 도와주는 gem이다.

https://github.com/plataformatec/devise

gemfile 설정

gem 'devise'

bundle install

$ bundle install

devise 설치

$ rails generate devise:install

host 설정

# /config/environments/development.rb
config.action_mailer.default_url_options = { host: 'localhost', port: 3000 }

개발 IDE로 cloud9를 사용하고 있는데, cloud9은 mail 발송이 막혀있다. 테스트 환경에서는 로그를 통해 메일 confirm을 진행할 수 있다.

model 생성(ex_ Admin model)

rails generate devise Admin

여러 model을 사용하기 위한 view 분리 설정

# /config/initializers/devise.rb
config.scoped_views = true

mail sender 주소 변경

# /config/initializers/devise.rb
config.mailer_sender = 'please-change-me-at-config-initializers-devise@example.com'

view 생성

$ rails generate devise:views admins

model에서 confirmation 활성화

mail confirmation을 사용할 경우에만 설정해주면 된다.

# app/models/admin.rb
class Admin < ApplicationRecord
  devise :database_authenticatable, :registerable,
    :recoverable, :rememberable, :trackable, :validatable,
    :confirmable
end

migrate file에 주석처리 된 메일 confirmation을 활성화

# /db/migrate/xxxxxxxx.rb
## Confirmable
t.string   :confirmation_token
t.datetime :confirmed_at
t.datetime :confirmation_sent_at
t.string   :unconfirmed_email
 
add_index :admins, :confirmation_token,   unique: true

db migrate

$ rails db:migrate

설치가 완료 되면, 다양한 helper를 사용할 수 있다.

before_action :authenticate_member!
member_signed_in?
current_member
member_session

rails routes를 통해 생성된 routes를 살펴보고 활용하면 끝.

$ rails routes

추가. admin email 검증 설정

admin을 만들 경우, 특정 도메인의 메일로만 가입이 가능하도록 해야 한다. 직접 model을 만들었을 때와 마찬가지로, model 파일에 메일 주소를 검증하는 코드를 넣어주면 된다. 정규식을 원하는 검증 형태로 바꾸어 사용하면 된다.

# /app/models/admin.rb
EMAIL_REGEX = /\A[\w+\-.]+@yourdomain+\.com+\z/i
validates :email, format: { with: EMAIL_REGEX }

devise with heroku

하지만 이대로는 heroku에서 production mode로 사용이 불가능하다. confirm mail을 보낼 수 없기 때문이다. add-on을 추가함으로써 해결할 수 있다.

sendgrid 추가

$ heroku addons:create sendgrid:starter

https://devcenter.heroku.com/articles/sendgrid

설정 확인

$ heroku config:get SENDGRID_USERNAME

heroku add-on 설정시 자동으로 입력된 변수 출력을 확인한다.

SMTP 설정

# /config/environments/production.rb
config.action_mailer.raise_delivery_errors = true
config.action_mailer.delivery_method = :smtp
host = '<your-domain.com>'
config.action_mailer.default_url_options = { host: host }
ActionMailer::Base.smtp_settings = {
  :address        => 'smtp.sendgrid.net',
  :port           => '587',
  :authentication => :plain,
  :user_name      => ENV['SENDGRID_USERNAME'],
  :password       => ENV['SENDGRID_PASSWORD'],
  :domain         => '<<your-domain.com>>',
  :enable_starttls_auto => true
}

참고