AuthHandler::__construct()   A
last analyzed

Complexity

Conditions 1
Paths 1

Size

Total Lines 11
Code Lines 9

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 6
CRAP Score 1
Metric Value
dl 0
loc 11
ccs 6
cts 6
cp 1
rs 9.4285
cc 1
eloc 9
nc 1
nop 4
crap 1
1
<?php
2
3
namespace Equip\Auth;
4
5
use Psr\Http\Message\ResponseInterface;
6
use Psr\Http\Message\ServerRequestInterface;
7
use Equip\Auth\AdapterInterface;
8
use Equip\Auth\Credentials\ExtractorInterface as CredentialsExtractor;
9
use Equip\Auth\Token\ExtractorInterface as TokenExtractor;
10
use Equip\Auth\Exception\UnauthorizedException;
11
12
class AuthHandler
13
{
14
    const TOKEN_ATTRIBUTE = 'spark/auth:token';
15
16
    /**
17
     * @var \Equip\Auth\Token\ExtractorInterface
18
     */
19
    protected $token;
20
21
    /**
22
     * @var \Equip\Auth\Credentials\ExtractorInterface
23
     */
24
    protected $credentials;
25
26
    /**
27
     * @var AdapterInterface
28
     */
29
    protected $adapter;
30
31
    /**
32
     * @var RequestFilterInterface
33
     */
34
    protected $filter;
35
36
    /**
37
     * @param \Equip\Auth\Token\ExtractorInterface $token
38
     * @param \Equip\Auth\Credentials\ExtractorInterface $credentials
39
     * @param AdapterInterface $adapter
40
     * @param RequestFilterInterface $filter
41
     */
42 9
    public function __construct(
43
        TokenExtractor $token,
44
        CredentialsExtractor $credentials,
45
        AdapterInterface $adapter,
46
        RequestFilterInterface $filter = null
47
    ) {
48 9
        $this->token = $token;
49 9
        $this->credentials = $credentials;
50 9
        $this->adapter = $adapter;
51 9
        $this->filter = $filter;
52 9
    }
53
54
    /**
55
     * @param ServerRequestInterface $request
56
     * @param ResponseInterface $response
57
     * @param callable $next
58
     * @return array
59
     */
60 9
    public function __invoke(
61
        ServerRequestInterface $request,
62
        ResponseInterface $response,
63
        callable $next
64
    ) {
65 9
        if ($this->shouldFilter($request)) {
66 8
            if ($token = $this->token->getToken($request)) {
67 3
                $authToken = $this->adapter->validateToken($token);
68 6
            } elseif ($credentials = $this->credentials->getCredentials($request)) {
69 4
                $authToken = $this->adapter->validateCredentials($credentials);
70 2
            } else {
71 1
                throw UnauthorizedException::noToken();
72
            }
73
74 3
            $request = $this->handleToken($request, $authToken);
75 3
        }
76
77 4
        return $next($request, $response);
78
    }
79
80
    /**
81
     * Handle the Token and put it in the request
82
     *
83
     * @param ServerRequestInterface $request
84
     * @param Token $token
85
     * @return ServerRequestInterface
86
     */
87 3
    protected function handleToken(ServerRequestInterface $request, Token $token)
88
    {
89 3
        return $request->withAttribute(static::TOKEN_ATTRIBUTE, $token);
90
    }
91
92
    /**
93
     * @param ServerRequestInterface $request
94
     * @return boolean
95
     */
96 9
    protected function shouldFilter(ServerRequestInterface $request)
97
    {
98 9
        if (!$this->filter) {
99 7
            return true;
100
        }
101 2
        return call_user_func($this->filter, $request);
102
    }
103
}
104