Laravel 10中Auth0认证的受保护端点功能测试编写方法
为Auth0集成的Laravel应用编写受保护路由功能测试
方法1:模拟Auth0认证用户(快速测试方案)
Laravel测试框架支持手动设置认证状态,无需调用Auth0接口,适合快速验证路由权限逻辑。
- 创建测试类
在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); } }
- 补充用户工厂支持
如果你的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令牌,在请求中携带验证。
获取测试令牌
登录Auth0控制台,进入你的应用的「Test」标签页,生成带manage:posts权限的测试用户JWT令牌;也可通过Auth0管理API自动化创建测试用户并生成令牌。在测试中使用令牌
修改测试类:
<?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); } }
- 优化:用环境变量存储令牌
避免硬编码令牌,在.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
相关产品推荐
相关产品推荐

