流明,身份验证尝试总是返回 false(jwt 或 auth)

Posted

技术标签:

【中文标题】流明,身份验证尝试总是返回 false(jwt 或 auth)【英文标题】:Lumen, authentication attempt always returns false (jwt or auth) 【发布时间】:2016-04-22 01:07:24 【问题描述】:

我用 php lumen 框架做了一个小 API。

现在我正在为我的应用程序集成一个 jwt 身份验证(遵循这个 tuto http://laravelista.com/json-web-token-authentication-for-lumen/),但是当我尝试登录时,它总是返回 false...

直接使用jwt 似乎没有问题,因为令牌生成有效,但只有登录无效。如我所见,jwt 使用Lumen Auth:: 登录,所以请确保我尝试直接使用Auth::attempt() 而不是JWTAuth::attempt 登录,但结果也是false... 这是我的代码:

try

   $validation = $this->validate($request, [
      'email'    => 'required|email',
      'password' => 'required'
   ]);

   $credentials = $request->only('email', 'password');

   $isAuthenticated = Auth::attempt($credentials) || JWTAuth::attempt($credentials);

   $user = User::first();
   $token = JWTAuth::fromUser($user);

   $result = [
     'isAuthenticated' => $isAuthenticated,
     'token' => $token
   ];
 // ... catch exceptions + return $result or errors from exceptions

我进行了一些搜索以纠正此类问题的常见错误,并且我已经检查过:

我有一个名为users 的表 其中我有一个 password 列和一个 email 列(全小写名称) db password 列是 varchar(140)

并尝试像这样创建和登录用户:

$user = new User;
$user->email = 'example@domain.com';
$user->password = Hash::make('passwordExample');
$user->save();
//And login with it:
$userData = array(
  'email' => 'example@domain.com',
  'password' => 'passwordExample');            
return (string) Auth::attempt($userData));
我的身份验证配置包含:

'driver' => env('AUTH_DRIVER', 'eloquent'), 'model' => env('AUTH_MODEL', 'App\Models\User'), 'table' => env('AUTH_TABLE', 'users'),

我的App\Models\User 模型implements Illuminate\Contracts\Auth\Authenticatable 并使用Illuminate\Auth\Authenticatable

但没有变化...我总是得到一个“假”! 可能是什么问题?

这是我使用的框架版本(来自 composer.json)

    "laravel/lumen-framework": "5.1.*",
    "vlucas/phpdotenv": "~1.0",
    "doctrine/dbal": "~2.3",
    "illuminate/mail": "^5.1",
    "tymon/jwt-auth": "^0.5.6",
    "basicit/lumen-vendor-publish": "^1.0",
    "illuminate/support": "5.1.25",
    "illuminate/routing": "5.1.25"

注意:我还注意到,对于相同的密码哈希两次,结果是不一样的。正如我所读到的,这很正常,并且 Auth 知道如何检查散列存储的密码。但我不明白......如果散列结果不一样,他如何检查密码?它为每个哈希存储一个盐?

【问题讨论】:

laracasts.com/discuss/channels/general-discussion/… -> 这并没有解决我的问题,但已经回答了我的笔记问题 配置变量是否也在您的.env 文件中设置?如果是这样,他们将覆盖 /config 文件夹中的那些。 @Jeemusu 感谢您的回复。 .env/config 具有相同的值。我试图删除条目以仅允许 auth config 中的值,但它没有解决问题。 【参考方案1】:

嗯...花了我一段时间,但我想出了如何正确登录...

如果我设置密码而不对其进行哈希处理:

$user = User::select('id', 'email')
  ->where('email', $email)
  ->first();
$user->password = $newPassword;
$user->save();

我查看数据库中插入了什么,密码是加密存储的...

然后,如果我尝试登录:

$this->validate($request, [
    'email'    => 'required|email|max:255',
    'password' => 'required'
]);
$credentials = $request->only('email', 'password');
if ( $token = JWTAuth::attempt($credentials) )
...

它工作正常。

所以我的问题是我在插入密码之前对密码进行了两次哈希处理。

但我真的不明白为什么它会自动散列,因为正如我在文档中看到的那样,我必须明确地这样做。所以如果有人能告诉我原因,我会很想知道的。

反正我应该直接用Hash::needsRehash($hashed)...

【讨论】:

太棒了!谢谢你。也帮助了我! Auth::attempt(['email' => 'user@domain.com', 'password' => '123456']); return false

以上是关于流明,身份验证尝试总是返回 false(jwt 或 auth)的主要内容,如果未能解决你的问题,请参考以下文章

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

Laravel JWT 身份验证返回 False

护照-jwt 总是返回 401 未授权

在流明 jwt 令牌中设置过期时间

护照-jwt 总是返回“未经授权” - 401

GCP API Gateway JWT 总是返回 403