2017-09-19 7 views
1

私は、パスワードリセットの問題をDatabaseTokenRepository内のハッシャーメソッドに戻して追跡しました。Laravel - Hasher/Reset password issue

2つのトークンハッシュ(ユーザーからのリセット要求とデータベースからのトークンハッシュ)を比較すると、何があっても失敗します。私は明らかにデータベースからの貼り付けをコピーして、2つの文字列をそのように比較しようとしましたが、まだfalseを返します。

私はLaravel 調理人機能の5.4

ユーザーのトークン(リセットのメールより)

"$2y$10$xAnDTr6/G41sAROp4h76hOhx7c4Ily4eYBtFc1J4voCgwIRhq9Mge" 

データベーストークン

"$2y$10$xAnDTr6/G41sAROp4h76hOhx7c4Ily4eYBtFc1J4voCgwIRhq9Mge" 

リターンはまだあるを使用しています

DatabaseTokenRepository

public function exists(CanResetPasswordContract $user, $token) 
{ 
    $record = (array) $this->getTable()->where(
     'email', $user->getEmailForPasswordReset() 
    )->first(); 

    //dump($token); 
    //dump($record['token']); 
    //dd($this->hasher->check($token, $record['token'])); 

    return $record && 
      ! $this->tokenExpired($record['created_at']) && 
      $this->hasher->check($token, $record['token']); 
} 

編集からコード:これはソースファイルであるので、真hash_equals($token, $record['token']);リターンを使用して は、しかし、それは(解決策ではなく、これらのファイルへの更新は、私を破ります関数)

+0

あなたのトークンがあなたが供給しているものだと言うとき。本当?それはすでにハッシュされています。 – apokryfos

+0

これはハッシュされているはずです。Laravelがパスワードのリセットを処理する方法です。 '/ password/reset/{token}'のようなGETルートでハッシュされた文字列を使用し、それがデータベース内の同じハッシュであることを確認してパスワードを変更できるようにする - しかし、password_verifyを使ってハッシュを比較するので失敗します(ハッシュされていない値が期待されるため)。これは私がソースファイルを変更することなく回避したいものです。 @apokryfos – Classified

+0

いいえ、そうではありません。 '$ hasher-> check'は内部的に[' password_verify'](http://php.net/manual/en/function.password-verify.php)を使用し、最初のパラメータとしてunhashed値を受け取り、それをハッシュと比較します。実際のハッシュをユーザーに送信している場合は、何もハッシュするのには意味がありません。 – apokryfos

答えて

0

私は意図したhash_hmacハッシュを使用する代わりに、データベースから2回ハッシュされたものを使用しました。これは毎回失敗しました。これはpassword_verif y関数にはハッシュ値ではなく値が必要です。

同じ問題を抱えている人には、ユーザーに電子メールを送りつけていることを調べることができます。これは、コントローラでトークンを渡すのではなく、データベースからトークンを取得してしまったことです。