Laravel Passport: используйте пользовательский пароль - PullRequest
0 голосов
/ 07 мая 2018

Я хочу использовать user_password вместо просто password в качестве имени столбца пароля для базы данных моего API. Итак, вот код метода login() для получения токена в моем PassportController:

public function login() {
    if (Auth::attempt(['user_login' => request('login'), 'password' => request('user_password')])) {
        $user = Auth::user();
        $success['token'] = $user->createToken('ToutelaBreizh')->accessToken;
        return response()->json(['success' => $success], $this->successStatus);
    } else {
        return response()->json(['error' => 'Unauthorised.'], 401);
    }
}

Параметры запроса к этому контроллеру: login и password.

Проблема в том, что я иду на маршрут, связанный с этим контроллером, скажем, POST /api/login. Я получаю эту ошибку:

ErrorException: неопределенный индекс: пароль в файле ... EloquentUserProvider.php в строке 133

[Первые строки трассировки стека ...]

  1. ... PassportController.php: 21

21-я строка в моем PassportController - это вторая строка функции входа в систему, которую я разместил выше, и действительно, поле password не сообщается в учетных данных, которые я написал: я написал user_password вместо password, но строка password жестко задана в EloquentUserProvider.php, строка 133:

public function validateCredentials(UserContract $user, array $credentials)
{
    $plain = $credentials['password'];

    return $this->hasher->check($plain, $user->getAuthPassword());
}

Как подсказал этот ответ , я попытался переопределить validateForPassportPasswordGrant($password) в модели User.php, но это не помогло:

public function validateForPassportPasswordGrant($password)
{
    return Hash::check($password, $this->user_password);
}

Как мне сделать, чтобы user_password было в моей базе данных, а не password?

Спасибо за вашу помощь.

1 Ответ

0 голосов
/ 07 мая 2018

Эта проблема на самом деле не относится к паспорту, она больше связана с поведением Auth Guard, которое абстрагировано от Passport. Просто добавьте это к вашему пользователю Модель:

/**
 * Get the password for the user.
 *
 * @return string
 */
public function getAuthPassword()
{
    return $this->user_password;
}

Стандартная модель Laravel App\User Модель расширяет Illuminate\Foundation\Auth\User, которая использует черту Illuminate\Auth\Authenticatable. Эта особенность является просто удобством для удовлетворения условий интерфейса Illuminate\Contracts\Auth\Authenticatable, одним из которых является наличие в основном геттера для любого имени вашего поля пароля. Ты бы это переопределил.

Между прочим, слово «пароль» в контексте типов предоставления - совершенно другое, и вам не следует так менять его. Это больше связано со ссылкой на конфигурацию, а не с полем базы данных.

...