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