猿问

PHP 中的自定义 JWT 一直说签名无效

我是新手,我正在尽力创建自己的 JWT 类。我认为我做的一切都是正确的,但是当我尝试将我的令牌粘贴到 jwt.io 中时,它一直说签名无效。我不禁觉得我要么错过了一些愚蠢的东西,要么有什么不对劲。


我的代码如下:


class Jwt

{

protected $header;


protected $payload;


protected $signature;


protected $secret;


protected $alg;


protected $jwt;


function __construct($header, $payload, $secret)

{

$this->SetHeader($header);

$this->alg = $header['alg'];

$this->SetPayload($payload);

$this->secret = $secret;

$this->SetSignature();

}


public function SetHeader($header){

$this->header = str_replace(["+", "/", "="],

['-', '_',""],

base64_encode(json_encode($header)));   

}


public function SetPayload($payload)

{

$this->payload = 

str_replace(["+", "/", "="],

['-',   '_',""],

base64_encode(json_encode($payload)));  

}


public function SetSignature()

{

$data = $this->header.".".$this->payload;

$this->alg = str_replace('HS', 'sha', $this->alg);

$hashedData = hash_hmac($this->alg, $data , $this->secret, true);

$this->signature = str_replace(

["+", "/", "="], ['-', '_', ""],   base64_encode($hashedData)

);

}


public function SetJwt()

{

$this->jwt = $this->header.'.'.$this->payload.'.'.$this->signature;

}


public function GetJwt()

{

return $this->jwt;

}

在我的 Index.php 中:


use root\lib\Jwt;

$myFavorites = 

['element' => 'Sun', 'animal' => 'Leopard','color'=>'Orange'];

$secret = bin2hex(random_bytes(32));


$jwt = new Jwt

(['alg' => 'HS256', 'typ' => 'JWT'], $myFavorites, $secret)

$jwt->SetJwt();


var_dump($jwt->GetJwt());

一切正常,调试器显示正确的输出,但不知何故它只是说无效的签名。


如果我在 jwt.io 网站上更改算法,它就可以工作。所以我猜它与签名或算法有关


我正在从 var_dump 的屏幕输出中复制它,这可能是原因吗?


新令牌是:eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJlbGVtZW50IjoiU3VuIiwiYW5pbWFsIjoiTGVvcGFyZCIsImNvbG91ciI6Im9yYW5nZSJ9.LF-4HNxgzhqYaIQKTImwO8A8SHIZfVYz2iGtQm7A


我什至尝试更改标头 HS256 或 HS384 中的算法,然后对函数内部的更改进行硬编码,没有区别


任何意见,将不胜感激


侃侃无极
浏览 341回答 1
1回答

Helenr

在您的代码中,您使用的是 HMAC 散列,它采用算法参数sha256或sha384. 这些算法名称与可在 JWT 中使用的算法名称不同。在RFC 7517 第 4.1.1 节 中,您可以阅读有关alg标头的信息:可以在 [JWA] 建立的 IANA“JSON Web 签名和加密算法”注册表中找到为此用途定义的“alg”值列表;此注册表的初始内容是 [JWA] 第 3.1 节中定义的值。根据HMAC ShaXXX 算法的RFC7518 第 3.1 节HSXXX,你有你使用,例如HS256或HS384JWT.io调试器或任何其他尝试验证 JWT 的软件会读取此标头,然后尝试使用算法。如果您使用非标准名称,验证软件将找不到正确的算法。关于使用JWT.io的注意事项:在将令牌粘贴到左列之前,不要忘记将秘密粘贴到Verify Signature调试器右列下的输入字段中。如果您忘记了密码,则无法验证令牌,如果您将密码粘贴在令牌之后,则左侧的签名可能会被重新计算和更改。
随时随地看视频慕课网APP
我要回答