【问题标题】:How to get reset_password working with rails-api app using devise_auth_token gem如何使用 devise_auth_token gem 让 reset_password 与 rails-api 应用程序一起使用
【发布时间】:2015-12-21 21:24:03
【问题描述】:

我制作了一个新的 rails-api 应用程序,其中集成了 devise_auth_token。目前注册,忘记密码正在工作。但无法重置密码。

邮件中发送的确认 url 给出了 success:false 响应。

以下是确认网址

http://localhost:3000/auth/password/edit?config=default&redirect_url=foo&reset_password_token=P2a62x8mS9yP9ukeTSZ-

这里是重置邮件的服务器日志

在 2015 年 9 月 24 日 14:41:21 +0530 开始 GET "/auth/password/edit?config=default&redirect_url=foo&reset_password_token=[FILTERED]" for ::1 由 DeviseTokenAuth::PasswordsController#edit 处理为 /
参数:{"config"=>"default", "redirect_url"=>"foo", "reset_password_token"=>"[FILTERED]"} 不允许的参数:配置, redirect_url 用户负载 (0.2ms) SELECT users.* FROM users WHERE users.reset_password_token = '0b3dfdf3a80dce289df8c2cb16c528614b302534264e85e747c4f6b51583da15' ORDER BY users.id ASC LIMIT 1 Completed 404 Not Found in 5ms (浏览量:0.3ms | ActiveRecord:0.2ms)

这是通过密码发送的确认电子邮件 重置。

Started POST "/auth/password?email=user@user.com&redirect_url=foo" for ::1 at 2015-09-24 14:04:05 +0530 Processing by

DeviseTokenAuth::PasswordsController#create as / 参数: {"email"=>"user@user.com", "redirect_url"=>"foo"} 未经许可 参数:redirect_url 未经许可的参数:redirect_url 用户 加载 (66.5ms) SELECT users.* FROM users WHERE (BINARY uid = 'user@user.com' AND provider='email') ORDER BY users.id ASC LIMIT 1 用户负载 (9.8ms) SELECT users.* FROM users WHERE users.reset_password_token = '0b3dfdf3a80dce289df8c2cb16c528614b302534264e85e747c4f6b51583da15' ORDER BY users.id ASC LIMIT 1 (0.1ms) BEGIN SQL (17.7ms) 更新users 设置reset_password_token = '0b3dfdf3a80dce289df8c2cb16c528614b302534264e85e747c4f6b51583da15', reset_password_sent_at = '2015-09-24 08:34:05', updated_at = '2015-09-24 08:34:05' 其中users.id = 6 (63.9ms) 提交
渲染 /home/anjan/.rvm/gems/ruby-2.2.3/gems/devise_token_auth-0.1.34/app/views/devise/mailer/reset_password_instructions.html.erb (16.2 毫秒)

Devise::Mailer#reset_password_instructions:已处理的出站邮件 424.3毫秒

发送邮件到 user@user.com (64.4ms) 日期:2015 年 9 月 24 日星期四 14:04:06 +0530 发件人:account@qzick.com 回复:account@qzick.com 收件人:user@user.com 邮件 ID: 主题:重置 密码说明 Mime-Version: 1.0 Content-Type: text/html; charset=UTF-8 内容传输编码:7 位电子邮件:user@user.com 提供者:电子邮件重定向 url:foo 客户端配置:默认

你好 user@user.com!

有人请求了一个链接来更改您的密码。你可以做 通过下面的链接。

改变 我的密码

如果您没有提出此要求,请忽略此电子邮件。

您的 在您访问上面的链接并创建一个新的之前,密码不会更改 一个。

在 979 毫秒内完成 200 次 OK(查看次数:0.6 毫秒 | ActiveRecord:158.1 毫秒)

大家会很感激这方面的帮助。 甚至在邮件中发送的令牌与生成的令牌不同是否有任何问题。?应该是这样吗?

下面是我的用户模型。

