Issues (14)

src/JWT.php (8 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...
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...
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...
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