Solucionado (ver solução)
Solucionado
(ver solução)
3
respostas

Signature verification failed

Ola,

Fiz todo o processo de gerar o token, porem na hora de acessar a aplicação com o token eu recebo "Signature verification failed".

Baixei o codigo final do projeto para comparar minhas classes, AuthServiceProvider(), TokenController() e estavam a mesma coisa.

Vasculhando pelo codigo e fazendo testes, verifiquei que o erro ocorre na hora de dar o decode. Dentro do metodo decode, verifiquei que o JWT faz testa verificação:

// Check the signature
        if (!static::verify("$headb64.$bodyb64", $sig, $key, $header->alg)) {
            throw new SignatureInvalidException('Signature verification failed');
        }

Caso retorno FALSE, emite o throw. Dei um var_dump e realmente esta retornando false.

Acessei esse metodo verify() e o mesmo faz essa verificação:

private static function verify($msg, $signature, $key, $alg)
    {
        if (empty(static::$supported_algs[$alg])) {
            throw new DomainException('Algorithm not supported');
        }

        list($function, $algorithm) = static::$supported_algs[$alg];
        switch ($function) {
            case 'openssl':
                $success = \openssl_verify($msg, $signature, $key, $algorithm);
                if ($success === 1) {
                    return true;
                } elseif ($success === 0) {
                    return false;
                }
                // returns 1 on success, 0 on failure, -1 on error.
                throw new DomainException(
                    'OpenSSL error: ' . \openssl_error_string()
                );
            case 'hash_hmac':
            default:
                $hash = \hash_hmac($algorithm, $msg, $key, true);
                if (\function_exists('hash_equals')) {
                    return \hash_equals($signature, $hash);
                }
                $len = \min(static::safeStrlen($signature), static::safeStrlen($hash));

                $status = 0;
                for ($i = 0; $i < $len; $i++) {
                    $status |= (\ord($signature[$i]) ^ \ord($hash[$i]));
                }
                $status |= (static::safeStrlen($signature) ^ static::safeStrlen($hash));

                return ($status === 0);
        }
    }

Dei um var_dump da variable $args e o mesmo esta retornando 'hash_hmac'. No switch/case, o 'case 'hash_hmac' ' não faz nenhuma validação e simplesmente retorna false. Se eu colocar return true, ai da tudo certo e consigo acessar a aplicação.

Porem eu fiquei muito com essa duvida do porque esta retornando FALSE na hora de verificar a assinatura. Não era para o algoritmo ser 'hash_hmac' ? Se sim, porque esta retornando false ?

Detalhe: Eu baixei o projeto final, acessei a biblioteca JWT e no metodo verify() esta da mesma forma que o meu.

Segue codigo no github: https://github.com/guigranja/curso-lumen

3 respostas

Guilherme, clonei seu projeto aqui, configurei o .env e rodou sem erro, man. A chave JWT_KEY tá configurada direitinho no seu .env?

Seguindo a video aula, esta sendo feita da mesma maneira.

Segue meu arquivo .env:

APP_NAME=Lumen
APP_ENV=local
APP_KEY=
APP_DEBUG=true
APP_URL=http://localhost
APP_TIMEZONE=UTC

LOG_CHANNEL=stack
LOG_SLACK_WEBHOOK_URL=

DB_CONNECTION=mysql
DB_HOST=localhost
DB_PORT=3306
DB_DATABASE=cursolumen
DB_USERNAME=guilhermegranja
DB_PASSWORD="Guilherme8593#"

CACHE_DRIVER=file
QUEUE_CONNECTION=sync

JWT_KEY=Guilherme8593_8593
solução!

Vinicius,

Fui mexendo no codigo e fazendo alguns testes e deu certo agora.

Obrigado.