devise gem with heroku
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
}