首页 > 解决方案 > 是否可以通过 Laravel Passport 执行用户身份验证(不是授权)?

问题描述

据我了解,Passport 用于实现 OAuth 2.0 标准支持,而在我看来,OAuth 2.0 是一种授权技术,而不是身份验证

所以在授权用户做某事之前,首先我需要对他们进行身份验证。Passport 有没有办法对用户进行身份验证,或者我应该使用其他一些用户身份验证方式?例如,我想使用登录名和密码对用户进行身份验证。

编辑:我对文档有点困惑。据说:

Passport 包括一个身份验证保护,它将验证传入请求的访问令牌。将 api 保护配置为使用护照驱动程序后,您只需在任何需要有效访问令牌的路由上指定 auth:api 中间件。

因此,这意味着 Passport 使用守卫不是对用户进行身份验证,而是在需要这些令牌的路由上验证访问令牌。我做对了吗?

标签: laraveloauth-2.0laravel-7laravel-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);
 }

推荐阅读