Issues (14)

src/JWT.php (5 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);
0 ignored issues
show
It seems like getallheaders() can also be of type false; however, parameter $input of array_change_key_case() does only seem to accept array, maybe add an additional type check? ( Ignorable by Annotation )

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

63
        $allHeaders = array_change_key_case(/** @scrutinizer ignore-type */ getallheaders(), CASE_LOWER);
Loading history...
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
Are you sure the usage of CodeBlog\JWT\Helpers::throwError(401) targeting CodeBlog\JWT\Helpers::throwError() seems to always return null.

This check looks for function or method calls that always return null and whose return value is used.

class A
{
    function getObject()
    {
        return null;
    }

}

$a = new A();
if ($a->getObject()) {

The method getObject() can return nothing but null, so it makes no sense to use the return value.

The reason is most likely that a function or method is imcomplete or has been reduced for debug purposes.

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
Are you sure the usage of CodeBlog\JWT\Helpers::th...ror(401, 'Token error') targeting CodeBlog\JWT\Helpers::throwError() seems to always return null.

This check looks for function or method calls that always return null and whose return value is used.

class A
{
    function getObject()
    {
        return null;
    }

}

$a = new A();
if ($a->getObject()) {

The method getObject() can return nothing but null, so it makes no sense to use the return value.

The reason is most likely that a function or method is imcomplete or has been reduced for debug purposes.

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
Are you sure the usage of CodeBlog\JWT\Helpers::th...1, 'Token mal formado') targeting CodeBlog\JWT\Helpers::throwError() seems to always return null.

This check looks for function or method calls that always return null and whose return value is used.

class A
{
    function getObject()
    {
        return null;
    }

}

$a = new A();
if ($a->getObject()) {

The method getObject() can return nothing but null, so it makes no sense to use the return value.

The reason is most likely that a function or method is imcomplete or has been reduced for debug purposes.

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