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

Symfony API Platform测试时无法创建签名JWT的问题求助

问题:PHPUnit测试JWT登录接口报错,外部调用正常

我在继承ApiTestCase的测试文件中编写了登录认证测试函数,代码如下:

class AuthenticationTest extends ApiTestCase {
    public function testLogin(): void
    {
        $client = self::createClient();
        $container = self::getContainer();

        $user = new User('username', [ 'ROLE_USER' ], 'e1420fb9-af64-4fb8-3c25-a0449b15fe7a');
        $user->setPassword(
            $container->get('security.user_password_hasher')->hashPassword($user, 'T3ST')
        );
        dump($user);

        $manager = $container->get('doctrine')->getManager();
        $manager->persist($user);
        $manager->flush();

        $response = $client->request('POST', '/api/login', [
            'headers' => ['Content-Type' => 'application/json'],
            'json' => [
                "username" => "username",
                "password" => "T3ST"
        ]]);

        $this->assertResponseIsSuccessful();
    }
}

运行PHPUnit测试时出现错误:Unable to create a signed JWT from the given configuration.,但通过curl、Swagger外部调用该登录接口可正常获取JWT令牌。

解决办法

  • 检查测试环境JWT配置
    测试环境通常使用单独的配置文件(如.env.test),需确保其中正确配置JWT密钥信息:

    JWT_PRIVATE_KEY=%kernel.project_dir%/config/jwt/private.pem
    JWT_PUBLIC_KEY=%kernel.project_dir%/config/jwt/public.pem
    JWT_PASSPHRASE=your_passphrase
    

    如果测试环境没有对应的密钥文件,执行以下命令生成:

    php bin/console lexik:jwt:generate-keypair --env=test
    
  • 清空测试环境缓存
    配置修改后需清空测试环境缓存,避免旧配置干扰:

    php bin/console cache:clear --env=test
    
  • 确认测试客户端环境初始化
    创建测试客户端时,明确指定测试环境参数,确保容器加载完整的认证配置:

    $client = self::createClient([], [
        'HTTP_HOST' => 'your-app.test',
        'APP_ENV' => 'test'
    ]);
    
  • 验证User实体实现
    确保User类正确实现Symfony\Component\Security\Core\User\UserInterface,且getUserIdentifier()方法返回正确的用户标识字段(如username),这是JWT生成的必要条件。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 04:35:26