{ “令牌”=> “$ 2A $ 10 $ l766Mu / s8IUIHi9r3sz40ODQk2R.YDo283JQ.82Lijb3fjJ5Unqgq”, “有效期”=> 1444283710}, “H2Cqp2kIt56BYikqXp1HgA”=> { “令牌”=>“$ 2A $ 10 $ upMCA8ZKLXvq9VjVaz2Vp.sZu7zr2lSTCFrxWnBmg4wC2gQrW9sIW ", "expiry"=>1444293849}}, created_at: "2015-09-24 05:55:10", updated_at: "2015-09-24 08:44:09">

这是我的用户模型文件如下

class User < ActiveRecord::Base
  # Include default devise modules.
  devise :database_authenticatable, :registerable,
          :recoverable, :rememberable, :trackable, :validatable,
          :omniauthable
  include DeviseTokenAuth::Concerns::User
  #Deleted ":confirmable," from above
end

以下是我的架构。

ActiveRecord::Schema.define(version: 20150921074353) do

  create_table "users", force: :cascade do |t|
    t.string   "provider",               limit: 255,   default: "email", null: false
    t.string   "uid",                    limit: 255,   default: "",      null: false
    t.string   "encrypted_password",     limit: 255,   default: "",      null: false
    t.string   "reset_password_token",   limit: 255
    t.datetime "reset_password_sent_at"
    t.datetime "remember_created_at"
    t.integer  "sign_in_count",          limit: 4,     default: 0,       null: false
    t.datetime "current_sign_in_at"
    t.datetime "last_sign_in_at"
    t.string   "current_sign_in_ip",     limit: 255
    t.string   "last_sign_in_ip",        limit: 255
    t.string   "confirmation_token",     limit: 255
    t.datetime "confirmed_at"
    t.datetime "confirmation_sent_at"
    t.string   "unconfirmed_email",      limit: 255
    t.string   "name",                   limit: 255
    t.string   "nickname",               limit: 255
    t.string   "image",                  limit: 255
    t.string   "email",                  limit: 255
    t.text     "tokens",                 limit: 65535
    t.datetime "created_at"
    t.datetime "updated_at"
  end

  add_index "users", ["email"], name: "index_users_on_email", using: :btree
  add_index "users", ["reset_password_token"], name: "index_users_on_reset_password_token", unique: true, using: :btree
  add_index "users", ["uid", "provider"], name: "index_users_on_uid_and_provider", unique: true, using: :btree

end

我的 PasswordController 文件如下:

class PasswordController < ApplicationController
  config.action_controller.action_on_unpermitted_parameters = :log
end

【问题讨论】:

  • 如果可能的话,您能否发布您的用户模型文件?检查指定的设计选项是否正确......
  • @MarcoSandrini 请检查我已编辑问题并将我的用户模型文件包含在底部。非常感谢您的帮助
  • 好的,现在我们需要对用户表进行更彻底的转储,因为从您发布的内容来看,用户表似乎不包含 reset_password_token 列...
  • @MarcoSandrini 已在底部添加了我的 schema.rb 文件,请您看一下。再次感谢
  • 再次,一切看起来都不错。你检查过这个问题吗? github.com/lynndylanhurley/devise_token_auth/issues/160

标签: ruby-on-rails ruby authentication devise rails-api


【解决方案1】:

我也遇到了一些疯狂的困难来解决这个问题。这是我必须做的,让它与 AngularJS 前端和 Rails 一起工作:

覆盖 PasswordsController createupdateeditafter_resetting_password_path_for

对于 createupdate 函数,主要问题是我需要它来呈现 json 响应,所以在它说类似 respond_with resource 的地方我改为 render json: resource, status: &lt;status&gt;, &amp;&amp; return(你可以更改资源和状态你的应用程序需要什么,与渲染方法相同)

对于edit,我没有使用after_sending_reset_password_instructions_path_for,而是从电子邮件中获取重定向URL,然后简单地执行redirect_to params[:redirect_url]

我更改了after_resetting_password_path_for 以重定向我希望用户登录的位置。

我还必须更改reset_password_instructions.html.erb 模板。包含 edit_password_url 的行到此:

<p><%= link_to t('.password_change_link'), edit_password_url(@resource, reset_password_token: @token, config: 'default', redirect_url: message['redirect-url'].to_s+'?reset_token='+@token).html_safe %></p>

然后在routes.rb,我必须让设计知道使用我的控制器:

mount_devise_token_auth_for 'User', at: 'auth', controllers: { passwords: 'passwords' }

希望对你有帮助!

【讨论】:

    猜你喜欢
    • 2022-06-29
    • 1970-01-01
    • 1970-01-01
    • 2013-12-03
    • 1970-01-01
    • 2012-01-12
    • 1970-01-01
    • 2012-12-04
    • 1970-01-01
    相关资源
    最近更新 更多