Completed
Push — master ( aa4cd3...2b0512 )
by yoshihiro
01:23
created

Authenticator   A

Complexity

Total Complexity 7

Size/Duplication

Total Lines 62
Duplicated Lines 0 %

Coupling/Cohesion

Components 2
Dependencies 9

Test Coverage

Coverage 37.04%

Importance

Changes 0
Metric Value
wmc 7
lcom 2
cbo 9
dl 0
loc 62
c 0
b 0
f 0
ccs 10
cts 27
cp 0.3704
rs 10

4 Methods

Rating   Name   Duplication   Size   Complexity  
A getUser() 0 6 1
A onAuthenticationFailure() 0 24 3
A __construct() 0 5 1
A getCredentials() 0 11 2
1
<?php
2
3
declare(strict_types=1);
4
5
namespace Piotzkhider\FirebaseAuthenticationModule\Guard;
6
7
use Aura\Web\Request;
8
use BEAR\Resource\ResourceObject;
9
use Koriym\HttpConstants\ResponseHeader;
10
use Koriym\HttpConstants\StatusCode;
11
use Kreait\Firebase;
12
use Kreait\Firebase\Auth\UserRecord;
13
use Lcobucci\JWT\Token;
14
use Piotzkhider\FirebaseAuthenticationModule\Exception\AuthenticationException;
15
use Piotzkhider\FirebaseAuthenticationModule\Exception\IDTokenNotFound;
16
use Piotzkhider\FirebaseAuthenticationModule\Exception\InvalidToken;
17
use Piotzkhider\FirebaseAuthenticationModule\IDTokenExtractor\IDTokenExtractorResolver;
18
19
class Authenticator implements AuthenticatorInterface
20
{
21
    /**
22
     * @var Firebase
23
     */
24
    protected $firebase;
25
26
    /**
27
     * @var IDTokenExtractorResolver
28
     */
29
    private $resolver;
30
31 3
    public function __construct(Firebase $firebase, IDTokenExtractorResolver $resolver)
32
    {
33 3
        $this->firebase = $firebase;
34 3
        $this->resolver = $resolver;
35 3
    }
36
37 2
    public function getCredentials(Request $request): Token
38
    {
39 2
        $extractor = $this->resolver->resolve($request);
40 2
        $idToken = $extractor->extract($request);
41
42
        try {
43 2
            return $this->firebase->getAuth()->verifyIdToken($idToken);
44 1
        } catch (\Firebase\Auth\Token\Exception\InvalidToken $e) {
45 1
            throw new InvalidToken($e->getMessage());
46
        }
47
    }
48
49
    public function getUser(Token $token): UserRecord
50
    {
51
        $uidClaim = $token->getClaim('sub');
52
53
        return $this->firebase->getAuth()->getUser($uidClaim);
54
    }
55
56
    public function onAuthenticationFailure(ResourceObject $caller, AuthenticationException $e): ResourceObject
57
    {
58
        if ($e instanceof IDTokenNotFound) {
59
            $caller->code = StatusCode::UNAUTHORIZED;
60
            $caller->headers[ResponseHeader::WWW_AUTHENTICATE] = sprintf(
61
                'Bearer realm="token_required",error="token_not_found",error_description="%s"',
62
                $e->getMessage()
63
            );
64
65
            return $caller;
66
        }
67
68
        if ($e instanceof InvalidToken) {
69
            $caller->code = StatusCode::UNAUTHORIZED;
70
            $caller->headers[ResponseHeader::WWW_AUTHENTICATE] = sprintf(
71
                'Bearer realm="token_required",error="invalid_token",error_description="%s"',
72
                $e->getMessage()
73
            );
74
75
            return $caller;
76
        }
77
78
        throw $e;
79
    }
80
}
81