lnmp - 登录技术方案设计与实现

news2024/9/21 21:45:11

概述

登录功能是对于每个动态系统来说都是非常基础的功能,用以区别用户身份、和对应的权限和信息,设计出一套安全的登录方案尤为重要,接下来我介绍一下常见的认证机制的登录设计方案。

方案设计

HTTP 是一种无状态的协议,客户端每次发送请求时,首先要和服务器端建立一个连接,在请求完成后又会断开这个连接。系统登录的本质是确认用户的合法性和身份

Cookie + Session 登录

在 B/S 系统中,登录功能通常都是基于 Cookie 来实现的。当用户登录成功后,一般会将登录状态记录到 Session 中。要实现服务端对客户端的登录信息进行验证都,需要在客户端保存一些信息(SessionId),并要求客户端在之后的每次请求中携带它们。在这样的场景下,使用 Cookie 无疑是最方便的,因此我们一般都会将 Session 的 Id 保存到 Cookie 中,当服务端收到请求后,通过验证 Cookie 中的信息来判断用户是否登录 。

用户首次登录流程

在这里插入图片描述

1、用户访问 www.stark.com/login,并输入密码登录。
2、服务器验证密码无误后,会创建 SessionId,并将它保存起来。
3、服务器端响应这个 HTTP 请求,并通过 Set-Cookie 头信息,将 SessionId 写入 Cookie 中。

cookice后续校验流程

获取cookice后续的访问就可以直接使用 Cookie 进行身份验证了

在这里插入图片描述

1、用户访问 www.stark.com/console 页面时,会自动带上第一次登录时写入的 Cookie
2、服务器端比对 Cookie 中的 SessionId 和保存在服务器端的 SessionId 是否一致。
3、如果一致,则身份验证成功,访问页面;如果无效,则需要用户重新登录。

需要注意的是: Cookie + Session 的方案中最关键的环节是传递Cookie有时可能会面临Cookie禁用的情况,记住只要把Cookie的值传递给服务端得到SessionId即可,可以是存储在LocalStorage,也可以使用URL 的GET方式传输。

Cookie + Session 技术实现

Cookie + Session的核心点在于数据的加密和解密的算法,在用户登录进行加密、生成Cookie,在之后的交互的时候携带在header的信息头中。

加密函数代码:

function passportEncrypt($txt, $key = 'stark-server@2024@#$!'): string
{
    $txt = 'yy-依加衣-' . time() . '-' . $txt;
    srand((double)microtime() * 1000000);
    $encrypt_key = md5(rand(0, 32000));
    // 变量初始化
    $ctr = 0;
    $tmp = '';
    for ($i = 0; $i < strlen($txt); $i++) {
        $ctr = $ctr == strlen($encrypt_key) ? 0 : $ctr;
        $tmp .= $encrypt_key[$ctr] . ($txt[$i] ^ $encrypt_key[$ctr++]);
    }
    return base64_encode(passportKey($tmp, $key));
}

function passportKey($txt, $encrypt_key): string
{
    $encrypt_key = md5($encrypt_key);
    $ctr = 0;
    $tmp = '';
    for ($i = 0; $i < strlen($txt); $i++) {
        $ctr = $ctr == strlen($encrypt_key) ? 0 : $ctr;
        $tmp .= $txt[$i] ^ $encrypt_key[$ctr++];
    }
    return $tmp;
}

字符串解密函数:


function passportDecrypt($txt, $key = 'stark-server@2024@#$!')
{
    $txt = str_replace(' ', '+', $txt);
    $txt = passportKey(base64_decode($txt), $key);
    $tmp = '';
    for ($i = 0; $i < strlen($txt); $i++) {
        if (!isset($txt[$i]) || !isset($txt[$i + 1])) {
            return 0;
        } else {
            $tmp .= $txt[$i] ^ $txt[++$i];
        }
    }
    $tmp = explode('-', $tmp);
    $tmp[3] = $tmp[3] ?? 0;
    return $tmp[3];
}

