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