为什么 JWT::decode() 返回 { "status": "\"kid\" 空,无法查找正确的密钥" }

问题描述 投票:0回答:1

我的第一个 Stack Overflow 问题 - 就在这里!

我已经编码了一个 Firebase JWT 令牌来验证我的 PHP Slim API 中的“买家”。它正确编码并在 Postman 中生成 JWT 令牌,

Postman JWT encoding

但是当我尝试使用 JWT 进行承载身份验证来访问routes.php 文件中的一组受保护路由时,我收到:

{ "status": "\"kid\" empty, unable to lookup correct key" }

这是我的generateJWT()函数:-在Buyer.php类中。

public static function generateJWT($id) 
    {
        $buyer = $buyer =  self::findOrFail($id);
        if (!$buyer) {
            return false;
        }
        $key = self::JWT_KEY;
        $expiration = time() + self::JWT_EXPIRE;
        $issuer = 'Lab03_I425.com';
        $token = [
            'iss' => $issuer,
            'exp' => $expiration,
            'isa' => time(),
            'data' => [
                'uid' => $id,
                'name' => $buyer->username,
                'email' => $buyer->email] ];
        return JWT::encode (
            $token,
            $key,
            'HS256',
        );
    }

这是我的 validateJWT() 函数:- - - - 在 Buyer.php 类中

public static function validateJWT($token)
    {
        return JWT::decode($token, self::JWT_KEY,  array('HS256') );
    }

我知道有一个 JWT 参数 $kid 存在于 $payload、$key、$alg 参数之外,但我的印象是没有必要完成身份验证。我刚开始使用 Slim、令牌和 Web 服务,因此我们将不胜感激。

这是我的 BuyerController.php 中的 authJWT 方法,该方法在 paths.php 中调用:

public function authJWT(Request $request, Response $response)
    {
        $params = $request->getParsedBody();
        $username = $params['username'];
        $password = $params['user_password'];
        $authBuyer = Buyer::authenticateBuyer($username, $password);
        if ($authBuyer) {
            $status_code = 200;
            $jwt = Buyer::generateJWT($authBuyer->id);
            $results = [
                'status' => 'login successful',
                'jwt' => $jwt,
                'name' => $authBuyer->username
            ];
        } else {
            $status_code = 401;
            $results = [
                'status' => 'login failed',
            ];
        }
        //return $results;
        return $response->withJson($results, $status_code,
            JSON_PRETTY_PRINT);
    }

我查看了 - - - - - 供应商 irebase\php-jwt\src\JWT.php - - - - 文件并注意到

if (empty($kid)) {
    throw new UnexpectedValueException('"kid" empty, unable to lookup correct key');
}

如果我理解正确的话,这个值可以是字符串或null,显然我的值是空的(长度为0的字符串),如果它返回aboe UnexpectedValueException()。

这是为什么呢?我该如何更改此设置,以便我的 JWT 中间件允许我访问我的分组路由?

提前感谢您的反馈和指导。

php web-services jwt authorization slim
1个回答
68
投票

我遇到了同样的问题,但是阅读 github 的 firebase 包我发现他们改变了解码过程。

现在您需要创建

Key
类的实例,并在调用解码方法时使用它,例如:

use Firebase\JWT\JWT;
use Firebase\JWT\Key;

$data = JWT::decode($token, new Key($topSecret, 'HS256'));

使用这种方式解决了我的问题,并且解码现在可以工作了。该软件包的版本是6.2.0。检查您是否使用该版本或更高版本。

© www.soinside.com 2019 - 2024. All rights reserved.