JWT (JSON Web Token)是一种开放标准(RFC 7519),用于在各方之间安全地传输信息作为JSON对象。在Symfony中,JWT常用于API认证。
首先确认已安装lexik/jwt-authentication-bundle:
composer require lexik/jwt-authentication-bundle
# config/packages/security.yaml
security:
providers:
jwt:
lexik_jwt: ~
firewalls:
api:
pattern: ^/api
stateless: true
jwt: ~
access_control:
- { path: ^/api/login, roles: PUBLIC_ACCESS }
- { path: ^/api, roles: IS_AUTHENTICATED_FULLY }
在测试前需要生成有效的JWT令牌:
use Lexik\Bundle\JWTAuthenticationBundle\Services\JWTTokenManagerInterface;
class YourTest extends KernelTestCase
{
private function createToken($username)
{
$container = self::getContainer();
$jwtManager = $container->get(JWTTokenManagerInterface::class);
return $jwtManager->create($username);
}
}
use Symfony\Bundle\FrameworkBundle\Test\WebTestCase;
class ApiTest extends WebTestCase
{
public function testProtectedEndpoint()
{
$client = static::createClient();
// 获取有效令牌
$token = $this->createToken('testuser');
// 设置Authorization头
$client->setServerParameter('HTTP_Authorization', sprintf('Bearer %s', $token));
// 测试受保护端点
$client->request('GET', '/api/protected');
$this->assertResponseIsSuccessful();
}
}
问题:返回401未授权
问题:令牌无效
对于更复杂的测试场景,可以考虑:
// 测试过期令牌
public function testExpiredToken()
{
$client = static::createClient();
// 创建过期令牌(需要自定义实现)
$expiredToken = $this->createExpiredToken('testuser');
$client->setServerParameter('HTTP_Authorization', sprintf('Bearer %s', $expiredToken));
$client->request('GET', '/api/protected');
$this->assertResponseStatusCodeSame(401);
}
通过以上方法,您应该能够解决Symfony中使用JWT测试API端点的问题。
没有搜到相关的文章