一文搞懂用户认证方案怎么做

session cookie

一般网站用户认证不外乎以下步骤:

1、用户向服务器发送用户名和密码。2、服务器验证通过后,在当前对话(session)里面保存相关数据,比如用户角色、登录时间等等。3、服务器向用户返回一个 session_id,写入用户的 Cookie。4、用户随后的每一次请求,都会通过 Cookie,将 session_id 传回服务器。5、服务器收到 session_id,找到前期保存的数据,由此得知用户的身份。

以上单机版基本没问题,但是分布式系统中涉及到 session 共享问题,比如 项目部署在serviceA 和 serviceB。用户登录后 sessionId 存在 serviceA 内存中,这个时候如果 a 挂掉了(lb 打到 b 服务器也有可能),你再请求服务器 b,发现sessionId不存在,直接让你重新登录了。

首先,问题的根源出在sessionId无法共享上,想要把sessionId共享,一个简单的思路就是把sessionId保存到数据库中(这里选择redis),这样验证的时候就不再从当前服务器获取sessionId了,而改为了从redis中获取。

Token+缓存

下面是使用 Token(相当于 session) 和 Redis 进行用户认证的基本流程:

  1. 用户登录:

    • 用户提供用户名和密码进行登录。
    • 服务器验证用户提供的凭据是否正确。
  2. 生成 Token:

    • 如果用户提供的凭据正确,服务器会生成一个 Token。
    • Token 包含用户身份信息和其他必要的元数据。
  3. 存储 Token 到 Redis:

    • 服务器将生成的 Token 存储到 Redis 数据库中。
    • Token 作为键值对的形式存储,键通常是用户标识符,值是 Token。
  4. 将 Token 发送给客户端:

    • 服务器将生成的 Token 发送给客户端,通常是通过 HTTP 响应的方式发送给客户端。
  5. 客户端存储 Token:

    • 客户端通常会将 Token 存储在本地,如 localStorage、sessionStorage 或者内存中。
  6. 用户请求受保护资源:

    • 当用户访问受保护的资源时,客户端会在请求中包含 Token。通常,Token 被添加到 HTTP 请求的头部,如 Authorization 头部中。
  7. 验证 Token:

    • 服务器接收到请求后,会从请求中提取 Token。
    • 服务器验证 Token 的签名和有效性,以确保它是有效的且没有被篡改的。
  8. 从 Redis 中检索 Token:

    • 如果 Token 有效,服务器会从 Redis 数据库中检索 Token,并验证其有效性和关联的用户身份信息。
  9. 授权访问:

    • 如果 Token 有效,并且与用户的身份信息匹配,服务器将授权用户访问请求的资源。
  10. 定期更新 Token:

    • 在 Token 的有效期内,客户端可以通过定期更新 Token 来保持用户的会话持续有效。
    • 客户端可以使用 Refresh Token 或者其他方式来获取新的 Token。
  11. 用户登出:

    • 用户可以通过退出登录来终止当前会话,服务器会将 Token 从 Redis 中删除,同时客户端也应该删除存储的 Token。

通过以上流程,使用 Token 和 Redis 进行用户认证能够有效地保护用户的身份信息,并且能够实现灵活的会话管理和访问控制。

JWT

以上都是维护有状态的情况,比如需要记录用户登录、在线、权限等。加入内网环境或者邮件取消等无状态场景可以选用 JWT模式。

JWT(JSON Web Token)是一种用于身份验证和信息传递的开放标准(RFC 7519),通常用于跨域认证。下面是使用 JWT 进行用户认证的基本流程:

  1. 用户登录:

    • 用户提供用户名和密码进行登录。
    • 服务器验证用户提供的凭据是否正确。
  2. 生成 JWT:

    • 如果用户提供的凭据正确,服务器会生成一个 JWT。
    • JWT 包含用户身份信息和其他必要的元数据,如过期时间等。
  3. 将 JWT 发送给客户端:

    • 服务器将生成的 JWT 发送给客户端,通常是通过 HTTP 响应的方式发送给客户端。
  4. 客户端存储 JWT:

    • 客户端通常会将 JWT 存储在本地,如 localStorage、sessionStorage 或者内存中。
  5. 用户请求受保护资源:

    • 当用户访问受保护的资源时,客户端会在请求中包含 JWT。通常,JWT 被添加到 HTTP 请求的头部,如 Authorization 头部中。
  6. 验证 JWT:

    • 服务器接收到请求后,会从请求中提取 JWT。
    • 服务器验证 JWT 的签名和有效性,以确保它是有效的且没有被篡改的。
  7. 解析 JWT:

    • 如果 JWT 有效,服务器会解析 JWT,提取其中的用户身份信息和其他元数据。
  8. 授权访问:

    • 如果 JWT 有效,并且包含的用户身份信息是合法的,服务器将授权用户访问请求的资源。
  9. 定期更新 JWT:

    • 在 JWT 的有效期内,客户端可以通过定期更新 JWT 来保持用户的会话持续有效。
    • 客户端可以使用 Refresh Token 或者其他方式来获取新的 JWT。
  10. 用户登出:

    • 用户可以通过退出登录来终止当前会话,此时客户端应该删除存储的 JWT。

