TokenAuthenticator   A
last analyzed

Complexity

Total Complexity 11

Size/Duplication

Total Lines 59
Duplicated Lines 0 %

Importance

Changes 15
Bugs 0 Features 0
Metric Value
wmc 11
eloc 23
c 15
b 0
f 0
dl 0
loc 59
rs 10

8 Methods

Rating   Name   Duplication   Size   Complexity  
A getKey() 0 3 1
A onAuthenticationFailure() 0 3 1
A authenticate() 0 16 3
A start() 0 3 1
A onAuthenticationSuccess() 0 3 1
A createToken() 0 4 1
A __construct() 0 3 1
A supports() 0 4 2
1
<?php
2
3
namespace ControleOnline\Security;
4
5
use ControleOnline\Entity\User;
6
use Doctrine\ORM\EntityManagerInterface;
0 ignored issues
show
Bug introduced by
The type Doctrine\ORM\EntityManagerInterface was not found. Maybe you did not declare it correctly or list all dependencies?

The issue could also be caused by a filter entry in the build configuration. If the path has been excluded in your configuration, e.g. excluded_paths: ["lib/*"], you can move it to the dependency path list as follows:

filter:
    dependency_paths: ["lib/*"]

For further information see https://scrutinizer-ci.com/docs/tools/php/php-scrutinizer/#list-dependency-paths

Loading history...
7
use Symfony\Component\HttpFoundation\JsonResponse;
0 ignored issues
show
Bug introduced by
The type Symfony\Component\HttpFoundation\JsonResponse was not found. Maybe you did not declare it correctly or list all dependencies?

The issue could also be caused by a filter entry in the build configuration. If the path has been excluded in your configuration, e.g. excluded_paths: ["lib/*"], you can move it to the dependency path list as follows:

filter:
    dependency_paths: ["lib/*"]

For further information see https://scrutinizer-ci.com/docs/tools/php/php-scrutinizer/#list-dependency-paths

Loading history...
8
use Symfony\Component\HttpFoundation\Request;
0 ignored issues
show
Bug introduced by
The type Symfony\Component\HttpFoundation\Request was not found. Maybe you did not declare it correctly or list all dependencies?

The issue could also be caused by a filter entry in the build configuration. If the path has been excluded in your configuration, e.g. excluded_paths: ["lib/*"], you can move it to the dependency path list as follows:

filter:
    dependency_paths: ["lib/*"]

For further information see https://scrutinizer-ci.com/docs/tools/php/php-scrutinizer/#list-dependency-paths

Loading history...
9
use Symfony\Component\HttpFoundation\Response;
0 ignored issues
show
Bug introduced by
The type Symfony\Component\HttpFoundation\Response was not found. Maybe you did not declare it correctly or list all dependencies?

The issue could also be caused by a filter entry in the build configuration. If the path has been excluded in your configuration, e.g. excluded_paths: ["lib/*"], you can move it to the dependency path list as follows:

filter:
    dependency_paths: ["lib/*"]

For further information see https://scrutinizer-ci.com/docs/tools/php/php-scrutinizer/#list-dependency-paths

Loading history...
10
use Symfony\Component\Security\Core\Authentication\Token\TokenInterface;
0 ignored issues
show
Bug introduced by
The type Symfony\Component\Securi...on\Token\TokenInterface was not found. Maybe you did not declare it correctly or list all dependencies?

The issue could also be caused by a filter entry in the build configuration. If the path has been excluded in your configuration, e.g. excluded_paths: ["lib/*"], you can move it to the dependency path list as follows:

filter:
    dependency_paths: ["lib/*"]

For further information see https://scrutinizer-ci.com/docs/tools/php/php-scrutinizer/#list-dependency-paths

Loading history...
11
use Symfony\Component\Security\Core\Authentication\Token\UsernamePasswordToken;
0 ignored issues
show
Bug introduced by
The type Symfony\Component\Securi...n\UsernamePasswordToken was not found. Maybe you did not declare it correctly or list all dependencies?

The issue could also be caused by a filter entry in the build configuration. If the path has been excluded in your configuration, e.g. excluded_paths: ["lib/*"], you can move it to the dependency path list as follows:

filter:
    dependency_paths: ["lib/*"]

For further information see https://scrutinizer-ci.com/docs/tools/php/php-scrutinizer/#list-dependency-paths

Loading history...
12
use Symfony\Component\Security\Core\Exception\AuthenticationException;
0 ignored issues
show
Bug introduced by
The type Symfony\Component\Securi...AuthenticationException was not found. Maybe you did not declare it correctly or list all dependencies?

The issue could also be caused by a filter entry in the build configuration. If the path has been excluded in your configuration, e.g. excluded_paths: ["lib/*"], you can move it to the dependency path list as follows:

filter:
    dependency_paths: ["lib/*"]

For further information see https://scrutinizer-ci.com/docs/tools/php/php-scrutinizer/#list-dependency-paths

Loading history...
13
use Symfony\Component\Security\Core\Exception\CustomUserMessageAuthenticationException;
0 ignored issues
show
Bug introduced by
The type Symfony\Component\Securi...AuthenticationException was not found. Maybe you did not declare it correctly or list all dependencies?

The issue could also be caused by a filter entry in the build configuration. If the path has been excluded in your configuration, e.g. excluded_paths: ["lib/*"], you can move it to the dependency path list as follows:

filter:
    dependency_paths: ["lib/*"]

For further information see https://scrutinizer-ci.com/docs/tools/php/php-scrutinizer/#list-dependency-paths

Loading history...
14
use Symfony\Component\Security\Http\Authenticator\AbstractAuthenticator;
0 ignored issues
show
Bug introduced by
The type Symfony\Component\Securi...r\AbstractAuthenticator was not found. Maybe you did not declare it correctly or list all dependencies?