加密解密实现的具体逻辑:

//加密
$data = [
    'admin_id' => $adminInfo['admin_id'],
    'admin_name' => $adminInfo['admin_name'],
];
$demoStr = json_encode($data,JSON_UNESCAPED_UNICODE);
$authorization = passportEncrypt($demoStr);


Cookie::set('Auth-stark', $authorization,
    ['prefix' => 'think', 'expire' => 3600]
);

//解密
$json = passportDecrypt($authorization);
if(mb_strlen($json) > 0){
    $demoData = json_decode($json,true);
}

Token 登录

由于服务器端需要对接大量的客户端,也就需要存放大量的 SessionId,这样会导致服务器压力过大、无法避免 CSRF 攻击等缺点,我们可以使用 Token 的登录方式。

Token是通过服务端生成的一串字符串,以作为客户端请求的一个令牌。当第一次登录后,服务器会生成一个 Token 并返回给客户端,客户端后续访问时,只需带上这个 Token 即可完成身份认证,很多企业使用JWT的技术来进行登录验证方式。

用户首次登录

在这里插入图片描述

1、用户访问 www.stark.com/login,输入账号密码,并点击登录。
2、服务器端验证账号密码无误,创建 Token
3、服务器端将 Token 返回给客户端,由客户端存储在Header头信息里。

后续页面访问

在这里插入图片描述

1、用户访问 www.stark.com/login 时,带上第一次登录时获取的 Token
2、服务器端验证该 Token ,有效则身份验证成功,无效则踢回重新的登录。

Token 生成方式

最常见的 Token 生成方式是使用 JWT(Json Web Token),它是一种简洁的、自包含的方法,用于通信双方之间以 JSON 对象的形式安全的传递信息。

答案其实就在 Token 字符串中,其实 Token 并不是一串杂乱无章的字符串,而是通过多种算法拼接组合而成的字符串。

JWT 算法主要分为 3 个部分:header(头信息),playload(消息体),signature(签名)。

  • header 部分指定了该 JWT 使用的签名算法;
  • playload 部分表明了 JWT 的意图;
  • signature 部分为 JWT 的签名,主要为了让 JWT 不能被随意篡改。
JWT Token 技术实现

Compose 安装 Jwt 的两种方式,我使用的是6.10版本 :

## 安装
composer require firebase/php-jwt 6.10

使用 composer.json 安装,加入文件,使用composer install

"require": {
    "firebase/php-jwt": "^6.10"
}

Jwt 主要是进行加密和解密,$payload定义的是你需要存储的数组信息:

public static function encode(int $adminId = 0): string
{
    $redis = new Redis(config('cache.stores.redis'));
    $secretKey = Env::get("JWT.key"); // 获取JWT生成签名的密钥
    $alg = Env::get("JWT.alg"); // 获取JWT加密算法
    $payload = [
        'admin_id' => $adminId, // 存储用户ID
        'exp' => time() + Env::get("JWT.exp"), // 设定过期时间
    ];
    $jwt = JWT::encode($payload, $secretKey, $alg); // 生成JWT令牌
    $token = config('prefix.auth');
    $redis->set($token.$adminId, $jwt,Env::get("JWT.exp") - rand(10,99));
    return $jwt;
}

解密的逻辑:

