c++游戏服务器开发

简介: c++游戏服务器开发

本篇文章我们来介绍C++高性能服务器的开发

1.用户认证和鉴权

JWT认证

1.前后端token的认证流程:

前端发送登陆请求 – > 后端登陆接口接受 -->后端数据处理后返给前端token –> 前端将token存储后 -->每次请求都带着这问 —>后端设置jwto截器 -->只放ken拦行登陆接口 -->如果前端访问别的接口必须带有token –> 否则被拦个token去访截器拦截 并让前端回复到登陆页面

2、Token的处理方式:

JWT的token当服务端返回以后,是需要客户端进行主动地动作的,并不是像cookie一样,在后边的请求,都会自动带过去。这样就导致了如下几种做法:

将Jwt的token作为cookie返回给客户端。这样后续的请求都会带着这个token过来。这样在拦截的时候,就可以使用了。

将Jwt的token作为返回字符串,先返回给前端,前端再后续请求时,写到anthorization的request的head中,这个做法需要 编程去做,而且通用的做法,都是在ajax当中去做。构造请求。

将Jwt的token作为返回字符串,先返回给前端,前端再后续请求时,将Jwt的token写到token的request的head中,这个做法,也是编程实现,只不过具体做法,也是通过ajax进行。构造请求。只不过是自定义的head。

其实jwt的token也可以作为URL的参数进行传递的,这也是一个方法。

另外,jwt返回给前端的token,一般的做法都是放到localStorage当中,也就是前端浏览器的存储空间当中。可以将token存储在 localstorage里面,需要防止xss攻击

3、例子:

在登陆请求成功后把后端返回数据存储到浏览器

定义request.js 统一处理发送的请求为其加上token ,统一处理响应 若包含统一返回类code为 token未验证成功code 401 则让用户到登陆页面重新登陆

注意:客户端必须主动操作jwt返回的token,这个就不是自动的过程了。

JWT的方案 1、用户去认证中心登录,认证中心生成JWT,返回给客户端。

2、客户端带着jwt,请求其他的多个系统。

3、其他的系统,自己解析jwt,如果能解析,就说明登录成功,就可以继续业务。

通常,这个方案会将用户名等信息放到jwt当中,这样就不用认证中心校验了。

看一下代码示例:

#include <iostream>
#include <sstream>
#include <vector>
#include <algorithm>
#include <openssl/hmac.h>
std::string base64_encode(const std::string& input) {
    const std::string charset = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
    std::stringstream result;
    
    size_t i = 0;
    while (i < input.length()) {
        uint32_t octet_a = i < input.length() ? static_cast<uint8_t>(input[i++]) : 0;
        uint32_t octet_b = i < input.length() ? static_cast<uint8_t>(input[i++]) : 0;
        uint32_t octet_c = i < input.length() ? static_cast<uint8_t>(input[i++]) : 0;
        uint32_t triple = (octet_a << 16) + (octet_b << 8) + octet_c;
        result << charset[(triple >> 18) & 63]
               << charset[(triple >> 12) & 63]
               << charset[(triple >> 6) & 63]
               << charset[triple & 63];
    }
    size_t padding_length = input.length() % 3 == 1 ? 2 : (input.length() % 3 == 2 ? 1 : 0);
    
    for (size_t i = 0; i < padding_length; ++i)
        result.seekp(-1, std::ios_base::end) << '=';
    return result.str();
}
std::string jwt_encode(const std::string& header, const std::string& payload, const std::string& secret_key) {
    std::stringstream encoded_token;
    
    // Encode header
    std::string encoded_header = base64_encode(header);
    encoded_token << encoded_header << '.';
    // Encode payload
    std::string encoded_payload = base64_encode(payload);
    encoded_token << encoded_payload;
    // Sign token with secret key using HMAC-SHA256 algorithm
    unsigned char hmac_result[EVP_MAX_MD_SIZE];
    unsigned int hmac_length;
    
    HMAC(EVP_sha256(), secret_key.c_str(), secret_key.length(), reinterpret_cast<const unsigned char*>(encoded_token.str().c_str()), encoded_token.str().length(), hmac_result, &hmac_length);
    // Append signature to the token
    std::string signature(hmac_result, hmac_result + (hmac_length > 32 ? 32 : hmac_length));
    
    return encoded_token.str() + '.' + base64_encode(signature);
}
int main() {
    std::string header = R"({"alg":"HS256","typ":"JWT"})";
    std::string payload = R"({"sub":"1234567890","name":"John Doe","iat":1516239022})";
    std::string secret_key = "your_secret_key_here";
    std::string jwt_token = jwt_encode(header, payload, secret_key);
    
    std::cout << "Generated JWT: " << jwt_token << std::endl;
    return 0;
}

