Lumen, попытка аутентификации всегда возвращает false (jwt или auth)

Я сделал небольшой API с фреймворком php lumen.

Теперь я интегрирую аутентификацию 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 столбец (полные строчные имена)
  • децибел password колонна варчар (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 знает, как проверить хешированный сохраненный пароль. Но я не понимаю... Как он проверяет пароль, если результат хеширования никогда не бывает прежним? Он хранит соль для каждого хеша?

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) непосредственно...

Другие вопросы по тегам