Auth::attempt 总是返回 false,即使输入和哈希正确

Posted

技术标签:

【中文标题】Auth::attempt 总是返回 false,即使输入和哈希正确【英文标题】:Auth::attempt always return false even with proper input and hash 【发布时间】:2021-09-26 04:08:32 【问题描述】:

我正在使用 laravel 流明框架 v8 并在以下网站上使用 jwt 身份验证 https://jwt-auth.readthedocs.io/en/develop/lumen-installation/.

这是我在项目中使用的一些代码sn-p

<?php
return [
   'defaults' => [
        'guard' => 'web',
        'passwords' => 'users',
    ],

    'guards' => [
        'web' => [
          'driver' => 'jwt',
          'provider' => 'users'
        ],
      ],

    'providers' => [
        'users' => [
            'driver' => 'eloquent',
            'model' => App\Models\User::class,
        ]
    ]
];

cofig/auth.php

我还在 bootstrap/app.php 和所有其他配置下注册了这个文件

这是我的控制器登录功能的样子

public function login(Request $request)
    

        $email = $request->input('email');
        $pass = $request->input('password');

        $credentials = [
            'email'=>$email,
            'password'=>md5($pass)
        ];

        dd( Auth::attempt($credentials));
                //return response()->json($credentials);
        if (! $token = auth('web')->attempt($credentials)) 
            return response()->json(['error' => 'Unauthorizedsfwe'], 401);
        

        return $this->respondWithToken($token);
    

我正在使用我现有的项目数据库,密码以以下形式存储 MD5 所以我也尝试过这种方式 像上面一样,但即使我也尝试使用直接哈希 MD5 登录,但它仍然无法正常工作

但是当我尝试从 PHPMyAdmin 上的响应目录运行它时

return response()->json($credentials);

它可以工作,但不适用于auth('web')-&gt;attempt() 方法

【问题讨论】:

【参考方案1】:

我记得当您将凭据传递给您不应该对密码进行哈希处理的方法时,它会处理密码哈希处理。您可以在这里查看EloquentUserProvider.phpvalidateCredentials 方法:https://github.com/laravel/framework/blob/574aaece57561e4258d5f9ab4275009d4355180a/src/Illuminate/Auth/EloquentUserProvider.php#L154-L159

它使用内置哈希器。

因此,您似乎需要覆盖默认哈希行为并使用 MD5 代替它。当我在 *** 上搜索时发现:https://***.com/a/44126955/1977031

它只是创建一个实现Illuminate\Contracts\Hashing\HasherMD5Hasher 并使用md5 进行哈希。并在服务提供者中注册,以便在需要Hasher时为应用程序提供MD5Hasher

【讨论】:

感谢您的回答。我是 Laravel 的新手,所以我不知道它有帮助。要了解什么对我有用,我只是用我的新帖子***.com/a/68431054/16244846 来回答【参考方案2】:

感谢您的回答,我的回答基本上是我的代码所做的。只需使用 md5 和另一个 time larval 默认哈希对我的密码进行双重哈希,这样我的密码就不起作用了,也许我必须禁用哈希或者只是用 MD5 覆盖默认哈希

现在我直接尝试这样对我有用

 public function login(Request $request)


    $email = $request->input('email');
    $pass = $request->input('password');

    $credentials = [
        'email'=>$email,
        'password'=>md5($pass)
    ];


            //return response()->json($credentials);

    $user = User::where('email', $request->email)
        ->where('password',md5($request->password))->first();
  
    if (! $token =  Auth::login($user)) 
        return response()->json(['error' => 'Unauthorizedsfwe'], 401);
    
    

   return $this->respondWithToken($token);

【讨论】:

以上是关于Auth::attempt 总是返回 false,即使输入和哈希正确的主要内容,如果未能解决你的问题,请参考以下文章

为啥 Auth::attempt 在 Laravel 5.3 中总是返回 false?

Laravel 5 Auth::attempt() 总是返回 false

Auth::attempt 总是返回 false,即使输入和哈希正确

auth laravel 总是返回 false

Auth::attempt 值始终为 false

Laravel Auth::attempt() 返回 false