总结

对比token+redis 和jwt:

1. 去中心化的JWT token

  • 优点:

    1. 去中心化,便于分布式系统使用
    2. 基本信息可以直接放在token中。 username,nickname,role
    3. 功能权限较少的话,可以直接放在token中。用bit位表示用户所具有的功能权限
  • 缺点:服务端不能主动让token失效

    2. 中心化的 redis token / memory session等

  • 优点:服务端可以主动让token失效

  • 缺点:

    1. 依赖内存或redis存储。
    2. 分布式系统的话,需要redis查询/接口调用增加系统复杂性。

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

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

相关文章

计算机服务器中了helper勒索病毒怎么办,helper勒索病毒解密流程步骤

随着网络技术在企业中的不断应用,越来越多的企业离不开网络,网络为企业提供了极大便利,大大提升了生产运营效率,由此而产生的网络数据安全问题也成为了企业关心的主要话题。近期,云天数据恢复中心接到多家企业的求助&a…

Centos7、ubuntu22.04.3安装php7.4,mysql8.0

centos7: 更新yum源。 sodu yum update安装git: sudo yum install git查看安装是否成功: git --version安装php: 启用EPEL和Remi仓库: sudo yum install -y epel-release sudo yum install -y https://rpms.remirepo.net/enterprise/rem…

每日一题:C语言经典例题之反转数

题目描述 给定一个整数,请将该数各个数位上的数字反转得到一个新数。新数也应满足整数的常见形式,即除非给定的原数为零,否则反转后得到的新数的最高位数字不应为零。 题目描述 给定一个整数,请将该数各个数位上的数字反转得到一个…

jQuery(二)

文章目录 1.jQuery操作节点1.查找节点,修改属性1.基本介绍2.切换图片案例 2.创建节点1.基本介绍2.内部插入3.外部插入4.小结1.插入方法说明2.两种插入方法的区别 5.插入元素实例6.移动元素实例 3.删除节点1.基本介绍2.代码实例 4.复制节点1.基本介绍2.代码实例 5.替…

文心一言 VS 讯飞星火 VS chatgpt (227)-- 算法导论16.3 9题

九、证明:对于一个由随机生成的8位字符组成的文件,没有任何压缩方法可以望将其压缩、哪怕只是压缩一位。(提示:比较可能的文件数量和可能的编码文件数量。) 文心一言: 确实,对于一个由随机生成的8位字符组成的文件&a…

芒果YOLOv8姿态估计Pose任务改进《姿态估计Pose必看》:提升篇148:从零开始训练 YOLOv8姿态估计教程说明,芒果改进推荐教程

芒果YOLOv8改进分割任务《姿态估计必看》:提升篇148:从零开始训练 YOLOv8姿态估计教程说明,芒果改进推荐教程 本文适用Windows/Linux/Mac:从零开始使用Windows/Linux/Mac训练 YOLOv8 算法项目 - 《姿态估计任务》 专栏完整目录链接: 芒果YOLOv8深度改进教程 该专栏的…

【动态】江西省小型水库安全监测能力提升试点项目通过验收

近日,由北京国信华源科技有限公司和长江勘测规划设计研究有限责任公司联合承建的江西省小型水库安全监测能力提升试点项目圆满通过验收。 在项目业主单位的组织下,省项目部、特邀专家、县水利局二级项目部以及项目设计、监理、承建等单位的代表组成验收工…

GLM论文研读

一、原文链接 论文:https://arxiv.org/pdf/2103.10360.pdf 二、原文翻译 摘要: 目前已经发展出多种预训练模型,包括自编码模型(如BERT)、自回归模型(如GPT)和编码器-解码器模型(…

详细盘点Vue3项目中的各种组件文件夹(用于存放‘.vue’文件)

components 文件夹 存放通用的、可复用的组件&#xff1b; 通常用于构建页面中的具体功能模块。在项目中多次使用&#xff0c;并且不依赖于具体的业务逻辑。 比如&#xff1a;导航栏组件 navbar.vue layouts 文件夹 存放页面的整体布局组件 default.vue <script setup…

