Web Services 为什么JWT::decode()返回{“状态”:“\“kid\”为空,无法查找正确得密钥”}

jecbmhm3  于 2022-11-15  发布在  其他
关注(0)|答案(1)|浏览(517)

我的第一个堆栈溢出问题-开始了!
我在PHPSlim API中编码了一个Firebase JWT标记来验证“购买者”的身份,
Postman JWT encoding
但当我尝试使用JWTforBearerAuthentication访问routes.php文件中的一组受保护路由时,我收到:
{ "status": "\"kid\" empty, unable to lookup correct key" }
下面是我的generateJWT()函数:- 在Buyer.php类中。

{
        $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 params之外,但我的印象是它不需要完成身份验证。我是使用Slim,令牌和Web服务的新手,因此非常感谢您的帮助。
下面是我的BuyerController.php中的authJWT方法,它在routes.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);
    }

我查看了---- -vendor\firebase\php-jwt\src\JWT. php- - - - -文件,发现

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

如果我理解正确的话,这个值可以是一个字符串或空值,显然我的值是空的(一个长度为0的字符串),如果它返回上面的UnexpectedValueException()。
为什么会这样?我如何才能改变它,使我的JWT中间件允许我访问我的分组路由?
提前感谢您的反馈和指导。

ssm49v7z

ssm49v7z1#

我也遇到了同样的问题,但是在阅读Github for firebase包时,我看到他们改变了解码过程。
现在,您需要创建Key类的示例,并在调用decode方法时使用它,如下所示:

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

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

使用那种方式修复了我的问题,解码现在也开始工作了。软件包的版本是6. 2. 0。检查您是否正在使用该版本或更高版本。

相关问题