Completed
Push — master ( fae063...8d6c4f )
by yoshihiro
01:31
created

Authenticator::__construct()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 5

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 4
CRAP Score 1

Importance

Changes 0
Metric Value
dl 0
loc 5
c 0
b 0
f 0
ccs 4
cts 4
cp 1
rs 10
cc 1
nc 1
nop 2
crap 1
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 6
    public function __construct(Firebase $firebase, IDTokenExtractorResolver $resolver)
32
    {
33 6
        $this->firebase = $firebase;
34 6
        $this->resolver = $resolver;
35 6
    }
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 1
    public function getUser(Token $token): UserRecord
50
    {
51 1
        $uidClaim = $token->getClaim('sub');
52
53 1
        return $this->firebase->getAuth()->getUser($uidClaim);
54
    }
55
56 2
    public function onAuthenticationFailure(ResourceObject $caller, AuthenticationException $e): ResourceObject
57
    {
58 2
        if ($e instanceof IDTokenNotFound) {
59 1
            $caller->code = StatusCode::UNAUTHORIZED;
60 1
            $caller->headers[ResponseHeader::WWW_AUTHENTICATE] = sprintf(
61 1
                'Bearer realm="token_required",error="token_not_found",error_description="%s"',
62 1
                $e->getMessage()
63
            );
64
65 1
            return $caller;
66
        }
67
68 1
        if ($e instanceof InvalidToken) {
69 1
            $caller->code = StatusCode::UNAUTHORIZED;
70 1
            $caller->headers[ResponseHeader::WWW_AUTHENTICATE] = sprintf(
71 1
                'Bearer realm="token_required",error="invalid_token",error_description="%s"',
72 1
                $e->getMessage()
73
            );
74
75 1
            return $caller;
76
        }
77
78
        throw $e;
79
    }
80
}
81