验证Laravel中Node生成的JWT

时间:2016-08-23 13:46:30

标签: node.js laravel jwt

我在node-jsonwebtoken中的auth服务器(Node.js)上生成一个令牌,该令牌将传递给API(PHP Laravel)并由tymondesigns/jwt-auth验证。

  • 由tymondesigns / jwt-auth生成的令牌将成功验证 它自己的验证函数,node-jsonwebtoken和jwt.io
  • node-jsonwebtoken生成的令牌将由其自己的验证函数jwt.io成功验证,但不会通过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)

3 个答案:

答案 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();

此问题是我的有效载荷内容所特有的,但可以帮助某人