Qt C++ http服务器安全登录token生成管理

一、前言

搭建HTTP服务器后,部署在公网服务器上时需要保证一定的安全性,这里将介绍最基本的登录验证后如何生成限时token来验证后续的请求消息。在Qt中可以使用#include 来生成通用唯一识别码,可以以此来生成token。如果需要提升安全性,可以使用QCryptographicHash::hash()来进行二次处理。

二、头文件定义说明

头文件代码如下,这里只使用QUuid生成唯一识别码来作为token,其中TOKEN_TIMEOUT_SECONDS定了token的生效时长,lastActiveTime定义了token的激活时间,后续以此来判断token是否失效。

C++ 复制代码
#ifndef TOKENMANAGER_H
#define TOKENMANAGER_H

#include <QObject>
#include <QMap>
#include <QDateTime>
#include <QUuid>
#include <QMutex>

#define TOKEN_TIMEOUT_SECONDS (12 * 60 * 60) // 12小时

struct TokenInfo
{
    QString username;
    QDateTime lastActiveTime;
};

class TokenManager
{
public:
    static TokenManager& instance()
    {
        static TokenManager ins;
        return ins;
    }

    QString createToken(const QString& username);
    bool validateToken(const QString& token);
    void removeExpiredTokens();

private:
    TokenManager() {}
    QMap<QString, TokenInfo> m_tokenMap;
    QMutex m_mutex;
};

#endif

三、源文件的定义

代码如下,实现三个函数,createToken()创建token,validateToken()查看token是否正确,removeExpiredTokens()清理失效的token。

C++ 复制代码
#include "TokenManager.h"

QString TokenManager::createToken(const QString& username)
{
    QString token = QUuid::createUuid().toString().remove("{").remove("}");
    //如果需要提高安全性
//    QByteArray raw = QUuid::createUuid().toByteArray();
//    QString token = QCryptographicHash::hash(raw, QCryptographicHash::Sha256).toHex();

    TokenInfo info;
    info.username = username;
    info.lastActiveTime = QDateTime::currentDateTime();

    QMutexLocker locker(&m_mutex);
    m_tokenMap[token] = info;
    return token;
}

bool TokenManager::validateToken(const QString& token)
{
    //暂时废弃token
//    return true;

    QMutexLocker locker(&m_mutex);

    if (!m_tokenMap.contains(token))
        return false;

    TokenInfo &info = m_tokenMap[token];

    if (info.lastActiveTime.secsTo(QDateTime::currentDateTime()) > TOKEN_TIMEOUT_SECONDS)
    {
        m_tokenMap.remove(token);
        return false;
    }

    // 刷新活跃时间
    info.lastActiveTime = QDateTime::currentDateTime();
    return true;
}

void TokenManager::removeExpiredTokens()
{
    QMutexLocker locker(&m_mutex);
    QList<QString> keys = m_tokenMap.keys();
    for (const QString& key : keys){
        if (!validateToken(key)){
            m_tokenMap.remove(key);
        }
    }
}

四、补充说明

从上面的源码中可以看到没有调用removeExpiredTokens()来清理token,这是因为这里是测试,如果正式使用时可以使用定时器定时清理失效的token,代码如下,推荐1小时一次:

C++ 复制代码
QTimer* timer = new QTimer(this);
connect(timer, &QTimer::timeout, [](){
    TokenManager::instance().removeExpiredTokens();
});
timer->start(3600000);
相关推荐
夏沫的梦2 小时前
DeepSeek V4-Vllm部署:高效长上下文推理的实现
人工智能·后端
golang学习记2 小时前
Go 字符串优化:从“能跑就行”到“快到编译器都追不上我”
后端
云栖梦泽2 小时前
Linux内核与驱动:GPIO设备树与SPI设备树的区别
linux·运维·c++·嵌入式硬件
AskHarries2 小时前
我把域名卖了,顺手换了个新域名,然后站就没了
后端
南境十里·墨染春水2 小时前
C++笔记——STL list
c++·笔记·list
用户962377954482 小时前
原理分析 | Controller —— SpringBoot 内存马
javascript·后端
彷徨而立2 小时前
【C/C++】在头文件中定义全局变量的方法
c语言·开发语言·c++
渐儿2 小时前
PyTorch深度教程(一):快速入门与核心概念
后端
脱氧核糖核酸__2 小时前
LeetCode热题100——206.反转链表(迭代法)
c++·leetcode·链表