The issue could also be caused by a filter entry in the build configuration. If the path has been excluded in your configuration, e.g. excluded_paths: ["lib/*"], you can move it to the dependency path list as follows:

filter:
    dependency_paths: ["lib/*"]

For further information see https://scrutinizer-ci.com/docs/tools/php/php-scrutinizer/#list-dependency-paths

Loading history...
15
use Symfony\Component\Security\Http\Authenticator\Passport\Badge\UserBadge;
0 ignored issues
show
Bug introduced by
The type Symfony\Component\Securi...assport\Badge\UserBadge was not found. Maybe you did not declare it correctly or list all dependencies?

The issue could also be caused by a filter entry in the build configuration. If the path has been excluded in your configuration, e.g. excluded_paths: ["lib/*"], you can move it to the dependency path list as follows:

filter:
    dependency_paths: ["lib/*"]

For further information see https://scrutinizer-ci.com/docs/tools/php/php-scrutinizer/#list-dependency-paths

Loading history...
16
use Symfony\Component\Security\Http\Authenticator\Passport\Credentials\CustomCredentials;
0 ignored issues
show
Bug introduced by
The type Symfony\Component\Securi...tials\CustomCredentials was not found. Maybe you did not declare it correctly or list all dependencies?

The issue could also be caused by a filter entry in the build configuration. If the path has been excluded in your configuration, e.g. excluded_paths: ["lib/*"], you can move it to the dependency path list as follows:

filter:
    dependency_paths: ["lib/*"]

For further information see https://scrutinizer-ci.com/docs/tools/php/php-scrutinizer/#list-dependency-paths

Loading history...
17
use Symfony\Component\Security\Http\Authenticator\Passport\Passport;
0 ignored issues
show
Bug introduced by
The type Symfony\Component\Securi...cator\Passport\Passport was not found. Maybe you did not declare it correctly or list all dependencies?

The issue could also be caused by a filter entry in the build configuration. If the path has been excluded in your configuration, e.g. excluded_paths: ["lib/*"], you can move it to the dependency path list as follows:

filter:
    dependency_paths: ["lib/*"]

For further information see https://scrutinizer-ci.com/docs/tools/php/php-scrutinizer/#list-dependency-paths

Loading history...
18
use Symfony\Component\Security\Http\EntryPoint\AuthenticationEntryPointInterface;
0 ignored issues
show
Bug introduced by
The type Symfony\Component\Securi...tionEntryPointInterface was not found. Maybe you did not declare it correctly or list all dependencies?

The issue could also be caused by a filter entry in the build configuration. If the path has been excluded in your configuration, e.g. excluded_paths: ["lib/*"], you can move it to the dependency path list as follows:

filter:
    dependency_paths: ["lib/*"]

For further information see https://scrutinizer-ci.com/docs/tools/php/php-scrutinizer/#list-dependency-paths

Loading history...
19
20
class TokenAuthenticator extends AbstractAuthenticator implements AuthenticationEntryPointInterface
21
{
22
    private $em;
23
24
    public function __construct(EntityManagerInterface $em)
25
    {
26
        $this->em = $em;
27
    }
28
29
    public function supports(Request $request): ?bool
30
    {
31
        $key = $this->getKey($request);
32
        return $key !== null && !empty(trim($key));
33
    }
34
35
    public function authenticate(Request $request): Passport
36
    {
37
        $apiToken = $this->getKey($request);
38
        if (null === $apiToken)
39
            throw new CustomUserMessageAuthenticationException('No API token provided');
40
41
        return new Passport(
42
            new UserBadge($apiToken, function ($apiToken) {
43
                $user = $this->em->getRepository(User::class)->findOneBy(['apiKey' => $apiToken]);
44
                if (null === $user)
45
                    throw new CustomUserMessageAuthenticationException('Invalid API token');
46
                return $user;
47
            }),
48
            new CustomCredentials(
49
                fn($credentials, $user) => true,
0 ignored issues
show
Unused Code introduced by
The parameter $credentials is not used and could be removed. ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-unused  annotation

49
                fn(/** @scrutinizer ignore-unused */ $credentials, $user) => true,

This check looks for parameters that have been defined for a function or method, but which are not used in the method body.

Loading history...
Unused Code introduced by
The parameter $user is not used and could be removed. ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-unused  annotation

49
                fn($credentials, /** @scrutinizer ignore-unused */ $user) => true,

This check looks for parameters that have been defined for a function or method, but which are not used in the method body.

Loading history...
50
                $apiToken
51
            )
52
        );
53
    }
54
55
    public function createToken(Passport $passport, string $firewallName): TokenInterface
56
    {
57
        $user = $passport->getUser();
58
        return new UsernamePasswordToken($user, $firewallName, $user->getRoles());
59
    }
60
61
    public function onAuthenticationSuccess(Request $request, TokenInterface $token, string $firewallName): ?Response
62
    {
63
        return null;
64
    }
65
66
    public function onAuthenticationFailure(Request $request, AuthenticationException $exception): ?Response
67
    {
68
        return new JsonResponse(['message' => 'Authentication failed'], Response::HTTP_UNAUTHORIZED);
69
    }
70
71
    public function start(Request $request, AuthenticationException $authException = null): Response
72
    {
73
        return new JsonResponse(['message' => 'Authentication required'], Response::HTTP_UNAUTHORIZED);
74
    }
75
76
    private function getKey(Request $request): ?string
77
    {
78
        return $request->headers->get('API-KEY') ?? $request->headers->get('API-TOKEN');
79
    }
80
}
81