VMware创建Ubuntu虚拟机详细教程

下载ISO映像文件 进入官网下载&#xff1a;Download Ubuntu Desktop | Download | Ubuntu 下面是一些其他的下载路径&#xff1a; 中国官网 https://cn.ubuntu.com/ 中科大源 Index of /ubuntu-releases/ (ustc.edu.cn) 阿里云开源镜像站 ubuntu-releases安装包下载_开源镜像…

2024 ccfcsp认证打卡 2022 09 01 如此编码

2022 09 01 如此编码 题解1题解2 题解1 import java.util.Scanner;public class Main {public static void main(String[] args) {Scanner sc new Scanner(System.in);int n sc.nextInt(); // 天数int m sc.nextInt(); // 科目数int[] b new int[n 1]; // 存放结果的数…

虚拟机与开发板之间互传文件、文件夹

1.配置桥接模式实现外网访问 1.1设置 VMnet0 要桥接的网卡 打开【编辑】-【虚拟网络编辑器】 选择【更改设置】 选择【VMnet0】&#xff0c;选择桥接到宿主机上的哪个网卡。 通过打开安装虚拟机的宿主机的【网络适配器】&#xff0c;可以查看网卡名称。 1.2虚拟机配置桥接模式…

基于springboot实现校园周边美食探索及分享平台系统项目【项目源码+论文说明】

基于springboot实现园周边美食探索及分享平台系统演示 摘要 美食一直是与人们日常生活息息相关的产业。传统的电话订餐或者到店消费已经不能适应市场发展的需求。随着网络的迅速崛起&#xff0c;互联网日益成为提供信息的最佳俱渠道和逐步走向传统的流通领域&#xff0c;传统的…

搭建好WordPress网站后的基本操作流程

考虑到很多朋友是第一次使用WordPress&#xff0c;这里给大家分享一下基本的WordPress操作流程&#xff0c;你可以跟着实际情况决定操作步骤。 1.设置网站SSL安全证书。 我采用的是Hostease家的Linux主机产品&#xff0c;自带免费SSL证书 。支持一键安装wordpress程序。 2.进…

《PDVC》论文笔记

PS&#xff1a;模型代码解释清明后出 原文链接&#xff1a; [2108.07781v1] End-to-End Dense Video Captioning with Parallel Decoding (arxiv.org) 原文笔记&#xff1a; What&#xff1a; End-to-End Dense Video Captioning with Parallel Decoding 并行解码的端到端…

蓝牙BLE开发——如何实时监听蓝牙适配器状态变化及回调

uniapp 监听蓝牙适配器状态变化事件 近年来开发项目中接触比较多的与硬件设备对接&#xff0c;通过蓝牙与设备通讯&#xff1b;开发 App、微信小程序&#xff0c;今天分享其中如何监听蓝牙适配&#xff1b;近期比较忙&#xff0c;不定时更新&#xff0c;有时间会分享 uniapp开发…

全球范围内2nm晶圆厂建设加速

随着人工智能浪潮席卷而来&#xff0c;先进制程芯片的重要性日益凸显。当前&#xff0c;3nm工艺节点是行业内最先进的节点。与此同时&#xff0c;台积电、三星、英特尔、Rapidus等厂商正积极布局建设2nm晶圆厂。台积电与三星此前计划于2025年量产2nm芯片&#xff0c;而Rapidus则…

02-JDK新特性-Stream流

Stream流 什么是Stream流 Stream流是Java 8中的一个新特性&#xff0c;它提供了一种处理集合和数组的方式。Stream流可以让我们以一种更加简洁、高效、可读性更强的方式来处理数据。 Stream流可以用于过滤、映射、排序、聚合等操作&#xff0c;它可以让我们避免使用循环和条件…

实验2:CLI的使用与IOS基本命令

1、实验目的 通过本实验可以掌握&#xff1a; CLI的各种工作模式个CLI各种编辑命令“?” 和【Tab】键使用方法IOS基本命令网络设备访问限制查看设备的相关信息 2、实验拓扑 CLI的使用与IOS基本命令使用拓扑如下图所示。 3、实验步骤 &#xff08;1&#xff09;CLI模式的切…

openwrt开发包含路由器基本功能的web问题记录

1.这里的扫描怎么实现的先找一些luci代码&#xff0c;在openwrt21版本后&#xff0c;luci用js替换了lua写后台&#xff0c;先找一些代码路径 在openrwt15这部分代码是在这个目录下 feeds/luci/modules/luci-mod-admin-full/luasrc/view/admin_network/wifi_join.htm 里面包含…