You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Laravel 10 Passport客户端认证失败(OAuthServerException)求助

Laravel 10 Passport 客户端认证失败问题排查

问题描述

新建Laravel 10 REST API项目,严格按照Passport文档配置,调用createToken生成个人访问令牌时出现Client authentication failed错误,错误栈指向PersonalAccessGrant的客户端验证环节。已尝试重置数据库、重新安装Passport、切换端口,问题仍未解决。

错误信息

"message": "There was some internal error",
"result": null,
"exception": {
    "message": "Client authentication failed",
    "file": "/var/www/html/vendor/league/oauth2-server/src/Exception/OAuthServerException.php",
    "line": 154,
    "code": 4,
    "trace": [
        {
            "file": "/var/www/html/vendor/league/oauth2-server/src/Grant/AbstractGrant.php",
            "line": 199,
            "function": "invalidClient",
            "class": "League\\OAuth2\\Server\\Exception\\OAuthServerException",
            "type": "::"
        },
        {
            "file": "/var/www/html/vendor/laravel/passport/src/Bridge/PersonalAccessGrant.php",
            "line": 21,
            "function": "validateClient",
            "class": "League\\OAuth2\\Server\\Grant\\AbstractGrant",
            "type": "->"
        },
        {
            "file": "/var/www/html/vendor/league/oauth2-server/src/AuthorizationServer.php",
            "line": 201,
            "function": "respondToAccessTokenRequest",
            "class": "Laravel\\Passport\\Bridge\\PersonalAccessGrant",
            "type": "->"
        }
    ]
}

登录函数代码

$credentials = $request->only(['email', 'password']);
$validation = $this->validate($request, [
    'email' => 'required|email',
    'password' => 'required'
]);

if (!auth()->attempt($credentials)) {
    return $this->apiResponse(
        [
            'success' => false,
            'message' => 'Unauthorized',
            'alerts'=> ["type"=>"error","message"=>"Your Email address or Password is wrong"]
        ],
        401
    );
}

/* ------------ Create a new personal access token for the user. ------------ */
$tokenData = auth()->user()->createToken('Personal Access Client');
$token = $tokenData->accessToken;
$expiration = $tokenData->token->expires_at->diffInSeconds(Carbon::now());

解决方案

  • 检查并创建Personal Access Client
    运行命令创建个人访问客户端:

    php artisan passport:client --personal
    

    执行完成后,确认oauth_clients表中存在name为Personal Access Client的记录,且secret字段不为空。

  • 配置.env参数
    将上述客户端的id和secret填入.env文件:

    PASSPORT_PERSONAL_ACCESS_CLIENT_ID=你的客户端ID
    PASSPORT_PERSONAL_ACCESS_CLIENT_SECRET=你的客户端Secret
    

    执行命令清除配置缓存:

    php artisan config:clear
    
  • 验证Passport安装完整性

    1. 确认用户模型(如App\Models\User)引入了HasApiTokens trait:
      use Laravel\Passport\HasApiTokens;
      
      class User extends Authenticatable
      {
          use HasApiTokens, HasFactory, Notifiable;
          // ...
      }
      
    2. 确认AuthServiceProvider的boot方法中注册了Passport路由:
      use Laravel\Passport\Passport;
      
      public function boot()
      {
          $this->registerPolicies();
      
          Passport::routes();
          // ...
      }
      
    3. 确认config/auth.php中API guard的驱动设置为passport:
      'guards' => [
          'api' => [
              'driver' => 'passport',
              'provider' => 'users',
          ],
      ],
      
  • 显式指定客户端ID生成令牌
    在调用createToken时,显式传入Personal Access Client的ID,避免自动匹配失败:

    $tokenData = auth()->user()->createToken(
        'Personal Access Client',
        [], // 权限范围(可选)
        env('PASSPORT_PERSONAL_ACCESS_CLIENT_ID')
    );
    
  • 清除所有缓存
    执行以下命令清除各类缓存:

    php artisan cache:clear
    php artisan route:clear
    php artisan view:clear
    

内容的提问来源于stack exchange,提问作者Talhak

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.23 21:37:23