Knockでユーザーレコードを更新するときにユーザーの現在のパスワードを要求しようとしています。私はpassword_digestを作成するのと同じプロセスで投稿されたパスワードを実行できると思っていましたが、作成されたハッシュを比較するときはいつでも違います。ユーザー入力をハッシュするときに何か不足していますか?Knockで更新時にパスワードを要求する
これは私の更新方法である
def update
@user = current_user
# hash current password
@current_password = params[:current_password]
cost = ActiveModel::SecurePassword.min_cost ? BCrypt::Engine::MIN_COST : BCrypt::Engine.cost
@hashed_password = BCrypt::Password.create(@current_password, cost: cost)
# return if no current password is given
if @current_password != nil
# compare and continue if they match
if @hashed_password === current_user.password_digest
# try to update record
if @user.update_attributes(user_params)
render json: @user
else
render json: @user.errors.full_messages
end
# otherwise return password error
else
render json: { message: "Your current password is incorrect" }
end
else
render json: { message: "You must provide your current password" }
end
end
編集:ユーザーは私が正しく理解していれば、ActiveModelでthis callをトリガするユーザーモデル、上has_secure_password
で保存され。私はbyebugを使用して実行を停止し、割り当て後の変数を比較しましたが、実際は異なっています。
編集2:誰もが将来的にこの横切ると同様の戦略を使用したい場合、あなたはそれはあなたが評価するcurrent_password
のparamに合格できるようになるように、あなたのUserモデルにattr_accessor :current_password
を追加する必要があります。
元のパスワードはどこでハッシュされていますか?論理は同じですか?また、なぜ比較のために '=='の代わりに '==='を使用していますか?ハッシュされている元のパスワードに関連するコードを追加してください。 'pry-rails'を使って実行を停止し、' @ hashed_password'と 'current_user.password_digest'で値をチェックしようとしましたか? – Genzume
保存する前にユーザーパスワードをハッシュする元のメソッドへのリンクを追加しました。私はそれらをチェックした、彼らは異なる値です。ケースの平等はここでは適切ではないのですか? – oneWorkingHeadphone
'==='はオブジェクト・エクイティです。たとえば、 '' foo "===" foo "'は、異なるオブジェクトであるため文字列がフリーズしない限り、falseです。 '" foo "==" foo "'は値を比較します。 – max