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

时间:2016-01-16 14:21:13

标签: laravel authentication laravel-5 jwt lumen

我使用php流明框架制作了一个小API。

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

它似乎与jwt直接存在问题,因为令牌生成有效但只有登录无效。如我所见,jwt使用Lumen Auth::登录,因此请确保我尝试使用Auth::attempt()直接登录而不是JWTAuth::attempt,但结果是{{1}太...... 这是我的代码:

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列(完整的小写名称)
  • db email列是varchar(140)
  • 并尝试创建并登录此类用户:

    password
    • 我的身份验证配置包含:

    '驱动' => env(' AUTH_DRIVER',' eloquent'), '模型' => env(' AUTH_MODEL',' App \ Models \ User'), '表' => env(' AUTH_TABLE','用户'),

    • 我的$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)); 模型App\Models\User并使用implements Illuminate\Contracts\Auth\Authenticatable

但没有变化......我总是得到一个错误的' ! 可能是什么问题?

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

Illuminate\Auth\Authenticatable

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

1 个答案:

答案 0 :(得分:3)

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

如果我在没有哈希的情况下设置密码:

$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) ...