使用 PHP 的 JWT“签名验证失败”
Posted
技术标签:
【中文标题】使用 PHP 的 JWT“签名验证失败”【英文标题】:JWT "Signature verification failed" with PHP 【发布时间】:2016-12-16 00:22:10 【问题描述】:我正在使用 Firebase/JWT 和 php。我正在尝试读取“已解码”php 文件中的令牌,但它显示签名验证失败,不确定为什么会发生这种情况。这就是我编码令牌的方式
<?php
use \Firebase\JWT\JWT;
require 'vendor/autoload.php';
require('config/Database.php');
$db = new Database;
$key = "helloworld";
//$jwt = JWT::encode($token, $key, 'HS512');
$post = file_get_contents("php://input");
$postdata = json_decode($post);
if($postdata)
$email = $postdata->email;
$password = $postdata->password;
$query = "SELECT * FROM users WHERE email = :email";
$db->query($query);
$db->bind(":email", $email);
$rows = $db->resultset();
if(password_verify($password, $rows[0]["hash"]))
$rows[0]["Success"] = "Success";
$token = array(
"rows" => $rows
);
$jwt = JWT::encode($token, $key, 'HS256');
header("auth: " . $jwt);
echo json_encode($jwt, 128);
else
echo "Failed";
?>
然后我正在解码这个文件中的令牌
<?php
use \Firebase\JWT\JWT;
require 'vendor/autoload.php';
require('config/Database.php');
$db = new Database;
$key = "helloworld";
//$jwt = JWT::encode($token, $key, 'HS512');
$post = file_get_contents("php://input");
$postdata = json_decode($post);
if($postdata)
$userData = $postdata->userdata;
// check if token is same stored in the database then decode
$jwt = JWT::decode($userData, $key, array('HS256'));
echo $jwt;
?>
失败,返回“签名验证失败”错误。 任何帮助表示赞赏。谢谢你。
【问题讨论】:
将代码作为文本而不是作为图片提供要好得多 什么是$postdata->userdata
,为什么要解码它?还有,你为什么json_encode
你的jwt
?
@zerkms $posdata->userdata 只是从前端获取令牌和用户信息,我对其进行解码以获取用户信息。现在不需要 Json_encode,但是在我发送更多数据之前,只需将 jwt 发送到我的角度,并且很容易以 json 格式读取。希望这能回答您的问题。
【参考方案1】:
它没有验证的问题是因为我在 jwt 上使用了 json_encode,这导致它再次被引号包裹,所以令牌看起来像这样 ""eY0lkajflajk...."" 并导致验证异常。谢谢@zerkms 提出这个问题。
【讨论】:
以上是关于使用 PHP 的 JWT“签名验证失败”的主要内容,如果未能解决你的问题,请参考以下文章
签名验证失败 - Apple 使用 Firebase JWT 登录