Passed
Push — master ( 453dcc...4a33b4 )
by Luiz Kim
23:06 queued 20:54
created

TokenAuthenticator   A

Complexity

Total Complexity 10

Size/Duplication

Total Lines 65
Duplicated Lines 0 %

Importance

Changes 3
Bugs 0 Features 0
Metric Value
wmc 10
eloc 23
c 3
b 0
f 0
dl 0
loc 65
rs 10

9 Methods

Rating   Name   Duplication   Size   Complexity  
A authenticate() 0 16 2
A __construct() 0 3 1
A supports() 0 3 1
A createAuthenticatedToken() 0 4 1
A getKey() 0 3 1
A onAuthenticationFailure() 0 4 1
A start() 0 4 1
A onAuthenticationSuccess() 0 3 1
A createToken() 0 3 1
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\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...
12
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...
13
use Symfony\Component\Security\Core\User\UserInterface;
0 ignored issues
show
Bug introduced by
The type Symfony\Component\Security\Core\User\UserInterface 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\Core\User\UserProviderInterface;
0 ignored issues
show
Bug introduced by
The type Symfony\Component\Securi...r\UserProviderInterface 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\AuthenticatorInterface;
0 ignored issues
show
Bug introduced by
The type Symfony\Component\Securi...\AuthenticatorInterface 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\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...
17
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...
18
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...
19
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...
20
use Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorageInterface;
0 ignored issues
show
Bug introduced by
The type Symfony\Component\Securi...e\TokenStorageInterface 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...
21
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...
22
23
class TokenAuthenticator implements AuthenticatorInterface, AuthenticationEntryPointInterface
24
{
25
    private TokenStorageInterface $tokenStorage;
26
27
    public function __construct(private EntityManagerInterface $em, TokenStorageInterface $tokenStorage)
28
    {
29
        $this->tokenStorage = $tokenStorage;
30
    }
31
32
    public function supports(Request $request): ?bool
33
    {
34
        return $this->getKey($request) !== null;
35
    }
36
37
    public function authenticate(Request $request): Passport
38
    {
39
        $apiToken = $this->getKey($request);
40
        if (null === $apiToken) {
41
            throw new CustomUserMessageAuthenticationException('No API token provided');
42
        }
43
44
        return new Passport(
45
            new UserBadge($apiToken, function ($apiToken) {
46
                return $this->em->getRepository(User::class)->findOneBy(['apiKey' => $apiToken]);
47
            }),
48
            new CustomCredentials(
49
                function ($credentials, UserInterface $user) {
0 ignored issues
show
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
                function ($credentials, /** @scrutinizer ignore-unused */ UserInterface $user) {

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 $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
                function (/** @scrutinizer ignore-unused */ $credentials, UserInterface $user) {

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
                    return true;
51
                },
52
                $apiToken
53
            )
54
        );
55
    }
56
57
    public function createAuthenticatedToken(Passport $passport, string $firewallName): ?TokenInterface
58
    {
59
        $user = $passport->getUser();
60
        return new UsernamePasswordToken($user, $firewallName, $user->getRoles());
61
    }
62
63
    public function createToken(Passport $passport, string $firewallName): TokenInterface
64
    {
65
        return $this->createAuthenticatedToken($passport, $firewallName);
0 ignored issues
show
Bug Best Practice introduced by
The expression return $this->createAuth...assport, $firewallName) could return the type null which is incompatible with the type-hinted return Symfony\Component\Securi...on\Token\TokenInterface. Consider adding an additional type-check to rule them out.
Loading history...
66
    }
67
68
    public function onAuthenticationSuccess(Request $request, TokenInterface $token, string $firewallName): ?Response
69
    {
70
        return null;
71
    }
72
73
    public function onAuthenticationFailure(Request $request, AuthenticationException $exception): ?Response
74
    {
75
        $data = ['message' => strtr($exception->getMessageKey(), $exception->getMessageData())];
76
        return new JsonResponse($data, Response::HTTP_UNAUTHORIZED);
77
    }
78
79
    public function start(Request $request, AuthenticationException $authException = null): Response
80
    {
81
        $data = ['message' => 'Authentication Required'];
82
        return new JsonResponse($data, Response::HTTP_UNAUTHORIZED);
83
    }
84
85
    private function getKey(Request $request)
86
    {
87
        return $request->headers->get('Authorization') ?? $request->headers->get('API-TOKEN') ?? $request->headers->get('API-KEY');
88
    }
89
}