使用 JWT 创建令牌时出错
Posted
技术标签:
【中文标题】使用 JWT 创建令牌时出错【英文标题】:Error when creating token with JWT 【发布时间】:2018-10-29 11:31:46 【问题描述】:我正在构建 API,但在使用 JWT 创建令牌时出现未捕获错误,当我运行 post man 调用时,我进入错误日志堆栈跟踪:
#0 [internal function]: Api->generateToken()
#1 /home/osconliz/public_html/Osconlizapicall/rest.php(42): ReflectionMethod->invoke(Object(Api))
#2 /home/osconliz/public_html/Osconlizapicall/index.php(4): Rest->processApi()
#3 main
thrown in /home/osconliz/public_html/Osconlizapicall/api.php on line 36
[19-May-2018 02:04:47 UTC] PHP Fatal error: Uncaught Error: Class 'JWT' not found in /home/osconliz/public_html/Osconlizapicall/api.php:36
Stack trace:
#0 [internal function]: Api->generateToken()
#1 /home/osconliz/public_html/Osconlizapicall/rest.php(42): ReflectionMethod->invoke(Object(Api))
#2 /home/osconliz/public_html/Osconlizapicall/index.php(4): Rest->processApi()
#3 main
但是当我在我的 PHP 服务器上检查我的 jwt 文件时,它里面有 JWT 类。
**jwt.php**
带有类 jwt 屏幕截图的页面
然后是我用来创建令牌的页面**api.php**
//SECRETE_KEY是为JWT创建pass的常量
<?php
class Api extends Rest
public $dbConn;
public function __construct()
parent::__construct();
$db = new DbConnect;
$this->dbConn = $db->connect();
public function generateToken()
$client_id_key = $this->validateParameter('client_id_key', $this->param['client_id_key'], STRING);
//$client_secret_key = $this->validateParameter('client_secret_key', $this->param['client_secret_key'], STRING);
//client_secret_key should be commented out it is not used for validation for security purposes, only id key
$stmt = $this->dbConn->prepare("SELECT * FROM `api_clients_properties` WHERE client_id = :client_id_key");
$stmt->bindParam(":client_id_key", $client_id_key);
$stmt->execute();
$user = $stmt->fetch(PDO::FETCH_ASSOC);
if (!is_array($user))
$this->returnResponse(API_NAME_REQUIRED, "Invalid Client Id Key");
if ($user['property_status'] == "not verified")
$this->returnResponse(API_NAME_REQUIRED, "Property not verified, please contact admin, to verify it");
$payload = [
'iat' => time(),
'iss' => 'localhost',
'exp' => time() + (60),
'userId' => $user['id']
];
$token = JWT::encode($payload, SECRETE_KEY);
echo $token;
?>
【问题讨论】:
【参考方案1】:JWT
类位于命名空间Firebase\JWT
中,因此您需要use
它:
use \Firebase\Jwt\Jwt;
Jwt::encode(...);
或者在调用时使用其完整的命名空间:
\Firebase\Jwt\Jwt::encode();
【讨论】:
谢谢,但没有解决问题,我把答案贴在下面。【参考方案2】:如果您从 GitHub 复制文件而不是使用 Composer 安装它,则需要注释掉文件顶部的命名空间行。因此,从我在jwt.php
屏幕截图第一行顶部的快照中,您将注释掉//namespace Firebase\JWT;
,您将不会再次收到500 内部服务器错误。
【讨论】:
不要这样做,这可能会导致命名冲突并破坏其他内容。您只需要使用适当的自动加载器。 (或requice_once()
正确的源文件。)
嗨!我面临同样的问题,但在评论时无法解决,也使用自动 spl_autoload_register
但无法解决。以上是关于使用 JWT 创建令牌时出错的主要内容,如果未能解决你的问题,请参考以下文章
使用密钥大小小于2048的RSA安全密钥创建JWT令牌时出错
使用 JWT 时出错,还想将 JWT 令牌发送到其他 API