注销方法不会从数据库中删除令牌

Posted

技术标签:

【中文标题】注销方法不会从数据库中删除令牌【英文标题】:logout method doesnt delete token from db 【发布时间】:2018-06-08 03:38:15 【问题描述】:

我创建了包含 3 个部分的注销算法。

    第一层是我从邮递员调用的端点,将从前端调用。 其次是 User 类中的方法,它实际上做了所有的事情。 第三个是 Token 类,我在 User 类中使用它来检查令牌是否仍然相同并对其进行解码以收集在令牌中编码的用户 ID。

我的端点代码是:

<?php

    ini_set('display_errors', 1);
    ini_set('display_startup_errors', 1);
    error_reporting(E_ALL);
    // LOGOUT DOESN't WORK and it still dont give me any errors

    // required headers
    header("Access-Control-Allow-Origin: *");
    header("Content-Type: application/json");

    // include needed files
    include_once '../config/database.php';
    include_once '../classes/user.php';
    include_once '../classes/token.php';

    // instantiate database and product object
    $database = new Database();
    $db = $database->getConnection();

    // initialize object
    $user = new user($db);
    $token = new token($db);

    $cleanToken = '';

    if(function_exists('apache_request_headers'))
    
        $headers = apache_request_headers();
        $cleanToken = $token->cutToken($headers);
    
    else
    
        http_response_code(500);
        die();
    

    if(isset($cleanToken) && !empty($cleanToken))
    
        if($user->logout($cleanToken))
        
            http_response_code(200);
        
        else
        
            http_response_code(401);
        
    
    else
    
        http_response_code(400);
    

有趣的是,当我从邮递员那里调用它时,它返回的状态为 200,所以看起来一切正常,但实际上并没有。

现在User类中注销功能的代码是:

public function logout($receivedToken)

    include '../config/database.php';
    include '../classes/token.php';

    // instantiate database
    $database = new Database();
    $db = $database->getConnection();

    $token = new token($db);
    if($token->checkToken($receivedToken))
    
        $userId = $token->getUserId($receivedToken);
        $query = "
            DELETE
              token
            FROM  
              " . $this->table_name . "
            WHERE
              id = ?
        ";

        try
        
            // prepare query statement
            $stmt = $this->conn->prepare($query);

            //bind values from user
            $stmt->bindParam(1, $userId);

            $return = $stmt->execute();

            if($return === true)
            
                return true;
            
            else
            
                return false;
            
        
        catch(PDOException $exception)
        
            echo "error: " . $exception->getMessage();
        
    
    else
    
        return false;
    

它返回 true,因为就像我说的那样,我在邮递员中得到了 200,但它不会从数据库中删除令牌。为什么?它不会打印出任何额外的错误信息或任何东西。

如果您需要任何其他信息或代码,请告诉我。

编辑

我更改了端点代码,我添加了 3 行应该将 show error 设置为 true。 我更改了注销功能的代码,我添加了 try..catch 以显示一些错误。

通过邮递员拨打电话后仍然没有任何错误:

【问题讨论】:

当您将连接声明为$db = $database-&gt;getConnection(); 时,为什么还要使用$this-&gt;conn?有什么我没有得到的吗? 使用 php 的错误报告和 pdo 的错误处理。 这是我的数据库配置文件gist.github.com/anonymous/5bd2589d07dd33ae755f55649e532477 Funk Forty Niner pdo 处理应该是什么样子? 为什么有人反对这个问题?如果我没有提供一些细节,请告诉我。 【参考方案1】:

这里的解决方案非常简单,我很惊讶没有人能帮我解决这个问题,我对自己在这方面花费了太多时间感到不安。

所以我想从令牌列中删除令牌,但我为此使用了错误的 sql 操作。 DELETE 用于删除整个记录,而不仅仅是一个值。我应该改用UPDATE

【讨论】:

以上是关于注销方法不会从数据库中删除令牌的主要内容,如果未能解决你的问题,请参考以下文章

Sanctum Laravel 8 用于 API 身份验证的问题(不会在注销时删除令牌)

使用 JWT 管理多个设备节点 js 的用户会话

Nuxt Auth 如何从数据库中删除刷新令牌?

用户注销 React Native 应用程序时如何删除 Firebase 云消息传递令牌?

在 Lumen 5.4 中注销后 JWT Auth 令牌不会失效

使用 JWT 令牌使用 AdonisJS 注销