JWT   A
last analyzed

Complexity

Total Complexity 10

Size/Duplication

Total Lines 41
Duplicated Lines 0 %

Test Coverage

Coverage 0%

Importance

Changes 1
Bugs 0 Features 0
Metric Value
eloc 17
dl 0
loc 41
ccs 0
cts 20
cp 0
rs 10
c 1
b 0
f 0
wmc 10

5 Methods

Rating   Name   Duplication   Size   Complexity  
A getToken() 0 6 2
A getExpire() 0 3 1
A removeToken() 0 3 1
A checkToken() 0 6 4
A init() 0 8 2
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