如何使用devise_auth_token gem

时间:2015-09-24 10:02:41

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

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

邮件中发送的确认网址成功:错误回复。

以下是确认网址

  

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

以下是重置电子邮件的服务器日志

  

开始GET" / auth /密码/编辑?config = default& redirect_url = foo& reset_password_token = [FILTERED]" for :: 1 at 2015-09-24 14:41:21 +0530   由DeviseTokenAuth处理:: PasswordsController#edit as /
  参数:{" config" =>"默认"," redirect_url" =>" foo",   " reset_password_token" =>" [已过滤]"}未经许可的参数:config,   redirect_url用户加载(0.2ms)SELECT users。* FROM users WHERE   usersreset_password_token =   ' 0b3dfdf3a80dce289df8c2cb16c528614b302534264e85e747c4f6b51583da15'   ORDER BY usersid ASC LIMIT 1已完成404未在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 / 参数:   {"电子邮件" =>" 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 usersid ASC LIMIT   1用户加载(9.8ms)SELECT users。* FROM users WHERE   usersreset_password_token =   ' 0b3dfdf3a80dce289df8c2cb16c528614b302534264e85e747c4f6b51583da15'   ORDER BY usersid ASC LIMIT 1(0.1ms)BEGIN SQL(17.7ms)   更新users SET reset_password_token =   ' 0b3dfdf3a80dce289df8c2cb16c528614b302534264e85e747c4f6b51583da15&#39 ;,   reset_password_sent_at =' 2015-09-24 08:34:05',updated_at =   ' 2015-09-24 08:34:05' WHERE usersid = 6(63.9ms)COMMIT
  渲染   /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.2ms)

     

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

     

已发送邮件至user@user.com(64.4ms)日期:星期四,2015年9月24日14:04:06   +0530来自:account@qzick.com回复:account@qzick.com致:user@user.com消息ID:   < 5603b57e80ae0_1cb520cceb4374ed@anjanbetsy.mail>主题:重置   密码说明Mime-Version:1.0 Content-Type:text / html;   charset = UTF-8 Content-Transfer-Encoding:7bit电子邮件:user@user.com   provider:email redirect-url:foo client-config:default

     

Hello user@user.com!

     

有人要求提供更改密码的链接。你可以做   这可以通过下面的链接。

     

更改   我的密码

     

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

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

     

在979ms完成200 OK(浏览次数:0.6ms | ActiveRecord:158.1ms)

伙计们会对此表示感谢。 即使是邮件中发送的令牌与生成的令牌不同也是如此。是这样的。

以下是我的用户模型。

  

{"令牌" =>" $ 2a $ 10 $ l766Mu / s8IUIHi9r3sz40ODQk2R.YDo283JQ.82Lijb3fjJ5Unqgq","到期" => 1444283710},&# 34; H2Cqp2kIt56BYikqXp1HgA" => {"令牌" =>" $ 2a $ 10 $ upMCA8ZKLXvq9VjVaz2Vp.sZu7zr2lSTCFrxWnBmg4wC2gQrW9sIW","到期" => 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

1 个答案:

答案 0 :(得分:1)

我也遇到了一些疯狂的困难。这就是我要做的事情,让它与AngularJS前端和Rails一起工作:

覆盖 PasswordsController createupdateeditafter_resetting_password_path_for

对于createupdate函数,主要问题是我需要它来呈现json响应,所以它在respond_with resource之类的地方改为{{1} (您可以将资源和状态更改为应用程序所需的内容,与render方法相同)

对于render json: resource, status: <status>, && return,我没有使用edit,而是从电子邮件中抓取重定向网址,只需执行after_sending_reset_password_instructions_path_for

我更改了redirect_to params[:redirect_url]以重定向我希望用户登录的位置。

我还必须更改after_resetting_password_path_for模板。包含 edit_password_url 的行:

reset_password_instructions.html.erb

然后在<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

我希望有所帮助!