public static function decode(string $AccessToken = ''){
    $secretKey = Env::get("JWT.key"); // 获取JWT生成签名的密钥
    $alg = Env::get("JWT.alg"); // 获取JWT加密算法

    $secretKeyObj = new Key($secretKey,$alg);
    $headers = new stdClass();
    return JWT::decode($AccessToken, $secretKeyObj,$headers); // 使用JWT解密Token
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2142680.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

iOS - TestFlight使用

做的项目需要给外部人员演示&#xff0c;但是不方便获取对方设备的UDID&#xff0c;于是采用TestFlight 的方式邀请外部测试人员的方式给对方安装测试App&#xff0c;如果方便获取对方设备的UDID&#xff0c;可以使用蒲公英 1.在Xcode中Archive完成后上传App Store Connect之前…

浙大上交联合阿里腾讯,共同构建医学AI领域的顶尖科研+商业团队|个人观点·24-09-17

小罗碎碎念 昨晚锻炼时&#xff0c;我想着是时候对推文的内容做一些改进了——既能通过写推文来锻炼自己写paper的能力&#xff0c;也希望凭借自己一点微弱的影响力&#xff0c;去带动更多的人加入医学AI的队伍中。 这一期推文系统且深度的分析一下&#xff0c;国内哪些学者在医…

Linux基础开发环境(git的使用)

1.账号注册 git 只是一个工具&#xff0c;要想实现便捷的代码管理&#xff0c;就需要借助第三方平台进行操作&#xff0c;当然第三平台也是基于git 开发的 github 与 gitee 代码托管平台有很多&#xff0c;这里我们首选 Github &#xff0c;理由很简单&#xff0c;全球开发者…

算法题之回文子串

回文子串 给你一个字符串 s &#xff0c;请你统计并返回这个字符串中 回文子串 的数目。 回文字符串 是正着读和倒过来读一样的字符串。 子字符串 是字符串中的由连续字符组成的一个序列。 示例 1&#xff1a; 输入&#xff1a;s "abc" 输出&#xff1a;3 解释…

C++ 带约束的Ceres形状拟合

C 带约束的Ceres形状拟合 一、Ceres Solver1.定义问题2. 添加残差AddResidualBlockAutoDiffCostFunction 3. 配置求解器4. 求解5. 检查结果 二、基于Ceres的最佳拟合残差结构体拟合主函数 三、带约束的Ceres拟合残差设计拟合区间限定 四、拟合结果bestminmax 五、完整代码 对Ce…

RocksDB系列一:基本概念

0 引言 RocksDB 是 Facebook 基于 Google 的 LevelDB 代码库于 2012 年创建的高性能持久化键值存储引擎。它针对 SSD 的特定特性进行了优化&#xff0c;目标是大规模&#xff08;分布式&#xff09;应用&#xff0c;并被设计为嵌入在更高层次应用中的库组件。RocksDB应用范围很…

【Python百日进阶-Web开发-音频】Day711 - 光谱表示 librosa.stft 短时傅里叶变换

文章目录 一、光谱表示 Spectral representations1.1 librosa.stft1.1.1 语法与参数1.1.2 示例 一、光谱表示 Spectral representations 1.1 librosa.stft https://librosa.org/doc/latest/generated/librosa.stft.html 1.1.1 语法与参数 librosa.stft(y, *, n_fft2048, ho…

智能机巢+无人机:自动化巡检技术详解

智能机巢与无人机的结合&#xff0c;在自动化巡检领域展现出了巨大的潜力和优势。以下是对这一技术的详细解析&#xff1a; 一、智能机巢概述 智能机巢&#xff0c;也被称为无人机机场或无人机机巢&#xff0c;是专门为无人机提供停靠、充电、维护等服务的智能化设施。它不仅…

加密与安全_优雅存储二要素(AES-256-GCM )

文章目录 什么是二要素如何保护二要素&#xff08;姓名和身份证&#xff09;加密算法分类场景选择算法选择AES - ECB 模式 (不推荐)AES - CBC 模式 (推荐)GCM&#xff08;Galois/Counter Mode&#xff09;AES-256-GCM简介AES-256-GCM工作原理安全优势 应用场景其他模式 和 敏感…

LeetcodeTop100 刷题总结(一)

LeetCode 热题 100&#xff1a;https://leetcode.cn/studyplan/top-100-liked/ 文章目录 一、哈希1. 两数之和49. 字母异位词分组128. 最长连续序列 二、双指针283. 移动零11. 盛水最多的容器15. 三数之和42. 接雨水&#xff08;待完成&#xff09; 三、滑动窗口3. 无重复字符的…

TCADE--基于迁移成分分析和差分进化的多目标多任务优化

TCADE–基于迁移成分分析和差分进化的多目标多任务优化 title&#xff1a; Multitasking multiobjective optimization based on transfer component analysis author&#xff1a; Ziyu Hua, Yulin Li, Hao Sun, Xuemin Ma. journal&#xff1a; Information Sciences (Ins)…

最优化理论与自动驾驶(十):纯跟踪算法原理、公式及代码演示

纯跟踪算法&#xff08;Pure Pursuit Algorithm&#xff09;是一种用于路径跟踪的几何控制算法&#xff0c;广泛应用于自动驾驶、机器人导航等领域。其基本思想是通过选择预定路径上的目标点&#xff08;预瞄点&#xff09;&#xff0c;并控制转向角&#xff0c;使车辆不断逼近…

用于稀疏自适应深度细化的掩码空间传播网络 CVPR2024

目录 Masked Spatial Propagation Network for Sparsity-Adaptive Depth Refinement &#xff08;CVPR 2024&#xff09;用于稀疏自适应深度细化的掩码空间传播网络1 介绍2 算法流程2.1 问题建模2.2 Guidance Network2.3 MSPN 模块 3 实验结果3.1 稀疏度自适应深度细化对比试验…

COMDEL电源CX2500S RF13.56MHZ RF GENERATOR手侧

COMDEL电源CX2500S RF13.56MHZ RF GENERATOR手侧

如何让虚拟机的服务被主机访问

当我们在虚拟机上写了一个服务器&#xff0c;在宿主机访问时&#xff0c;出现无法访问的情况。这可能是虚拟机网络的设置问题。 查看虚拟机防火墙是否关闭 在终端输入&#xff1a; systemctl status firewalld 如果是active就说明防火墙是开启的&#xff0c;需要关闭。 输入…

高级I/O知识分享【epoll || Reactor ET,LT模式】

博客主页&#xff1a;花果山~程序猿-CSDN博客 文章分栏&#xff1a;Linux_花果山~程序猿的博客-CSDN博客 关注我一起学习&#xff0c;一起进步&#xff0c;一起探索编程的无限可能吧&#xff01;让我们一起努力&#xff0c;一起成长&#xff01; 目录 一&#xff0c;接口 epo…

SpringBoot 消息队列RabbitMQ 消息可靠性 数据持久化 与 LazyQueue

介绍 在默认情况下&#xff0c;RabbitMQ会将接收到的信息保存在内存中以降低消息收发的延迟 一旦MO宕机&#xff0c;内存中的消息会丢失内存空间有限&#xff0c;当消费者故障或处理过慢时&#xff0c;会导致消息积压&#xff0c;引发MQ阻塞 在消息队列运行的过程中&#xf…

LeetCode 815.公交路线(BFS广搜 + 建图)(中秋快乐啊)

给你一个数组 routes &#xff0c;表示一系列公交线路&#xff0c;其中每个 routes[i] 表示一条公交线路&#xff0c;第 i 辆公交车将会在上面循环行驶。 例如&#xff0c;路线 routes[0] [1, 5, 7] 表示第 0 辆公交车会一直按序列 1 -> 5 -> 7 -> 1 -> 5 -> …

物理感知扩散的 3D 分子生成模型 - PIDiff 评测

PIDiff 是一个针对蛋白质口袋特异性的、物理感知扩散的 3D 分子生成模型&#xff0c;通过考虑蛋白质-配体结合的物理化学原理来生成分子&#xff0c;在原理上&#xff0c;生成的分子可以实现蛋白-小分子的自由能最小。 一、背景介绍 PIDiff 来源于延世大学计算机科学系的 Sang…

vue2基础系列教程之v-model及面试高频问题

v-model是表单组件里面的核心知识点&#xff0c;这个指令给我们写表单业务带来了很大的方便。 元素标签上的 v-model 指令用于双向绑定数据,它是一个语法糖&#xff0c;可以用于代替 v-bind:value 和 input 例如&#xff1a;<input v-model"message" placeholder…