我在node-jsonwebtoken中的auth服务器(Node.js)上生成一个令牌,该令牌将传递给API(PHP Laravel)并由tymondesigns/jwt-auth验证。
在Laravel服务器上,当我尝试验证node-jsonwebtoken生成的令牌时,我收到以下错误:
TokenInvalidException in NamshiAdapter.php line 71:
Token Signature could not be verified.
当我在jwt.io查看时,有效负载看起来相同。我甚至尝试通过传递由工作令牌生成的相同的iat,sub,iss,exp,nbf和jti在Node服务器上生成完全相同的令牌,但是tymondesigns / jwt-auth仍然不能接受它
还有其他可能导致此问题,但在解码信息中是否可见?我也不是100%肯定jti是如何工作的。也许有什么事情阻止了这个工作呢?
node-jsonwebtoken(7.1.9),tymon / jwt-auth(0.5.9),namshi / jose(5.0.2)
答案 0 :(得分:2)
val collection2 = collection.filter{case (key,v1,v2) => (v2 < 4) }
库的最后一个版本是7.0。
所有namshi/jose
算法都存在已知错误。
如果您无法使用该库验证签名,则可以尝试使用其他签名。 我开发了a library,它支持与JWT相关的RFC中描述的所有功能,包括加密支持。
答案 1 :(得分:1)
正如Spomky所提到的那样,原因是 namshi / jose 中与selected
声明有关的错误。它在iss
中解析,由 tymon / jwt-auth 7.0
使用。但是,由于目前还没有安装1.0.0-alpha.2的文档化方法,我们可能不得不等待稳定版本。
在此之前,由于问题和错误与1.0.0-alpha.2
声明有关,因此从iss
移除iss
要求并在没有它的情况下生成令牌会暂时解决问题。
答案 2 :(得分:0)
就我而言,我在有效负载中有一个URL。默认情况下,当编码为JSON时,PHP会转义斜线,而Node.js则不会。当然,当验证JWT在PHP中生成时(带有那些额外的反斜杠),最终的哈希将不匹配,因为有效负载只是不同。解决方案是在JWT库中转换为JSON时使用JSON_UNESCAPED_SLASHES标志,我使用的是https://github.com/namshi/jose,所以我创建了一个像这样的简单类:
use Namshi\JOSE\SimpleJWS;
class SimpleJWSWithEncodeOptions extends SimpleJWS
{
protected static $encodeOptions = 0;
public static function setEncodeOptions($options)
{
self::$encodeOptions = $options;
}
/**
* Generates the signed input for the current JWT.
*
* @return string
*/
public function generateSigninInput()
{
$base64payload = $this->encoder->encode(json_encode($this->getPayload(), self::$encodeOptions));
$base64header = $this->encoder->encode(json_encode($this->getHeader(), self::$encodeOptions));
return sprintf("%s.%s", $base64header, $base64payload);
}
}
那么它可以像这样使用:
SimpleJWSWithEncodeOptions::setEncodeOptions(JSON_UNESCAPED_SLASHES);
$jws = SimpleJWSWithEncodeOptions::load($token);
$jws->verify($key);
$data = $jws->getPayload();
此问题是我的有效载荷内容所特有的,但可以帮助某人