Issues (14)

src/JWT.php (4 issues)

1
<?php
2
3
namespace CodeBlog\JWT;
4
5
use CodeBlog\JWT\Helpers;
6
7
/**
8
 * Class CodeBlog JWT
9
 *
10
 * @author Whallysson Avelino <https://github.com/whallysson>
11
 * @package CodeBlog\JWT
12
 */
13
14
class JWT extends JWTAuth
15
{
16
17
    // Converte e assina um objeto ou matriz PHP em uma cadeia JWT.
18
    /**
19
     * @param array $payload
20
     * @param string $secret
21
     * @param string $hash
22
     *
23
     * @return string
24
     */
25
    public function encode(array $payload, string $secret, string $hash = 'HS256'): string
26
    {
27
        $header = array('typ' => 'JWT', 'alg' => $hash);
28
29
        $sing_header = Helpers::encode(json_encode($header));
30
        $sing_payload = Helpers::encode(json_encode($payload));
31
32
        $signature = $this->signature($sing_header, $sing_payload, $secret, $hash);
33
34
        return "{$sing_header}.{$sing_payload}.{$signature}";
35
    }
36
37
    // Decodifica uma string JWT em um objeto PHP.
38
39
    /**
40
     * @param string $jwt
41
     * @param string $secret
42
     *
43
     * @return null|\stdClass
44
     */
45
    public function decode(string $jwt, string $secret): ?\stdClass
46
    {
47
        if (empty($secret)) {
48
            Helpers::throwError(401, 'A Key não pode ser vazia');
49
        }
50
51
        if (self::validate($jwt, $secret)) {
0 ignored issues
show
Bug Best Practice introduced by
The method CodeBlog\JWT\JWT::validate() is not static, but was called statically. ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-call  annotation

51
        if (self::/** @scrutinizer ignore-call */ validate($jwt, $secret)) {
Loading history...
52
            return $this->getPayloadDecodeJson();
53
        }
54
55
        return null;
56
    }
57
58
    /**
59
     * @return string
60
     */
61
    public function authHeader(): string
62
    {
63
        $allHeaders = array_change_key_case(getallheaders(), CASE_LOWER);
64
        $authorization = !empty($allHeaders['authorization']) ? $allHeaders['authorization'] : null;
65
66
        // Verifica se o Token foi informado
67
        if (empty($authorization)) {
68
            return Helpers::throwError(401);
0 ignored issues
show
Bug Best Practice introduced by
The expression return CodeBlog\JWT\Helpers::throwError(401) returns the type void which is incompatible with the type-hinted return string.
Loading history...
69
        }
70
71
        $parts = explode(' ', $authorization);
72
73
        // Verifica o formato do Token
74
        if (count($parts) !== 2) {
75
            return Helpers::throwError(401, 'Token error');
0 ignored issues
show
Bug Best Practice introduced by
The expression return CodeBlog\JWT\Help...ror(401, 'Token error') returns the type void which is incompatible with the type-hinted return string.
Loading history...
76
        }
77
78
        list($scheme, $token) = $parts;
79
80
        // Verifica se existe a palavra "Bearer" no Token
81
        if (!preg_match('/^Bearer$/i', $scheme)) {
82
            return Helpers::throwError(401, 'Token mal formado');
0 ignored issues
show
Bug Best Practice introduced by
The expression return CodeBlog\JWT\Help...1, 'Token mal formado') returns the type void which is incompatible with the type-hinted return string.
Loading history...
83
        }
84
85
        return $token;
86
    }
87
88
    /**
89
     * Validate a JSON Web Token's expiration and signature
90
     *
91
     * @param string $token
92
     * @param string $secret
93
     *
94
     * @return bool
95
     */
96
    public function validate(string $token, string $secret): bool
97
    {
98
        return $this->splitToken($token)
99
            ->validateHeader()
100
            ->validatePayload()
101
            ->validateExpiration()
102
            ->validateSignature($secret);
103
    }
104
105
}
106