我包含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
)登录。
答案 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