VerifyApiToken::handle()   A
last analyzed

Complexity

Conditions 4
Paths 2

Size

Total Lines 12
Code Lines 7

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 0
CRAP Score 20

Importance

Changes 0
Metric Value
cc 4
eloc 7
nc 2
nop 2
dl 0
loc 12
ccs 0
cts 6
cp 0
crap 20
rs 9.2
c 0
b 0
f 0
1
<?php
2
3
namespace App\Support\Http\Middleware;
4
5
use App\Support\Helper;
6
use Closure;
7
use Illuminate\Auth\Access\AuthorizationException;
8
use Illuminate\Http\Request;
9
10
class VerifyApiToken
11
{
12
    /**
13
     * The URIs that should be excluded from API Token verification.
14
     *
15
     * @var array
16
     */
17
    protected $except = [];
18
19
    /**
20
     * Handle an incoming request.
21
     *
22
     * @param  \Illuminate\Http\Request  $request
23
     * @param  \Closure  $next
24
     * @return mixed
25
     *
26
     * @throws \Illuminate\Auth\Access\AuthorizationException
27
     */
28
    public function handle($request, Closure $next)
29
    {
30
        if (
31
            $this->isReading($request) ||
32
            $this->shouldPassThrough($request) ||
33
            $this->isValidToken($request)
34
        ) {
35
            return $next($request);
36
        }
37
38
        throw new AuthorizationException('API Token Mismatch');
39
    }
40
41
    /**
42
     * Determine if the HTTP request uses a ‘read’ verb.
43
     *
44
     * @param  \Illuminate\Http\Request  $request
45
     * @return bool
46
     */
47
    protected function isReading(Request $request)
48
    {
49
        return in_array($request->method(), ['HEAD', 'OPTIONS']);
50
    }
51
52
    /**
53
     * Determine if the request has a URI that should be passed through verification.
54
     *
55
     * @param  \Illuminate\Http\Request  $request
56
     * @return bool
57
     */
58
    protected function shouldPassThrough(Request $request)
59
    {
60
        foreach ($this->except as $except) {
61
            if ($except !== '/') {
62
                $except = trim($except, '/');
63
            }
64
65
            if ($request->is($except)) {
66
                return true;
67
            }
68
        }
69
70
        return false;
71
    }
72
73
    /**
74
     * Determine if the API token is valid.
75
     *
76
     * @param  \Illuminate\Http\Request  $request
77
     * @return bool
78
     */
79
    protected function isValidToken(Request $request)
80
    {
81
        $config = config('support.api.token');
82
83
        if ($token = substr($request->header('X-API-TOKEN'), 4)) {
84
            $timestamp = (int) substr(Helper::sampleDecrypt($token, $config['key']), 4);
85
86
            return abs($timestamp - time()) <= (int) $config['valid_interval'];
87
        }
88
89
        return false;
90
    }
91
}
92