JWT::checkToken()   A
last analyzed

Complexity

Conditions 4
Paths 4

Size

Total Lines 6
Code Lines 4

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 0
CRAP Score 20

Importance

Changes 1
Bugs 0 Features 0
Metric Value
cc 4
eloc 4
nc 4
nop 2
dl 0
loc 6
ccs 0
cts 5
cp 0
crap 20
rs 10
c 1
b 0
f 0
1
<?php
2
3
namespace kalanis\kw_forms\Controls\Security\Csrf;
4
5
6
use ArrayAccess;
7
use kalanis\kw_forms\Interfaces\ICsrf;
8
use kalanis\kw_forms\JWT\Token;
9
10
11
/**
12
 * Class JWT
13
 * Secure forms by JWT token
14
 * @package kalanis\kw_forms\Controls\Security\Csrf
15
 * @codeCoverageIgnore dependent on remote library
16
 */
17
class JWT implements ICsrf
18
{
19
    protected string $sessionToken = '';
20
    protected int $expire = 3600;
21
    /** @var array<string, string> Token cache */
22
    protected array $tokens = [];
23
24
    public function init(ArrayAccess &$cookie, int $expire = 3600): void
25
    {
26
        if (empty($cookie['csrf_token'])) {
27
            $cookie['csrf_token'] = uniqid('csrf', true);
28
        }
29
30
        $this->sessionToken = strval($cookie['csrf_token']);
31
        $this->expire = $expire;
32
    }
33
34
    public function removeToken(string $codeName): void
35
    {
36
        unset($this->tokens[$codeName]);
37
    }
38
39
    public function getToken(string $codeName): string
40
    {
41
        if (!isset($this->tokens[$codeName])) {
42
            $this->tokens[$codeName] = Token::getJWTToken(['nam' => $codeName, 'ses' => $this->sessionToken], $this->expire);
43
        }
44
        return $this->tokens[$codeName];
45
    }
46
47
    public function getExpire(): int
48
    {
49
        return $this->expire;
50
    }
51
52
    public function checkToken(string $token, string $codeName): bool
53
    {
54
        $data = Token::decodeJWTToken($token);
55
        return isset($data['nam']) && isset($data['ses']) &&
56
            ($data['nam'] == $codeName) &&
57
            ($data['ses'] == $this->sessionToken);
58
    }
59
}
60