Laravelのテストコードを書いている中で、パスワードのハッシュ値とDBの値が一致するかのテストをしようとしてたときに一致するはずなのに一致しなくてはまったので、解決方法を記載しておく。
結果として正解は以下の書き方。assertTrueを使ってHash::checkで比較する!
$this->assertTrue(Hash::check('newpassword', $user->password));
はまったやり方
最初は以下のように書いていてうまくいかなかった。
$this->assertEquals(Hash::make('newpassword'), $user->password);
ちなみに$user->passwordはちゃんとHash::make(‘newpassword’)した値が入っているので中身は同じなはずなのだ。
しかし、これを実行すると、以下のように違う値だと言われる。
Failed asserting that two strings are equal.
--- Expected
+++ Actual
@@ @@
-'$2y$04$7UACpR5WUKKtPYTkVaCr3Ow7A2Eo8zEewgsd9gT1wTEMyRpOA4dhO'
+'$2y$04$7Tw9QIbMmsSHuMJkAuGEcefUjV8HwTMH5ZC0R4WInJGpxq5I5byX6'
試しに、以下のコードを実行した。これはどう考えても等しいはず。
$this->assertEquals(Hash::make('password'), Hash::make('password'));
しかし結果は、、、
Failed asserting that two strings are equal.
--- Expected
+++ Actual
@@ @@
-'$2y$04$TUTX9oiFN7OtKAiGuWpE.uFo8B9qYr1ppG5hVkj8C/qc/5fdo9pru'
+'$2y$04$0hQqjjVPsCOBfmVFNEmhYeye1lLCr4wZo.erf4c9kPzSCgGI.HGZq'
やはりだめ。
Hash::make()の注意点
実はLaravelのHash::make()は特殊で、同じ値をHash::make()しても、毎回違う値が生成されるのです。
Hash::make()はパスワード保存用にセキュリティを強化されたメソッドらしく、普通のハッシュ値とは違うのです。
※一般的なハッシュ値は、同じ値は同じハッシュ値になります。
正しい比較の仕方
ということで、Hash::make()で作られた値は以下のようにHash::checkで比較するのが正しい。
$this->assertTrue(Hash::check('newpassword', $user->password));
assertTrueを使ってHash::checkで比べる。
はまった方はこれで解決!!
コメント
この記事は非常に役立ちました!Hash::make()を使う際の注意点について具体的な例があって理解しやすかったです。テストコードを書く際のヒントをいただけたので、早速実践してみたいと思います。ありがとうございます!
コメントありがとうございます!
お役に立てて良かったです!
非常に役立つ内容でした!特に、Hash::make()を使う際の注意点に関する説明が分かりやすく、テストコードを書く上での参考になりました。今後のプロジェクトでも活用させていただきます!ありがとうございます。
コメントありがとうございます!
お役に立てて良かったです。
この投稿はとても役立ちました!Hash::make()を使用する際の注意点について具体的に解説してくれて、テストコードを効率的に書けるようになりました。ありがとうございます!
お役に立てて良かったです!!