PHP Slim 解码 JWT 令牌

Posted

技术标签:

【中文标题】PHP Slim 解码 JWT 令牌【英文标题】:PHP Slim decoding JWT token 【发布时间】:2018-08-14 17:39:06 【问题描述】:

我是 php 新手,使用 jwt 授权令牌开发 RESTful 服务。我关注了this GitHub example 并且在一定程度上理解了代码,但我在这条线上遇到了错误$stmt->bindParam("user_id", $decoded->context->user->user_id);

注意:C:\xampp\htdocs\slim2\src\routes.php 中数组到字符串的转换上线。

请帮我解决这个问题,我不明白 context->user->user_id 是从哪里来的。完整代码如下

// The route to get a secured data.
$app->get('/restricted', function (Request $request, Response $response) 

$jwt = $request->getHeaders();

$key = "testsecretekey";

try 
    $decoded = JWT::decode($jwt['HTTP_AUTHORIZATION'][0], $key, array('HS256'));
 catch (UnexpectedValueException $e) 
    echo $e->getMessage();


if (isset($decoded)) 
    $sql = "SELECT * FROM tokens WHERE user_id = :user_id";

    try 
        $db = $this->db;
        $stmt = $db->prepare($sql);
        $stmt->bindParam("user_id", $decoded->context->user->user_id);
        $stmt->execute();
        $user_from_db = $stmt->fetchObject();
        $db = null;

        if (isset($user_from_db->user_id)) 
            echo json_encode([
                "response" => "This is your secure resource !"
            ]);
        
     catch (PDOException $e) 
        echo '"error":"text":' . $e->getMessage() . '';
    
  
);

【问题讨论】:

print_r($decoded); 给了什么? 另外,我假设您调用“POST”来生成 JWT 令牌,然后将其传递给“GET”,就像在 github.com/letsila/slim3-jwt-auth-example/blob/master/tests/… 的测试中一样。 您应该正确调试您的代码,因为给定的消息非常清楚您的问题 漂亮的Caddy server 内置了 jwt 令牌作为选项:caddyserver.com/docs/http.jwt 很容易设置 Reference - What does this error mean in PHP?的可能重复 【参考方案1】:

您只需将令牌发送到 JWT:decode。将您的代码更改为:

$jwt = str_replace('Bearer ', '', $jwt['HTTP_AUTHORIZATION'][0]);
$decoded = JWT::decode($jwt, $key, ['HS256']);

【讨论】:

以上是关于PHP Slim 解码 JWT 令牌的主要内容,如果未能解决你的问题,请参考以下文章

使用 slim-jwt-auth 生成令牌

PHP Slim 4 - 使用 firebase JWT 令牌授权 api 请求

PHP JWT:: **解码** 过期令牌

Angularjs 和 slim 框架 JWT 身份验证和令牌刷新流程

找不到 Slim jwt 令牌(由 axios 请求发送)

使用 php-jwt 库解码 firebase 自定义令牌时出现 openssl_verify() 错误