質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.30%
Devise

Deviseとは、Ruby-on-Railsの認証機能を追加するプラグインです。

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

AWS(Amazon Web Services)

Amazon Web Services (AWS)は、仮想空間を機軸とした、クラスター状のコンピュータ・ネットワーク・データベース・ストーレッジ・サポートツールをAWSというインフラから提供する商用サービスです。

Q&A

解決済

1回答

90閲覧

Devise Token Authでアカウント認証時(メールのリンク押下)に500エラーになる

yoshi_8

総合スコア2

Devise

Deviseとは、Ruby-on-Railsの認証機能を追加するプラグインです。

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

AWS(Amazon Web Services)

Amazon Web Services (AWS)は、仮想空間を機軸とした、クラスター状のコンピュータ・ネットワーク・データベース・ストーレッジ・サポートツールをAWSというインフラから提供する商用サービスです。

0グッド

0クリップ

投稿2025/06/09 13:15

編集2025/06/10 09:47

実現したいこと

メールのリンク押下時に認証成功&指定したURLにリダイレクトしたい

SPAなのでリダイレクト先はNext.js

発生している問題・分からないこと

Devise + Devise Token Authを認証に使ったSPAで、サインアップ後に送信される認証メールのリンク押下すると500エラーになり認証が失敗する。尚、このエラーは本番環境でのみ発生し、開発環境では成功する。

本番環境はAWSのECS Fargateにデプロイ。タスク1つにつきNginx(リバースプロキシ)とRailsの構成でそれぞれコンテナ化しています。流れはRoute53 → ALB → Nginx → Railsとなり、Route53にサブドメインとしてAレコードでapi.my-service.netのように登録し、ALBに向けています。

メール内の認証リンクを押すとhttps://api.my-service.net/api/v1/auth/confirmation?config=default&confirmation_token=hogefugabarにリダイレクトされ、500エラーになります(URLが左記のものが残ったまま)。期待しているのはGET /api/v1/auth/confirmationで認証が処理された後、https://my-service.net/account_confirmation_success=trueにリダイレクトされることです。

エラーメッセージ

error

1500 Internal Server Error 2 3Nginxコンテナのログ(CloudWatch) 4 5# サインアップ 6"POST /api/v1/auth/confirmation HTTP/1.1" 200 119 "https://www.my-service.net/" 7 8# 認証リンク押下 9"GET /api/v1/auth/confirmation?config=default&confirmation_token=ZhpLxqjmVbs4kgxS_QfH HTTP/1.1" 500 26 "-" 10 11# 認証リンク押下と同時刻に出ているログ 12[error] 14#14: *99 open() "/app/public/404.html" failed (2: No such file or directory), client: 10.0.1.23, server: localhost, request: "GET /favicon.ico HTTP/1.1", upstream: "http://unix:///app/tmp/sockets/puma.sock/favicon.ico", host: "api.my-service.net", referrer: "https://api.my-service.net/api/v1/auth/confirmation?config=default&confirmation_token=ZhpLxqjmVbs4kgxS_QfH"

該当のソースコード

confirmation_instructions.html.erb

1<p><%= @email %> さん、</p> 2 3<p>アカウント登録ありがとうございます!</p> 4 5<p>以下のリンクを押して、本登録を完了してください。</p><br> 6 7<p> 8 <%= link_to "アカウントを認証する", confirmation_url(@resource, { 9 confirmation_token: @token, 10 config: message['client-config'].to_s, 11 }).html_safe %> 12</p> 13 14<p>リンクの有効期間は3日間です。お早めにご対応ください。</p><br>

production.rb

1config.action_mailer.default_url_options = { host: "https://api.my-service.net" } 2config.hosts << "api.my-service.net"

user.rb

1devise :database_authenticatable, :registerable, 2 :recoverable, :validatable, :confirmable 3# :lockable, :timeoutable, :trackable, :omniauthable, :rememberable 4 5include DeviseTokenAuth::Concerns::User

devise_token_auth.rb

1config.default_confirm_success_url = ENV["DEFAULT_CONFIRM_SUCCESS_URL"] || "http://localhost:3000" 2config.default_password_reset_url = ENV["DEFAULT_PASSWORD_RESET_URL"] || "http://localhost:3000/password-reset" 3 4config.redirect_whitelist = [ 5 "https://www.my-service.net", 6 "https://www.my-service.net/password-reset" 7]
## Nginxの設定 # Pumaとの通信に Unixドメインソケット を利用 upstream api { server unix:///app/tmp/sockets/puma.sock; } server { listen 80; server_name localhost; # ログ出力先 access_log /var/log/nginx/access.log; error_log /var/log/nginx/error.log; # 静的ファイルのルート(Railsの /public を参照) root /app/public; # クライアントがアップロード可能な最大リクエストサイズ(m = MB) client_max_body_size 100m; keepalive_timeout 5; # ALBからのヘルスチェックエンドポイント location = /healthcheck { access_log off; return 200 "OK"; add_header Content-Type text/plain; } # エラーページ指定 error_page 404 /404.html; error_page 502 503 504 505 /500.html; # エラーページへの直接アクセスをブロック location = /404.html { internal; } location = /500.html { internal; } # リクエストファイル($uri)が存在すれば返し、なければRailsへルーティング try_files $uri @api; # リバースプロキシ設定 location @api { proxy_pass http://api; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_intercept_errors on; } }

試したこと・調べたこと

  • teratailやGoogle等で検索した
  • ソースコードを自分なりに変更した
  • 知人に聞いた
  • その他
上記の詳細・結果

本番環境で使うDEFAULT_CONFIRM_SUCCESS_URLはタスク定義に環境変数として渡しています。
Devise Token Authのconfirmations_controller.rbのコードも見たが500エラーになる理由が不明。

補足

Ruby: 3.3.7 Rails: 7.2.2.1
RailsはAPIモード
検証していませんが、同じ理由で本番でパスワードリセットリンクを踏んでも失敗すると想像しています

追記:

開発:Next.js, Nginx, Rails, Postgresをコンテナ化して疎通
本番:Vercel(Next.js), Route53 → ALB → ECS Fargate(Nginx/Rails)→ RDS

環境は上記です。S3はまだ未設置のためALBのログなし、Railsログはマイグレーションや起動成功したことのみログに出ています。クライアントからRailsへの他リクエストやRDSとの疎通は問題ありません。Nginxのエラーログはこのタイミングで初めて出ましたが今回のエラーと関係あるかは不明。

本番用の環境変数はタスク定義で渡しています。何度も確認したので設定値に誤りはないと思います。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yu_1985

2025/06/10 05:04

以下を確認して、可能であれば情報を追記してください - エラー発生時のALB、nginx、Railsそれぞれのログ - 本番環境と開発環境の設定の違い - 開発環境の構成 開発環境で動いたと言っても開発環境が本番同等の構成かがわからないですし、差分があるなら恐らく開発と本番で異なる部分のどこかに原因があると思われます。 それを絞り込んでいきましょう。
yoshi_8

2025/06/10 09:49

コメントありがとうございます。 CloudWatchログ、Nginx設定ファイル、補足に情報追記したので確認いただけると幸いです。
guest

回答1

0

自己解決

ActionController::Redirecting::UnsafeRedirectErrorが原因でした。

ConfirmationsControllerで下記をオーバーライドして解決しました。

private def redirect_options { allow_other_host: true } end

puma.rbで本番用のログ出力設定が間違っていました。

修正後にCloudWatchで500エラーの内容を特定。

投稿2025/06/11 09:30

yoshi_8

総合スコア2

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.30%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問