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

Laravel 10中Auth0认证的受保护端点功能测试编写方法

为Auth0集成的Laravel应用编写受保护路由功能测试

方法1:模拟Auth0认证用户(快速测试方案)

Laravel测试框架支持手动设置认证状态,无需调用Auth0接口,适合快速验证路由权限逻辑。

  1. 创建测试类
    在tests/Feature目录下新建PostsApiTest.php:
<?php

namespace Tests\Feature;

use Tests\TestCase;
use Auth0\Laravel\Model\Auth0User;
use Illuminate\Support\Facades\Auth;

class PostsApiTest extends TestCase
{
    // 测试管理员可访问api/posts端点
    public function test_admin_can_access_posts_endpoint()
    {
        // 生成带管理员权限的模拟Auth0用户
        $adminUser = Auth0User::factory()->create([
            'permissions' => ['manage:posts'], // 对应Auth0中定义的管理员权限
        ]);

        // 设定当前认证用户
        Auth::login($adminUser);

        // 发起请求
        $response = $this->getJson('/api/posts');

        // 断言请求成功返回
        $response->assertStatus(200);
    }

    // 测试普通用户无法访问api/posts端点
    public function test_non_admin_cannot_access_posts_endpoint()
    {
        $regularUser = Auth0User::factory()->create([
            'permissions' => [],
        ]);

        Auth::login($regularUser);

        $response = $this->getJson('/api/posts');

        // 断言无权限,返回403状态码
        $response->assertStatus(403);
    }
}
  1. 补充用户工厂支持
    如果你的Auth0用户模型未配置工厂,在database/factories目录下创建Auth0UserFactory.php:
<?php

namespace Database\Factories;

use Auth0\Laravel\Model\Auth0User;
use Illuminate\Database\Eloquent\Factories\Factory;

class Auth0UserFactory extends Factory
{
    protected $model = Auth0User::class;

    public function definition()
    {
        return [
            'auth0_id' => $this->faker->uuid,
            'name' => $this->faker->name,
            'email' => $this->faker->unique()->safeEmail,
            'permissions' => [],
            // 根据你的实际配置添加其他必要字段
        ];
    }
}

方法2:使用真实Auth0测试令牌(贴近生产场景)

如果需要模拟真实的认证流程,可通过Auth0获取测试用JWT令牌,在请求中携带验证。

  1. 获取测试令牌
    登录Auth0控制台,进入你的应用的「Test」标签页,生成带manage:posts权限的测试用户JWT令牌;也可通过Auth0管理API自动化创建测试用户并生成令牌。

  2. 在测试中使用令牌
    修改测试类:

<?php

namespace Tests\Feature;

use Tests\TestCase;

class PostsApiTest extends TestCase
{
    public function test_admin_can_access_posts_with_valid_token()
    {
        // 替换为你的测试JWT令牌
        $adminToken = 'YOUR_AUTH0_TEST_JWT_TOKEN';

        $response = $this->withHeaders([
            'Authorization' => 'Bearer ' . $adminToken,
        ])->getJson('/api/posts');

        $response->assertStatus(200);
    }

    public function test_invalid_token_is_rejected()
    {
        $response = $this->withHeaders([
            'Authorization' => 'Bearer invalid_token',
        ])->getJson('/api/posts');

        $response->assertStatus(401);
    }
}
  1. 优化:用环境变量存储令牌
    避免硬编码令牌,在.env.testing中添加:
AUTH0_TEST_ADMIN_TOKEN=your_test_token_here

测试中读取变量:

$adminToken = env('AUTH0_TEST_ADMIN_TOKEN');

权限逻辑专项测试

如果端点通过auth0.permissions:manage:posts中间件验证权限,可补充测试:

public function test_user_without_permission_is_blocked()
{
    $userToken = 'YOUR_AUTH0_TEST_USER_TOKEN_WITHOUT_PERMISSIONS';

    $response = $this->withHeaders([
        'Authorization' => 'Bearer ' . $userToken,
    ])->getJson('/api/posts');

    $response->assertStatus(403);
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.05 21:46:14