Dwa*_*317 25 php authorization web-services slim jwt
我的第一个堆栈溢出问题 - 就在这里!
我已经编码了一个 Firebase JWT 令牌来验证我的 PHP Slim API 中的“买家”。它正确编码并在 Postman 中生成 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',
);
}
Run Code Online (Sandbox Code Playgroud)
这是我的 validateJWT() 函数: - - - - 在 Buyer.php 类中
public static function validateJWT($token)
{
return JWT::decode($token, self::JWT_KEY, array('HS256') );
}
Run Code Online (Sandbox Code Playgroud)
我知道有一个 JWT 参数 $kid 存在于 $payload、$key、$alg 参数之外,但我的印象是没有必要完成身份验证。我是使用 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);
}
Run Code Online (Sandbox Code Playgroud)
我查看了 - - - - -vendor\firebase\php-jwt\src\JWT.php - - - - 文件并注意到
if (empty($kid)) {
throw new UnexpectedValueException('"kid" empty, unable to lookup correct key');
}
Run Code Online (Sandbox Code Playgroud)
如果我理解正确的话,这个值可以是字符串或 null,如果它返回 aboe UnexpectedValueException(),显然我的值是空的(长度为 0 的字符串)。
为什么是这样?我该如何更改此设置,以便我的 JWT 中间件允许我访问我的分组路由?
预先感谢您的反馈和指导。
小智 66
我遇到了同样的问题,但是阅读 github for firebase包我发现他们改变了解码过程。
现在您需要创建该类的实例Key
,并在调用解码方法时使用它,例如:
use Firebase\JWT\JWT;
use Firebase\JWT\Key;
$data = JWT::decode($token, new Key($topSecret, 'HS256'));
Run Code Online (Sandbox Code Playgroud)
使用这种方式解决了我的问题,并且解码现在可以工作了。该软件包的版本是6.2.0。检查您是否使用该版本或更高版本。
归档时间: |
|
查看次数: |
18651 次 |
最近记录: |