首先在專案上裝上devise
bundle add devise
rails generate devise:install
安裝好後用devise 建立 User
rails generate devise User
建立好後輸入rails db:migrate
...才怪,已經輸入的請用rails db:rollback
退回去。
在上面圖片可以看到devise幫我們建立了一個migration檔案
來到Confirmable這裡把他解開
現在可以rails db:migrate
來到models/user.rb
在 devise那行最後加上,:confirmable
devise :database_authenticatable, :registerable,:recoverable, :rememberable, :validatable,:confirmable
接下來就是設定信箱
1.development
在/config/environments/development.rb
把false改成true(測試寄信錯誤的時候可以馬上顯示錯誤)
config.action_mailer.raise_delivery_errors = true
然後加上這兩行
config.action_mailer.default_url_options = { host: "http://localhost:3000" }
config.action_mailer.smtp_settings = config_for(:email).symbolize_keys
在 config/ 底下新增 email.yml(記得把它加到 .gitignore )
我自己使用mailgun寄信
development:
address: "smtp.mailgun.com"
port: 587
domain: "mailgun.com"
authentication: "plain"
user_name: "你的email帳號"
password: "你的email密碼"
enable_starttls_auto: true
2.production
在/config/environments/production.rb
config.action_mailer.raise_delivery_errors = false #測試可改true,但如果已上線的話建議改回false
config.action_mailer.default_url_options = { host: ENV["WEB_PATH"]} #production的絕對網址
config.action_mailer.delivery_method = :smtp
config.action_mailer.smtp_settings = {
address: "smtp.mailgun.com",
port: 587,
domain: "mailgun.com",
authentication: "plain",
user_name: ENV["MAILGUN_USERNAME"],
password: ENV["MAILGUN_PASSWORD"],
enable_starttls_auto: true
}
3.devise
在config/initializers/devise.rb
config.mailer_sender = '<info@example.com>' #改成你想顯示的寄件者
config.mailer = 'Devise::Mailer' #將#字號刪除
到這裡就完成了,在註冊帳號後會收到驗證信,忘記密碼會收到修改信。
小結
做完後我多了好幾個問題
1.User在Email驗證前後的變化,devise在背後做了什麼才會達到驗證效果?
2.confirmation_token做了什麼?
3.修改密碼時reset_password_token是怎麼做到有時效性的?
參考資料:
https://github.com/heartcombo/devise
Devise 忘記密碼寄信實作