我的第一个堆栈溢出问题-开始吧!
我已经编码了一个Firebase JWT令牌来验证我的PHP Slim API中的"买方"。它正确编码并在Postman中生成JWT令牌,
邮差JWT编码
但是当我尝试使用JWT承载身份验证访问我的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()函数:- - - -在买方。php类
public static function validateJWT($token)
{
return JWT::decode($token, self::JWT_KEY, array('HS256') );
}
我知道有一个JWT参数$kid存在于$payload, $key, $ algams之外,但我的印象是没有必要完成身份验证。我刚开始使用Slim, Tokens和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);
}
我查看了- - - - - vendorfirebasephp-jwtsrcJWT.php - - - -文件并注意到
if (empty($kid)) {
throw new UnexpectedValueException('"kid" empty, unable to lookup correct key');
}
如果我理解正确,这个值可以是字符串或null,显然我的是空的(0长度的字符串),如果它返回上述的expectedvalueexception()。
为什么会这样?我该如何改变这一点,使JWT中间件允许我访问分组路由?
提前感谢您的反馈和指导。
我遇到了同样的问题,但是在阅读github for firebase包时,我看到他们改变了解码过程。
现在您需要创建Key
类的实例,并在调用decode方法时使用它,如:
use FirebaseJWTJWT;
use FirebaseJWTKey;
$data = JWT::decode($token, new Key($topSecret, 'HS256'));
使用这种方式解决了我的问题,解码现在正在工作。该软件包的版本为6.2.0。检查是否使用该版本或更高版本。