JWT (JSON Web Token) en PHP sin usar una biblioteca de terceros. ¿Cómo firmar?

Hay algunas bibliotecas para implementar JSON Web Tokens (JWT) en PHP, comophp-jwt. Estoy escribiendo mi propia clase, muy pequeña y simple, pero no puedo entender por qué mi firma falla la validaciónaquí a pesar de que he tratado de cumplir con el estándar. Lo he intentado durante horas y estoy atascado. ¡Por favor ayuda!

Mi código es simple

//build the headers
$headers = ['alg'=>'HS256','typ'=>'JWT'];
$headers_encoded = base64url_encode(json_encode($headers));

//build the payload
$payload = ['sub'=>'1234567890','name'=>'John Doe', 'admin'=>true];
$payload_encoded = base64url_encode(json_encode($payload));

//build the signature
$key = 'secret';
$signature = hash_hmac('SHA256',"$headers_encoded.$payload_encoded",$key);

//build and return the token
$token = "$headers_encoded.$payload_encoded.$signature";
echo $token;

losbase64url_encode función:

function base64url_encode($data) {
    return rtrim(strtr(base64_encode($data), '+/', '-_'), '=');
}

Mis encabezados y carga útil coinciden perfectamente consitio de validación JWT predeterminado, pero mi firma no coincide, por lo que mi token se marca como no válido. Este estándar parece realmente sencillo, ¿qué hay de malo en mi firma?

Respuestas a la pregunta(1)

Su respuesta a la pregunta