【问题标题】:PHPUnit - Symfony authorization with x-api-keyPHPUnit - 使用 x-api-key 进行 Symfony 授权
【发布时间】:2022-01-26 23:28:14
【问题描述】:

我正在使用 PHPUnit 测试为特定端点编写功能测试。

问题在于,对于授权过程,我必须在请求的标头部分设置X-API-KEY

我不断收到错误:

需要验证

我在我的测试数据库表中使用了一个有效的 api 密钥,它返回了我上面提到的这个特定错误。

 public function testDoItSuccessful()
{
    $client = static::createClient(
        [],
        ['HTTP_x-api-key' => 'clWD0ggquG1Ok2xOVLIcMmPJtu1uYWG']
    );

    $client->request(
        Request::METHOD_POST,
        '/api/v1/do-it',
        [],
        [],
        [
            'CONTENT_TYPE' => 'application/json',
            'ACCEPT' => 'application/json',
        ],
        json_encode($myArray)
    );

   return $client;
 }

由于我是新手,主要是在测试环境中的授权过程中,非常感谢任何帮助。

注意:我正在使用 Symfony 4.4

我试过THIS

TokenAuthenticator 类中的这两个函数出现错误。

public function supports(Request $request)
{
    $hasApiKey = true;
    $requestHeaders = $this->getLowerCasedHeaders();
    if (!isset($requestHeaders['x-api-key'])) {
        $hasApiKey = false;
    }
    return $hasApiKey;
}

private function getLowerCasedHeaders()
{
    $requestHeaders = getallheaders();
    return array_change_key_case($requestHeaders, CASE_LOWER);
}


public function getCredentials(Request $request)
{
    $requestHeaders = $this->getLowerCasedHeaders();
    return $requestHeaders['x-api-key'];
}

public function getUser($credentials, UserProviderInterface $userProvider)
{
    if (null === $credentials) {
        // Code 401 "Unauthorized"
        return null;
    }

    return $this->entityManager->getRepository(Client::class)->findOneBy(['apiKey' => $credentials]);
}

public function checkCredentials($credentials, UserInterface $user)
{
    if ($user->getStatus() != Client::STATUS_ACTIVE) {
        throw new AuthenticationException("USER_NOT_ACTIVE", 403);
    }
    $user->setLastSeen(new DateTime('now'));
    $this->entityManager->persist($user);
    $this->entityManager->flush();
    return true;
}

public function onAuthenticationSuccess(Request $request, TokenInterface $token, $providerKey)
{
    return null;
}

public function onAuthenticationFailure(Request $request, AuthenticationException $exception)
{
    $data = [
        'message' => 'Authentication failed, wrong api key'
    ];
    if ($exception->getCode() == 403) {
        $data = ['message' => $exception->getMessage()];
    }

    return new JsonResponse($data, Response::HTTP_UNAUTHORIZED);
}

public function start(Request $request, AuthenticationException $authException = null)
{
    $data = [
        // you might translate this message
        'message' => 'Authentication Required'
    ];

    return new JsonResponse($data, Response::HTTP_UNAUTHORIZED);
}

public function supportsRememberMe()
{
    return false;
}

我已将apache_request_headers() 更改为getallheaders(),测试通过Authentication Required 消息。

print_r()时:

$requestHeaders = $this->getLowerCasedHeaders();

我无法从请求中看到我定义的标头?它返回Array()..

【问题讨论】:

    标签: php symfony phpunit authorization symfony4


    【解决方案1】:

    您需要检查客户端类如何解析标头,特别是在测试中,有一部分代码执行搜索自定义标头的单词 HTTP_。因此,基本上在您的测试中,您需要添加前缀 HTTP_ 而不是仅调用 x-api-key。试试这个:

    令牌验证器

    public function supports(Request $request)
    {
        return $request->headers->has('x-api-key');
    }
    

    在你的测试中:

    public function testDoItSuccessful()
    {
         crawler = $this->client->request(
             Request::METHOD_POST,
             '/api/v1/do-it',
             [],
             [],
             ['HTTP_x-api-key' => self::TOKEN, 'CONTENT_TYPE' => 'application/json', 'ACCEPT' => 'application/json']
         );
         $status = $this->client->getResponse()->getStatusCode();
    }
    

    【讨论】:

    • 这可行,但我收到 401(需要身份验证)错误? @RicardoJesusRuiz
    • 在这种情况下,可能 Authenticator 类需要更多更改,您能否更新问题?
    • 我更新了问题。请检查。 @RicardoJesusRuiz
    • 在这种情况下@misafe,我想查看 Authenticator 类的其余部分,为什么?因为在代码的某些部分抛出异常或没有返回正确的值。您可以查看下一个视频symfonycasts.com/screencast/symfony4-security/…
    • 我明白了。我发布了整个班级。非常感谢你的帮助。 @RicardoJesusRuiz
    猜你喜欢
    • 2021-03-02
    • 2020-02-13
    • 2020-05-05
    • 2020-09-21
    • 2018-12-13
    • 2020-10-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多