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 Passport 没有身份验证

如何在 laravel 5.2 中使用多重身份验证 [关闭]

Laravel 5.1 使用默认身份验证控制器和中间件尝试使用额外参数进行身份验证

JWT 身份验证 Laravel

如何将 Laravel 身份验证添加到已启动的 Laravel 项目中?

Laravel Passport身份验证问题:始终返回未经身份验证的身份