Laravel 护照:使用自定义密码
Laravel Passport: Use custom password
我想使用 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: Undefined index: password in file ... EloquentUserProvider.php on line 133
[First lines of the stack trace...]
- ... PassportController.php:21
我的 PassportController 中的第 21 行是我在上面发布的登录功能的第二行,实际上,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());
}
根据 的建议,我试图覆盖 User.php
模型中的 validateForPassportPasswordGrant($password)
但它没有帮助:
public function validateForPassportPasswordGrant($password)
{
return Hash::check($password, $this->user_password);
}
我应该怎么做才能让我的数据库中有 user_password
而不是 password
?
感谢您的帮助。
这个问题实际上并不是 Passport 特有的,它更多地与从 Passport 抽象出来的 Auth Guard 行为有关。只需将其添加到您的用户模型中:
/**
* 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
接口的条件而提供的便利,其中之一是基本上为您的密码字段命名的任何内容提供 getter 。你会覆盖这个。
'password' 这个词在授权类型的上下文中是一个完全不同的东西,而不是你应该那样改变的东西。这更多地与配置参考有关,而不是数据库字段。
我想使用 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: Undefined index: password in file ... EloquentUserProvider.php on line 133
[First lines of the stack trace...]
- ... PassportController.php:21
我的 PassportController 中的第 21 行是我在上面发布的登录功能的第二行,实际上,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());
}
根据 User.php
模型中的 validateForPassportPasswordGrant($password)
但它没有帮助:
public function validateForPassportPasswordGrant($password)
{
return Hash::check($password, $this->user_password);
}
我应该怎么做才能让我的数据库中有 user_password
而不是 password
?
感谢您的帮助。
这个问题实际上并不是 Passport 特有的,它更多地与从 Passport 抽象出来的 Auth Guard 行为有关。只需将其添加到您的用户模型中:
/**
* 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
接口的条件而提供的便利,其中之一是基本上为您的密码字段命名的任何内容提供 getter 。你会覆盖这个。
'password' 这个词在授权类型的上下文中是一个完全不同的东西,而不是你应该那样改变的东西。这更多地与配置参考有关,而不是数据库字段。