実現したいこと
- RailsとDeviseとDeviseAuthTokenの両方を仕様して、WebとAPIでメール認証を行いたい。
- Webから登録した場合のみ、アカウント認証メールが送信されない(letter_openerで確認できない)問題を解決したい
前提
RailsとDeviseとDeviseAuthTokenの両方を仕様してユーザー認証を実装しております。
WebでもAPIの方でもアカウント登録、ログインまでは上手く実装できました。
しかし、Deviseの「confirmable」の機能を追加して、アカウント認証メールをletter_openerにて確認しましたが、Webから登録するとアカウント認証メールがletter_openerで確認できません。ログを見てもメールを送信していないです。
しかし、APIの方でも登録してみるとアカウント認証メールをletter_openerにて確認できました。ログを見るとメールは配信されておりました。
該当のソースコード(Web)
app/controllers/users/registrations_controller.rb
1class Users::RegistrationsController < Devise::RegistrationsController 2end
app/controllers/users/sessions_controller.rb
1class UserFrontend::Users::SessionsController < Devise::SessionsController 2 private 3 4 def sign_up_params 5 params.require(:registration).permit(:name, :email, :gender, :password, :password_confirmation) 6 end 7end
app/controllers/application_controller.rb
1class ApplicationController < ActionController::Base 2 protect_from_forgery with: :null_session, if: -> { request.format.json? } 3 before_action :configure_permitted_parameters, if: :devise_controller? 4 5 def configure_permitted_parameters 6 devise_parameter_sanitizer.permit(:sign_up, keys: [:name]) 7 end 8 9 # ログイン後の遷移画面 10 def after_sign_in_path_for(resource) 11 mypage_path 12 end 13 14 # ログアウト後の遷移画面 15 def after_sign_out_path_for(resource) 16 new_user_session_path 17 end 18 19 # 与えられたユーザーがログイン済みユーザーであればtrueを返す 20 def current_user?(user) 21 user && user == current_user 22 end 23 24 helper_method :current_user? 25end
app/views/users/registrations/new.html.slim
1 h2 新規登録 2= form_for(resource, as: resource_name, url: registration_path(resource_name)) do |f| 3 = render "users/shared/error_messages", resource: resource 4 5 p.user-name 6 = f.label :name 7 = f.text_field :name 8 9 p 10 = f.label :email 11 = f.email_field :email, autofocus: true, autocomplete: "email" 12 13 p.select 14 = User.human_attribute_name(:gender) 15 = f.radio_button :gender, :man 16 = f.label :gender_0 17 = f.radio_button :gender, :woman 18 = f.label :gender_1 19 = f.radio_button :gender, :other 20 = f.label :gender_2 21 22 p 23 = f.label :password 24 - if @minimum_password_length 25 em 26 | ( 27 = @minimum_password_length 28 | characters minimum) 29 br 30 = f.password_field :password, autocomplete: "new-password" 31 32 p 33 = f.label :password_confirmation 34 = f.password_field :password_confirmation, autocomplete: "new-password" 35 36 p 37 = f.submit "Sign up" 38
該当のソースコード(API)
app/controllers/api/v1/auth/registrations_controller.rb
1class Api::V1::Auth::RegistrationsController < DeviseTokenAuth::RegistrationsController 2 include DeviseTokenAuth::Concerns::SetUserByToken 3 4 def render_create_success 5 render json: { 6 status: 'CREATE ACCOUNT SUCCESS', 7 data: resource_data(resource_json: @resource.token_validation_response) 8 }, scope: :current_api_v1_user 9 end 10 11 private 12 13 def sign_up_params 14 params.require(:registration).permit(:name, :email, :gender, :password, :password_confirmation) 15 end 16end 17
app/controllers/api/v1/auth/sessions_controller.rb
1class Api::V1::Auth::SessionsController < DeviseTokenAuth::SessionsController 2 include DeviseTokenAuth::Concerns::SetUserByToken 3 4 def render_create_success 5 render json: { 6 status: 'SUCCESS LOGIN', 7 data: resource_data(resource_json: @resource.token_validation_response) 8 }, scope: :current_api_v1_user 9 end 10end 11
app/controllers/api/v1/application_controller.rb
1class Api::V1::ApplicationController < ActionController::Base 2 include DeviseTokenAuth::Concerns::SetUserByToken 3 protect_from_forgery with: :null_session 4end
該当のソースコード(WebとAPI共通)
app/models/user.rb
1class User < ApplicationRecord 2 # Include default devise modules. 3 devise :database_authenticatable, :registerable, 4 :recoverable, :rememberable, :validatable, :confirmable 5 # :trackable 6 include DeviseTokenAuth::Concerns::User 7end
config/routes.rb
1Rails.application.routes.draw do 2 devise_for :users, controllers: { 3 registrations: "users/registrations", 4 sessions: "users/sessions" 5 } 6 resources :users 7 8 namespace :api, default: { format: :json } do 9 namespace 'v1' do 10 mount_devise_token_auth_for 'User', at: 'auth', controllers: { 11 registrations: "api/v1/auth/registrations", 12 sessions: "api/v1/auth/sessions"} 13 14 resources :users 15 end 16 end 17 18 19 if Rails.env.development? 20 mount LetterOpenerWeb::Engine, at: "/letter_opener" 21 end 22end
Gemfile
1source 'https://rubygems.org' 2git_source(:github) { |repo| "https://github.com/#{repo}.git" } 3 4ruby '2.6.0' 5 6gem 'rails', '5.2.8' 7gem 'rack-cors' 8gem 'devise' 9gem 'devise_token_auth' 10 11group :development do 12 gem 'letter_opener' 13 gem 'letter_opener_web' 14end 15 16
config/initializers/cors.rb
1Rails.application.config.middleware.insert_before 0, Rack::Cors do 2 allow do 3 origins '*' 4 resource '*', 5 headers: :any, 6 expose: ['access-token', 'uid', 'client', 'expiry', 'token-type'], 7 methods: [:get, :post, :put, :patch, :delete, :options, :head] 8 end 9end 10
試したこと
APIの方では以下のコマンドでユーザー登録すると、ユーザーが作成されアカウント確認メールが送信されます。(letter_openerで確認できます)
terminal
1curl localhost:3000/api/v1/auth -X POST -H 'Content-Type: application/json' -d '{"email": "test@example.com", "gender": 1, "password": "password","password_confirmation": "password", "name": "test", "confirm_success_url":"http://localhost:3000/sign_in"}' -i
Webの方では上記の新規登録フォームからユーザー登録してもユーザーは作成されますが、アカウント確認メールは送信されません。(エラーなどは出ておりません)
Webから新規登録した場合のみ、アカウント認証メールがletter_openerで確認できない原因が分かりません。
何卒、アドバイスなどよろしくお願いいたします。
補足情報(FW/ツールのバージョンなど)
Rails(5.2.8)、ruby(2.6.0)になります。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。