Laravel 身份验证 hasValidCredentials 失败
Posted
技术标签:
【中文标题】Laravel 身份验证 hasValidCredentials 失败【英文标题】:Laravel Authentication hasValidCredentials failing 【发布时间】:2017-01-26 17:28:28 【问题描述】:我正在尝试为 Laravel 5.3 应用程序设置 Doctrine 2 Auth。我正在使用 Laravel 生成的 Auth 控制器,所以它不是我自己的自定义实现。我做了一些小改动(即使用 Doctrine 将用户持久保存到数据库)并让注册工作正常,但是当我尝试登录时,它一直未能通过身份验证。
我已经使用了一个调试器,它似乎一直在函数 hasValidCredentials(位于 vendor/laravel/framework/src/Illuminate/Auth/SessionGuard.php)上失败,详情如下:
/**
* Check the given plain value against a hash.
*
* @param string $value
* @param string $hashedValue
* @param array $options
* @return bool
*/
public function check($value, $hashedValue, array $options = [])
if (strlen($hashedValue) === 0)
return false;
return password_verify($value, $hashedValue);
作为参考,我对 $value 和 $hashedValue 的值如下:
$value = "测试者"; $hashedValue = "$2y$10$ZSLRE3LAVA8myaH8mu6TNeumQxHdmKRbv/zZdFQeDujZ8JolshTOu";
根据我上次 XDebug 会话的变量屏幕截图显示了变量的确切类型:
$hashedValue 是密码“tester”的加密版本(使用 bcrypt),所以我知道凭据是 100% 正确的,但是当执行密码验证时,它总是评估为 false,然后 hasValidCredentials 检查失败。
我在我的数据库中按如下方式存储我的用户:
所以我知道散列密码足够长并且存储在数据库中。我看到 $hashedValue 在双引号中返回,这可能是个问题吗?
尽管我无法登录,因为 Session Guard 类的尝试函数总是失败,因为 hasValidCredentials 总是返回 false,而且我很困惑,因为凭据是准确的。
想知道是否有人对如何解决此问题有任何想法?
谢谢
【问题讨论】:
似乎以下计算结果为真:password_verify('secret password', '$2y$10$EnIi90KP.0BqCVJgK21BrO3xzArxCZaiAPaUebCw.K2Xw71QOCZv2');
请注意,我的应用密钥采用 base64 编码。这也会在生成哈希时引起问题吗?
【参考方案1】:
password_verify是一个原生的php函数,基本上是password_hash的对应物。因为
password_verify('tester', '$2y$10$ZSLRE3LAVA8myaH8mu6TNeumQxHdmKRbv/zZdFQeDujZ8JolshTOu');
返回false
,你的$hashedValue
不是tester
的加密值。
我的猜测是您以某种方式对密码进行了双重加密,例如你的 laravel 组件和你的学说组件都在散列密码值。
请注意,laravel 的app.key
不用于加密密码,正如您在BcryptHasher 中看到的那样,因此它不会影响结果。
【讨论】:
感谢Passioncoder。在 Laravel 已经在输入上运行 Hash::make 之后,我在上面运行 bcrypt。以上是关于Laravel 身份验证 hasValidCredentials 失败的主要内容,如果未能解决你的问题,请参考以下文章
如何在 laravel 5.2 中使用多重身份验证 [关闭]
Laravel 5.1 使用默认身份验证控制器和中间件尝试使用额外参数进行身份验证