设计重置密码电子邮件指向错误的控制器

时间:2018-01-10 11:58:21

标签: ruby-on-rails devise devise-token-auth

我包含devise_token_auth从其他地方托管的网络应用程序登录。但我也希望能够直接登录我的rails应用程序。

我的routes.rb看起来像这样:

#...
devise_for :users

namespace :api, defaults: {format: :json} do
  mount_devise_token_auth_for 'User', at: 'auth'
  #...

要重置密码,webapp会将POST发送给/api/auth/password。使用上面的配置,电子邮件中用于重置密码的链接使用错误的控制器(users/password上的控制器)。 redirect_url不会被应用,用户会看到rails应用程序的登录表单,而不是webapp:

http://localhost:3000/users/password/edit?redirect_url=http://localhost:8080/reset_password&reset_password_token=...

如果我对该行devise_for :users发表评论,则电子邮件链接正确无误,请使用api/auth/password/edit

http://localhost:3000/api/auth/password/edit?redirect_url=http://localhost:8080/reset_password&reset_password_token=...

但当然,通过评论devise_for :users,我无法仅使用rails应用程序(http://localhost:3000/users/sign_in)登录。

1 个答案:

答案 0 :(得分:0)

设计,在其邮件程序模板上重置密码(reset_password_instructions.html.erb),调用模型获取网址:

<p><%= link_to 'Change my password', edit_password_url(@resource, reset_password_token: @token) %></p>

虽然最初处理客户端意图重置密码的控制器是DeviseTokenAuth::PasswordsController,但edit_password_url上的函数User解析为Devise::PasswordsController处理的路径( users/password/edit vs api/auth/password/edit)。

在这种情况下,解决方案是使用不同的模型:

的routes.rb

#...
devise_for :users

namespace :api, defaults: {format: :json} do
  mount_devise_token_auth_for 'Api::User', at: 'auth'
  #...

API / user.rb

class Api::User < ActiveRecord::Base
   devise :database_authenticatable, :recoverable,
     :rememberable, :trackable, :validatable
   include DeviseTokenAuth::Concerns::User
   #...
end