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

Laravel测试中Passport::actingAs($user)未使用自定义路由问题咨询

问题解答:Passport::actingAs() 与自定义/oauth/token路由的测试问题

我来帮你理清这个问题:

为什么Passport::actingAs()不会触发你的自定义路由?

Passport::actingAs()(或者更通用的$this->actingAs())是Laravel测试套件提供的模拟认证工具,它根本不会走真实的HTTP请求流程,自然也不会触发你自定义的/oauth/token路由和控制器逻辑。

它的工作原理是直接在测试环境的服务容器中设置当前认证的用户,相当于“跳过令牌发放步骤,直接让测试框架认为你已经登录了”。这种方式是为了让测试更高效,不需要每次都模拟完整的OAuth2令牌请求流程。

测试中获取认证令牌的两种方式

根据你的测试需求,有两种可选方案:

1. 手动请求自定义令牌路由(验证自定义逻辑时用)

如果你需要测试自己的CustomAccessTokenController令牌发放逻辑,或者需要在测试中使用真实生成的令牌,可以直接在测试代码里发送POST请求到你的自定义路由,获取令牌后再用于后续请求:

public function testCustomTokenIssuanceAndProtectedRoute()
{
    // 创建测试用户
    $user = User::factory()->create([
        'email' => 'test-user@example.com',
        'password' => bcrypt('test-password'),
    ]);

    // 发送请求到自定义/oauth/token路由获取令牌
    $tokenResponse = $this->post('/oauth/token', [
        'grant_type' => 'password',
        'username' => 'test-user@example.com',
        'password' => 'test-password',
        'client_id' => config('passport.password_client.id'), // 确保配置文件里有这个客户端信息
        'client_secret' => config('passport.password_client.secret'),
        'scope' => '',
    ]);

    // 确认令牌发放成功,提取access_token
    $tokenResponse->assertStatus(200);
    $accessToken = $tokenResponse->json('access_token');

    // 使用令牌访问受保护的接口
    $this->withHeaders([
        'Authorization' => "Bearer {$accessToken}",
    ])->get('/api/protected-endpoint')
      ->assertStatus(200);
}

2. 继续使用actingAs()(仅测试接口认证时用)

如果你的测试目标只是验证“用户认证后能访问受保护接口”,不需要验证自定义令牌发放逻辑,那完全可以继续用actingAs(),只要指定正确的认证守卫即可:

public function testProtectedRouteWithMockedAuth()
{
    $user = User::factory()->create();

    // 使用api守卫模拟认证,对应Passport的api认证中间件
    $this->actingAs($user, 'api')
         ->get('/api/protected-endpoint')
         ->assertStatus(200);
}

这里第二个参数'api'是关键,它指定了使用Passport的api认证守卫,确保测试框架用Passport的认证逻辑处理请求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.13 07:59:44