Rails5 Cloud9でdeviseのメール送信用サーバーsmtpの設定まで
Railsでwebアプリケーションの開発に必要なユーザー登録やログイン機能を実装するにはdeviseというgemを使います。
登録方法として、ユーザーのメールアドレスに確認メールを送信し、受け取ったユーザーがワンクリックで登録を行なうといったよくあるやつが可能になります。
今回はAWSのcloud9環境において、smtpサーバーの設定に挑戦しましたので、記しておきたいと思います。
手順
- AWS cloud9でsmtpサーバーを使うためにGmailを使用する
- アプリパスワードを取得する
- 補足
- deviseを導入する
- 認証メールのURL設定
- deviseのviewsを生成する
- Userモデルを作成する
- migrationファイルを確認し、コメントアウトを外す
- rake db:migrateでテーブルを作成する
- 補足
- メール認証モジュールを読み込む
- smtpサーバーの設定
- トークンの設定
- 登録テストを行う
AWS Cloud9でsmtpサーバーを使うためにGmailを使用する
smtpサーバーとはメールを送信する時に使用する機能を持ったメールサーバーです。メールを受信する機能を持ったサーバーはpopサーバーと言います。Simple Mail Transfer Protocol の略になります。
設定方法ですが、Cloud9自体がGoogle Cloud Engineを利用しており、Gmailアカウント以外の通信を許可しておりません。設定にGmailを必要としますので、捨てアカウントを作成してください。
通信の許可を得るために、アプリパスワードを使用します。
Gmailを使った必要なプロセスとしましては、二段階認証を行なったgoogleアカウントでアプリパスワードを発行します。まずはアプリパスワードを取得しましょう。
アプリパスワードを取得する
gmailアプリパスワード
アプリパスワードの生成方法
をクリックします
googleアカウント
をクリックします
セキュリティ
をクリックします
二段階認証
をクリックします
開始
をクリックします
認証にスマホを使用します。今すぐ送信
をクリックします。
google
からメッセージが送信されます
送信
をクリックします
スマホに受信されたパスコードを入力します。次へ
をクリックします。
認証されたら二段階認証を有効
にします
googleアカウントに戻って二段階認証がon
であることを確認したら、アプリパスワード
をクリックします
アプリパスワードのページにアクセスする際にパスワードやスマホを使った認証を行います。それらのプロセスを進めます。
表示されたらアプリを選択
をクリックします。その他を選択します。
名称を決めます。開発中のアプリケーション名でも良いですね。生成
をクリックします
パスワードが生成されました。こちらのパスワードを開発環境で使用します。
忘れない様に保存します。
確認が取れました。
これで二段階認証のプロセスとアプリパスワードの取得は完了です。
補足
アプリパスワードを使用しない場合は有効化を無効にしておくと良いでしょう。
その手続きは先ほど行なったスマートフォンなどでのやり取りが必要になります。
発行されたパスワードはこの手続きでは確認取れませんので、発行した段階で忘れない様に保存しましょう。
deviseを導入する
前提として、dbとサーバーは導入済みとします。
gemファイルにインストールしたいdeviseを記述します。
gem 'devise'
作業ディレクトリでインストールします。
~/environment/myapp $
~/environment/myapp $ bundle install
deviseの設定ファイルを生成します。
~/environment/myapp $ rails g devise:install
新規作成されるファイル
- config/initializers/devise.rb
- config/locales/devise.en.yml
ファイル名 | 概要 |
---|---|
config/initializers/devise.rb | deviseに関する設定ファイル。カスタマイズ時に使用します |
config/locales/devise.en.yml | 表示されるバリデーションがデフォルトで英語になっています |
認証メールのURL設定
登録に使用されたメールアドレスにアプリケーションから認証ファイルがメールで送信されます。
ここでは認証ファイルに記載されるはずのリンク先を設定します。要はアプリケーションの開発先のトップアドレスです。
Rails.application.configure do
#省略
#一番下に記述します
config.action_mailer.default_url_options = { protocol: 'https', host:'https://~~~'}
end
フラッシュメッセージのタグを記述する
フラッシュメッセージとはログイン時やログアウトの時に、一時的にだす「ログインしました」の様なメッセージのことです。devise
のインストール時にターミナルに表示されていた様に記述することを推奨されています。一般的にはapp/view/layouts/application.html.erb
に埋め込む様です。
<p class="notice"><%= notice%></p>
<p class="alert"><%= alert %></p>
#bootstrapの場合は
<%= bootstrap_flash %>
deviseのviewsを生成する
サインアップやログイン、パスワードの再設定など必要なファイルがあらかじめ用意されています。
それらをカスタマズして作成していくことがほとんどになると思います。
$ cd myapp
$ pwd
$ rails g devise:views
新規作成されるファイル
- app/views/devise/mailer/confirmation_instructions.html.erb
- app/views/devise/mailer/reset_password_instructions.html.erb
- app/views/devise/mailer/unlock_instructions.html.erb
- app/views/devise/passwords/edit.html.erb
- app/views/devise/passwords.new.html.erb
- app/views/devise/registrations/edit.html.erb
- app/views/devise/registrations/new.html.erb
- app/views/devise/sessions/new.html.erb
- app/views/devise/shared/_links.html.erb
- app/views/devise/unlocks/new.html.erb
Userモデルを作成する
登録者用のモデルを用意します。rails g model model名
がありますが、devise
用のモデルの作成コマンドを使用します。
rails g devise model名
により、deviseを利用するために初期設定されたファイルを生成することが出来ます。今回はUserモデルを生成します。rake db:migrate
をすぐに実行しないで下さい。
$ cd myapp
$ pwd
$ rails g devise user
新規作成されるファイル
- app/models/user.rb
- db/migrate/xxxxx_devise_create_users.rb
- test/fixtueres/users.yml
- test/models/user_test.rb
更新されるファイル
- config/routes.rb
Rails.application.routes.draw do
devise_for :users
roots to: "top#index"
end
devise_for
サインインやログイン周りのルーティングを生成してくれます。rake routes
を実行しルーティングを確認します。
$ rake routes
migrationファイルを確認し、コメントアウトを外す
rails g devise user
により生成されたmigrationファイルを確認します。
# frozen_string_literal: true
class DeviseCreateUsers < ActiveRecord::Migration[5.2]
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
#Trackable
と #Confirmable
のコメントアウトを外します。
こちらは認証メールのトークンや再設定のカラムなど、登録周りのカラムがデフォルトでコメントアウトされています。rake db:migrate
する前に外しましょう。
rake db:migrateでテーブルを作成します
設定したmigrationファイルを実行してテーブルやカラムをdbに作成します。
$ rake db:migrate
サーバーを再起動します
補足
登録ページにアクセスするにはtop pageアドレスに/users/sign_in
をつけます。ログインしなければtop pageにアクセス出来ない様にする方法を取ることがあると思います。smtpメールとの関連程度に記述します。
authenticate_user!
authenticate_user!はdeviseのメソッドです。
ユーザーがログインしているか確認し、そうでない場合はログインページに飛ばします。このサービスはどんな場合でも優先されるものとするならば、Application_Controller.rbに設定すると有効だそうです。その他のControllerが継承しているからでしょう。
before_action :authenticate_user!
protect_from_forgery with: :exception
end
サーバーを再起動します。
メール認証モジュールを読み込む
今回ログインに使用するモデルはUser
モデルです。devise
のメール認証を有効にするためにはdeviseのモジュールをモデルに読み込んでもらいます。
class User < ApplicationRecord
# Include default devise modules. Others available are:
# :confirmable, :lockable, :timeoutable, :trackable and :omniauthable
devise :database_authenticatable,
:registerable,
:recoverable,
:trackable,
:rememberable,
:validatable,
:confirmable
end
smtpサーバーの設定
開発段階での設定となりますが、gmailアドレスやパスワードを含みます。Gitを使用している場合は公開しない様に注意しましょう。
Rails.application.configure do
config.file_watcher = ActiveSupport::EventedFileUpdateChecker
config.action_mailer.default_url_options = { protocol: 'https', host: 'https://xxxxx.vfs.cloud9.ap-southeast-1.amazonaws.com'}
config.action_mailer.raise_delivery_errors = true
config.action_mailer.delivery_method = :smtp
config.action_mailer.smtp_settings = {
:enable_starttls_auto => true,
:address => "smtp.gmail.com",
:port => 587,
:domain => 'smtp.gmail.com',
:user_name => "xxx@gmail.com",
:password => "取得したアプリパスワード",
:authentication => 'login'
}
end
次にアプリパスワードの取得に使用したGmailを記述します。
config.mailer_sender = 'xxx@gmail.com'
トークンの設定
トークンの設定を下記の通りに変更しました。stackoverflowとplataformatec/deviseを参考にしました。変更する前はエラーが出ました。E-mail内のトークンとdb内のトークンが一致することが必要な様です。
<p>Welcome <%= @email %>!</p>
<p>You can confirm your account email through the link below:</p>
<!--@tokenを変更した-->
<p><%= link_to 'Confirm my account', confirmation_url(@resource, :confirmation_token => @token) %></p>
登録テストを行う
登録方法として、ユーザーのメールアドレスに確認メールを送信し、受け取ったユーザーがワンクリックで登録を行なうをテストしましょう。
登録したメールアドレスに上記のHTMLファイルが送信されます。confirm my account
をクリックしてエラーが出ずにログインページに飛ばされた、そのままログイン出来たら成功です。
まとめ
Rails5 cloud 9でdeviseのメール送信用サーバーsmtpの設定でした。
deviseのログイン機能はとても便利な機能を持っています。カスタマイズも色々と出来そうなので色々挑戦していきたいと思います。