laravel - 是否可以通过 Laravel Passport 执行用户身份验证(不是授权)?
问题描述
据我了解,Passport 用于实现 OAuth 2.0 标准支持,而在我看来,OAuth 2.0 是一种授权技术,而不是身份验证。
所以在授权用户做某事之前,首先我需要对他们进行身份验证。Passport 有没有办法对用户进行身份验证,或者我应该使用其他一些用户身份验证方式?例如,我想使用登录名和密码对用户进行身份验证。
编辑:我对文档有点困惑。据说:
Passport 包括一个身份验证保护,它将验证传入请求的访问令牌。将 api 保护配置为使用护照驱动程序后,您只需在任何需要有效访问令牌的路由上指定 auth:api 中间件。
因此,这意味着 Passport 使用守卫不是对用户进行身份验证,而是在需要这些令牌的路由上验证访问令牌。我做对了吗?
解决方案
是的,您可以使用护照令牌进行身份验证。为用户制作一个令牌并在用户登录时将其作为响应发送。然后使用 laravel 守卫将该身份验证应用于该用户的所有路由。(确保您的模型扩展了 Authenticatable 并使用 HasApiTokens)下面给出了监护人的示例。在 auth.php 中执行以下操作:
'guards' => [
'web' => [
'driver' => 'session',
'provider' => 'users',
],
'guardians' => [
'driver' => 'passport',
'provider' => 'guardians',
'hash' => false,
],
],
'providers' => [
'users' => [
'driver' => 'eloquent',
'model' => App\Models\User::class,
],
'guardians' => [
'driver' => 'eloquent',
'model' => App\Models\Guardian::class,
],
],
在 AuthServiceProvider 中这样做:
public function boot()
{
$this->registerPolicies();
//token will expire in one day
Passport::personalAccessTokensExpireIn(Carbon::now()->addDays(1));
Passport::routes();
}
然后在 api.php 中对您要验证的所有路由执行此操作。
Route::group(['middleware' => 'auth:guardians'], function () {
Route::post('/parent', [ParentController::class, 'parentsList'])
->name('parentsList');
});
您的控制器代码将如下所示:
$guardian = Guardian::where('email', $request->email)->first();
if (Hash::check($request->password, $guardian->password)) {
//passport package implement here...
$token = $guardian->createToken('Laravel Password Grant Client')->accessToken;
$data=['guardian'=> $guardian, 'token'=> $token];
return Response::json($data,200);
}
else {
$data=['error' => 'Mobile Number/Email or Password entered is incorrect.'];
return Response::json($data, 422);
}
推荐阅读
- flutter - 单击左上角按钮单击(汉堡图标)时如何从侧面打开屏幕?
- javascript - 在 React 中创建了多过滤按钮,但每次单击其他过滤按钮时列表都不会显示
- daml - 在 DAML 中可以使用什么来代替 Either?
- javascript - 添加新的
- 元素成
- 问题
- 元素成
- spring - 如何在 Spring Boot 项目中创建 docker 镜像
- javascript - 在signle测试中处理多个浏览器实例时如何设置ignoreSynchronization
- python - pyhon中selenium的send_keys不起作用
- javascript - p:commandLink window.onload
- c# - 为什么传递变量失败,错误值类型“字符串”无法转换为“字符串()”?
- php - 如何根据重音区分确切的字符?