2013-12-19 3 views
8

私はRailsアプリケーションでDeviseを使用していて、パスワードをリセットする際に問題が発生しています。Devitsでのパスワードのリセット問題

パスワードをリセットしようとすると、パスワードをリセットするリンクが記載されたメールが送信されます。新しいパスワードを使用してフォームに記入した後、私はエラーを取得するChromeで「Webページはリダイレクトループが含まれてい」、と私は私のログに次のエラーを取得:

Started GET "https://stackoverflow.com/users/password/edit?reset_password_token=[FILTERED]" for 127.0.0.1 at 2013-12-19 14:22:05 -0500 
Processing by Devise::PasswordsController#edit as HTML 
    Parameters: {"reset_password_token"=>"[FILTERED]"} 
    User Load (0.4ms) SELECT "users".* FROM "users" WHERE "users"."id" = 1 LIMIT 1 
Redirected to http://localhost:3000/users/password/edit?reset_password_token=JatMT1fE-fQwsCWsEdy6 
Filter chain halted as :require_no_authentication rendered or redirected 
Completed 302 Found in 1.8ms (ActiveRecord: 0.4ms) 

を私はいずれかを見つけるように見えることはできませんこの問題を解決する方法に関する情報。

user.rb

class User < ActiveRecord::Base 
... 
devise :database_authenticatable, :registerable, 
     :recoverable, :rememberable, :trackable, :validatable, 
     :token_authenticatable, :confirmable, :lockable 
... 
end 

devise.rb

Devise.setup do |config| 
    ... 
    config.reset_password_within = 6.hours 
    ... 
end 

routes.rbを

Build::Application.routes.draw do 
    devise_for :users, :controllers => {:registrations => :registrations} 

    devise_scope :user do 
     post 'registrations' => 'registrations#create', :as => 'register' 
     post 'sessions' => 'sessions#create', :as => 'login' 
     delete 'sessions' => 'sessions#destroy', :as => 'logout' 
    end 

resources :users do 
    match 'users/:id' => 'users#username' 
    get 'validate_username', on: :collection 
    get 'validate_email', on: :collection 
    get 'edit_profile', on: :member 
    get :projects, on: :member 
    get :favorites, on: :member 
    get :collections, on: :member 
    member do 
     get :follow 
     get :unfollow 
     get :following 
     get :followers 
    end 
    end 
end 

registrations_controller.rb

class RegistrationsController < Devise::RegistrationsController 

    skip_before_filter :verify_authenticity_token, 
        :if => Proc.new { |c| c.request.format == 'application/json' } 

    respond_to :json 

    def create 
     user = User.new(params[:user]) 
     Rails.logger.info(user.inspect) 
     # comment out following line to re-enable confirmation 
     # resource.skip_confirmation! 

     if user.save 
      sign_in user 
      render :status => 200, 
       :json => { :success => true, 
          :info => "Registered", 
          :data => { :user => user, 
            :auth_token => current_user.authentication_token } } 
     else 
      redirect_to new_user_registration_path, notice: user.errors.full_messages[0] 
      Rails.logger.info(user.errors.inspect) 
      # render :status => :unprocessable_entity, 
      #  :json => { :success => false, 
      #     :info => resource.errors, 
      #     :data => {} } 
     end 
    end 

    def update 
     @user = User.find(current_user.id) 
     successfully_updated = if needs_password?(@user, params) 
      @user.update_with_password(params[:user]) 
     else 
      # remove the virtual current_password attribute 
      params[:user].delete(:current_password) 
      @user.update_without_password(params[:user]) 
     end 

     if successfully_updated 
      if params[:update_email] 
       set_flash_message :alert, :signed_up_but_unconfirmed 
       redirect_to after_update_path_for(@user) 
      else    
       set_flash_message :notice, :updated 
       sign_in @user, :bypass => true 
       redirect_to after_update_path_for(@user) 
      end 
     else 
      redirect_to :back, alert: resource.errors.full_messages[0] 
     end 
    end 

     private 

    # check if we need password to update user data 
    def needs_password?(user,params) 
     !params[:profile] 
    end 

    protected 

    def after_update_path_for(resource) 
     user_path(resource) 
    end 

end 
+0

コントローラはどのように見えるのですか? – usha

+0

登録コントローラを追加しました。 – scientiffic

答えて

3

ApplicationControllerにであなたのafter_sign_in_path_forをチェックして、root_urlにリダイレクト追加:それはパスワードの編集要求であれば(ない背中やrequest.env [ 'HTTP_REFERER'])。

0

パスワードリセットURLへのリダイレクトが繰り返されていることを除いて、まったく同じ問題がありました。

私は私after_sign_in_path修正が@Sergeyソコロフは、正しい答えを持っていると思う

:パスワード以外の場合には、ユーザは、彼または彼女が中から署名したページに戻りますリセットされるように

def after_sign_in_path_for(resource_or_scope) 
    if request.referer.include? "reset_password" 
    root_path 
    else 
    request.referer 
    end 
end 

を。これにより、電子メール内のパスワードリセットリンクに続くユーザーの問題を回避できます。

トラブルシューティング中に非常にばかげたことをしていましたが、テスト中に別のユーザーのパスワードをリセットしていたときに別のユーザーとしてログインしていました。これは非常に奇妙な動作を引き起こします。

関連する問題