在实际开发中 需要使用适当的JWT库来处理JWT生成和验证的复杂性。

好了 本篇文章就到这里 在这里我想向大家推荐一个课程:

https://xxetb.xetslk.com/s/2PjJ3T

相关文章
WK
|
17天前
|
机器学习/深度学习 人工智能 算法
那C++适合开发哪些项目
C++ 是一种功能强大、应用广泛的编程语言,适合开发多种类型的项目。它在游戏开发、操作系统、嵌入式系统、科学计算、金融、图形图像处理、数据库管理、网络通信、人工智能、虚拟现实、航空航天等领域都有广泛应用。C++ 以其高性能、内存管理和跨平台兼容性等优势,成为众多开发者的选择。
WK
38 1
|
19天前
|
关系型数据库 API 数据库
后端开发的艺术:从零到一构建高效服务器
在数字化时代,后端开发是支撑现代互联网应用的基石。本文旨在探讨后端开发的核心概念、关键技术以及如何构建一个高效的服务器。我们将从基础的编程语言选择开始,逐步深入到数据库设计、API开发和性能优化等关键领域。通过实际案例分析,我们将揭示后端开发的复杂性和挑战性,同时提供实用的解决方案和最佳实践。无论你是初学者还是有经验的开发者,这篇文章都将为你提供宝贵的见解和启发。
|
1月前
|
网络安全 Docker 容器
VScode远程服务器之远程 远程容器 进行开发(五)
VScode远程服务器之远程 远程容器 进行开发(五)
27 1
|
1月前
|
Rust 资源调度 安全
为什么使用 Rust over C++ 进行 IoT 解决方案开发
为什么使用 Rust over C++ 进行 IoT 解决方案开发
68 7
WK
|
16天前
|
开发框架 移动开发 Java
C++和Java哪个更适合开发移动应用
本文对比了C++和Java在移动应用开发中的优劣,从市场需求、学习难度、开发效率、跨平台性和应用领域等方面进行了详细分析。Java在Android开发中占据优势,而C++则适合对性能要求较高的场景。选择应根据具体需求和个人偏好综合考虑。
WK
31 0
WK
|
17天前
|
安全 Java 编译器
C++和Java哪个更适合开发web网站
在Web开发领域,C++和Java各具优势。C++以其高性能、低级控制和跨平台性著称,适用于需要高吞吐量和低延迟的场景,如实时交易系统和在线游戏服务器。Java则凭借其跨平台性、丰富的生态系统和强大的安全性,广泛应用于企业级Web开发,如企业管理系统和电子商务平台。选择时需根据项目需求和技术储备综合考虑。
WK
23 0
|
1月前
|
Java PHP
PHP作为广受青睐的服务器端脚本语言,在Web开发中占据重要地位。理解其垃圾回收机制有助于开发高效稳定的PHP应用。
【10月更文挑战第1天】PHP作为广受青睐的服务器端脚本语言,在Web开发中占据重要地位。其垃圾回收机制包括引用计数与循环垃圾回收,对提升应用性能和稳定性至关重要。本文通过具体案例分析,详细探讨PHP垃圾回收机制的工作原理,特别是如何解决循环引用问题。在PHP 8中,垃圾回收机制得到进一步优化,提高了效率和准确性。理解这些机制有助于开发高效稳定的PHP应用。
44 3
|
1月前
|
Linux C语言 C++
vsCode远程执行c和c++代码并操控linux服务器完整教程
这篇文章提供了一个完整的教程,介绍如何在Visual Studio Code中配置和使用插件来远程执行C和C++代码,并操控Linux服务器,包括安装VSCode、安装插件、配置插件、配置编译工具、升级glibc和编写代码进行调试的步骤。
206 0
vsCode远程执行c和c++代码并操控linux服务器完整教程
|
23天前
|
NoSQL PHP Redis
布谷语音app源码服务器环境配置及技术开发语言
布谷语音app源码服务器环境配置及技术语言研发。。
|
1月前
|
Kubernetes 网络安全 容器
VScode远程服务器进行开发(三)
VScode远程服务器进行开发(三)
30 0