【问题标题】:Is it possible to perform user authentication through Laravel Passport (not authorization)?是否可以通过 Laravel Passport 执行用户身份验证(不是授权)?
【发布时间】:2021-02-08 09:36:55
【问题描述】:

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

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

编辑: 我对the documentation 有点困惑。据说:

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

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

【问题讨论】:

    标签: laravel oauth-2.0 laravel-7 laravel-passport


    【解决方案1】:

    是的,您可以使用护照令牌进行身份验证。为用户制作一个令牌并在用户登录时将其作为响应发送。然后使用 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);
     }
    

    【讨论】:

      猜你喜欢
      • 2017-08-27
      • 2020-04-08
      • 2022-09-29
      • 2021-12-20
      • 1970-01-01
      • 2017-08-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多