JWT及单点登录实现

JWT发展简史

JWT Token

JSON Web Token (JWT,RFC 7519 (opens new window)),是为了在网络应用环境间传递声明而执行的一种基于 JSON 的开放标准((RFC 7519)。

ID Token

OIDC (OpenID Connect) 协议 (opens new window)对 OAuth 2.0 协议 (opens new window)最主要的一个扩展就是 ID Token 数据结构。ID Token 相当于用户的身份凭证,开发者的前端访问后端接口时可以携带 ID Token,开发者服务器可以校验用户的 ID Token 以确定用户身份,验证通过后返回相关资源。

传统玩法

当浏览器向服务器发送登录请求时,验证通过之后,会将用户信息存入seesion中,然后服务器会生成一个sessionId放入cookie中,随后返回给浏览器。

当浏览器再次发送请求时,会在请求头部的cookie中放入sessionId,将请求数据一并发送给服务器。

服务器就可以再次从seesion获取用户信息,整个流程完毕!

通常在服务端会设置seesion的时长,例如 30 分钟没有活动,会将已经存放的用户信息从seesion中移除。

同时,在服务端也可以通过seesion来判断当前用户是否已经登录,如果为空表示没有登录,直接跳转到登录页面;如果不为空,可以从session中获取用户信息即可进行后续操作。

这种场景单体程序没有问题,即使用户量增加,可以用公用session数据库,微软基本就这样玩过。

Redis登场

为了解决效能问题,以及redis出现,于是有了redis解决登录这个问题:

将各个应用程序与内存数据库redis相连,对登录成功的用户信息进行一定的算法加密,生成的ID被称为token,将token还有用户的信息存入redis;等用户再次发起请求的时候,将token还有请求数据一并发送给服务器,服务端验证token是否存在redis中,如果存在,表示验证通过,如果不存在,告诉浏览器跳转到登录页面,流程结束。

token方案保证了服务的无状态,所有的信息都是存在分布式缓存中。基于分布式存储,这样可以水平扩展来支持高并发。

当然,现在springboot还提供了session共享方案,类似token方案将session存入到redis中,在集群环境下实现一次登录之后,每个服务器都可以获取到用户信息。

JWT 登场

JWT全称JSON Web Token,实现过程简单的说就是用户登录成功之后,将用户的信息进行加密,然后生成一个token返回给客户端,与传统的session交互没太大区别。

目的是:不用缓存数据库redis来实现用户信息的共享,以达到一次登录,处处可见的效果呢?

技术手段就是客户端携带着token,然后根据规则解析。

JWT构成

因为是标准所以,构成格式是有规则的:

三段信息用.链接 header,paylaod,signature

  • 第一部分:我们称它为头部(header),用于存放token类型和加密协议,一般都是固定的;
  • 第二部分:我们称其为载荷(payload),用户数据就存放在里面;
  • 第三部分:是签证(signature),主要用于服务端的验证;

header 分为两部分:都是json表达式

JWT的头部承载两部分信息:

  • 声明类型,这里是JWT;
  • 声明加密的算法,通常直接使用 HMAC SHA256;

paylaod :

载荷就是存放有效信息的地方,这些有效信息包含三个部分:

  • 标准中注册的声明;
  • 公共的声明;
  • 私有的声明;

其中,标准中注册的声明 (建议但不强制使用)包括如下几个部分

  • iss: jwt签发者;
  • sub: jwt所面向的用户;
  • aud: 接收jwt的一方;
  • exp: jwt的过期时间,这个过期时间必须要大于签发时间;
  • nbf: 定义在什么时间之前,该jwt都是不可用的;
  • iat: jwt的签发时间;
  • jwt的唯一身份标识,主要用来作为一次性token,从而回避重放攻击;

公共的声明部分: 公共的声明可以添加任何的信息,一般添加用户的相关信息或其他业务需要的必要信息,但不建议添加敏感信息,因为该部分在客户端可解密。

私有的声明部分: 私有声明是提供者和消费者所共同定义的声明,一般不建议存放敏感信息,因为base64是对称解密的,意味着该部分信息可以归类为明文信息。

signature

signature = 加密( base64UrlEncode(header) + '.' + base64UrlEncode(payload) );

保护好服务端secret私钥非常重要,因为私钥可以对数据进行验证、解密!

单点登录

Single sign-on (SSO) is an authentication scheme that allows a user to log in with a single ID and password to any of several related, yet independent, software systems.

单点登录(SingleSignOn,SSO),就是通过用户的一次性鉴别登录。当用户在身份认证服务器上登录一次以后,即可获得访问所有信任的应用系统。

为何单点登录

一个公司有n多系统,每个系统有账号密码,比如几十个搞,如何搞?社交媒体有n多网站应用,各类用户和密码,很难整,有没有可能,只记住一个用户密码,其他都同行,这就是单点登录想解决的问题,衍生出各类逻辑问题,对应的就是安全,技术问题等等。

如何单点登录

有一个解决方案,我将我的身份委托给我需要使用的所有网站都信任的单一安全服务,我只需要记住这个安全服务的账号密码,所有其他网站自身不需要具备验证身份的能力,统一由安全服务确认用户身份。

这就是Single Sign On ,单点登录。

JWT实现单点登录

  1. 因为是标准,所以不同的语言平台都有对应的实现接口
  2. 需要一个公共的身份管理中心
  3. 管理身份和各类应用
  4. 分配应用和用户的关系,完成对应业务系统的身份同步
  5. 身份管理中心登陆后,点击业务应用,验证后,携带idtoken,跳转业务系统sso地址
  6. 各类应用根据jwt的规则,有对应的sso地址,用以解析IDtoken,实现业务系统的登录
  7. 业务系统自动跳转身份中心登录入口,重新转向业务地址
  8. 对应解决单点登出接口,实现各个业务应用同步

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

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

相关文章

DEA统计代码行数插件Statistic

1.安装Statistic插件 直接在idea里面搜索Statistic即可 2.重启idea 3.查看代码行数 它可以统计各类文件的行数总和

【Linux】进程(7):地址空间

大家好,我是苏貝,本篇博客带大家了解Linux进程(7):地址空间,如果你觉得我写的还不错的话,可以给我一个赞👍吗,感谢❤️ 目录 (A) 直接看代码&…

法国人工智能初创公司 Mistral 正在推出新的人工智能模型定制选项服务和 SDK

Mistral AI是一家成立于2023年的法国人工智能初创公司,由Artur Mensch、Timothe Lacroix和Guillaume Lample三位前Meta和Google DeepMind的研究人员创立。该公司专注于生成式AI技术,特别是用于构建在线聊天机器人、搜索引擎等应用。 Mistral AI在成立之…

[数据集][图像分类]城市异常情况路边倒树火灾水灾交通事故分类数据集15223张8类别

数据集类型:图像分类用,不可用于目标检测无标注文件 数据集格式:仅仅包含jpg图片,每个类别文件夹下面存放着对应图片 图片数量(jpg文件个数):15223 分类类别数:8 类别名称:[“badroad”,“fallentree”,“f…

CarSim车辆运动轨迹绘制

CarSim车辆运动轨迹绘制 CarSim中与车辆位置有关的信息分别为Xo和Yo 输出到Simulink中 导入到工作空间中保存,low_carsim_path.mat ,绘制结果曲线,low_carsim_path_comp.m data csvread(low_two_path.csv,1,0); low_two_path_x data(:,1)…

分享我的新版FMEA培训心得

近日,我有幸参加了深圳天行健企业管理咨询公司举办的新版FMEA培训,这次学习不仅让我对FMEA有了更深入的理解,更使我在实际工作中找到了提升产品质量的新路径。 新版FMEA相较于传统版本,更加注重风险识别与预防,强调在…

【递归、搜索与回溯】递归算法

一、经验总结 递归 VS 迭代(循环) 递归和迭代都解决的是重复的子问题,因此两者是可以相互转化的。利用栈结构可以将递归算法转化为迭代算法。 递归和迭代各有其优缺点,选择时需根据具体场景和需求来决定。 递归的优点包括&#…

苹果眼镜(Vision Pro)专业咨询服务模式优化方案

一、精准定位: 专注于为Apple Vision Pro应用开发者提供一站式、全方位的专业咨询服务,致力于成为开发者在空间计算时代中不可或缺的合作伙伴,共同打造“下一个大事件”。 二、核心业务优化: visionOS策略咨询: 深入…

【氵】Archlinux+KDE Plasma+Wayland 安装nvidia驱动 / 开启HDR

参考: NVIDIA - Arch Linux 中文维基 (其实就是把 wiki 简化了一下 注:本教程适用 GeForce 930 起、10 系至 20 系、 Quadro / Tesla / Tegra K-系列以及更新的显卡(NV110 以及更新的显卡家族),此处以 RTX3060 为例 …

LlamIndex二 RAG应用开发

在AutoGen)系列后,我又开始了LlamIndex 系列。欢迎查询LlamaIndex 一 简单文档查询 - 掘金 (juejin.cn)了解LlamIndex,今天我们来看看LlamIndex的拿手戏,RAG应用开发。 何为RAG? RAG全称"Retrieval-Augmented Generation&q…

vue处理json数据

背景:后端返回的数据不是我想要的,现在需要把 name 替换为title(小声蛐蛐:又让我处理数据) 后端返回数据格式 修改字段操作:(使用递归遍历的方式将title属性赋了name的值) renderT…

详细分析Mysql临时变量的基本知识(附Demo)

目录 前言1. 用户变量2. 会话变量 前言 临时变量主要分为用户变量和会话变量 1. 用户变量 用户变量是特定于会话的,在单个会话内可以在多个语句中共享 以 符号开头在 SQL 语句中使用 SET 语句或直接在查询中赋值 声明和赋值 SET var_name value; -- 或者 SE…

构建Vue3项目的几种方式,如何简化setup写法

1、说明 在vue2版本中,我们使用vue-cli脚手架进行构建,而切换到Vue3之后,依然可以使用vue-cli脚手架进行构建,但是官方推荐使用vite工具进行构建,下面将介绍几种方式构建vue3项目。 2、使用vue-cli脚手架构建Vue3项目…

【前端面试高频手写题】

# 面试高频手写题 建议优先掌握: instanceof - 考察对原型链的理解 new - 对创建对象实例过程的理解 call/apply/bind - 对this指向的理解 手写promise - 对异步的理解手写原生ajax - 对ajax原理和http请求方式的理解,重点是get和post请求的实现 # 1…

高考填报志愿,怎么分析自己适合什么专业?

高考结束后,很多考生不知道自己的分数段适合什么学校,缺乏目标感,有些专业名称很大,听起来光鲜亮丽,但是是否适合自己,学什么课程,将来就业去向,这些都是需要细致了解的。 专业选择…

matlab 异常值检测与处理——Z-score法

目录 一、算法原理1、算法概述2、主要函数3、参考文献二、代码实现三、结果展示四、相关链接本文由CSDN点云侠原创,原文链接。如果你不是在点云侠的博客中看到该文章,那么此处便是不要脸的爬虫。 一、算法原理 1、算法概述 使用Z分数法,可以找出距离平均值有多少个标准差值…

Python SQLAlchemy库详解

大家好,在Python生态系统中,SQLAlchemy库是一个强大的工具,为开发人员提供了便捷的方式来处理与数据库的交互。无论是开发一个小型的Web应用程序,还是构建一个大型的企业级系统,SQLAlchemy都能满足你的需求&#xff0c…

【操作与配置】MySQL安装及启动

【操作与配置】MySQL安装及启动 下载MySQL 进入官网,选择社区版下载 在windows安装 选择不登陆下载 安装MySQL 双击官方安装包 选择“Developer Default”(默认)即可 Execute,安装完成后next TCP/IP端口等,默认即可…

【TS】进阶

一、类型别名 类型别名用来给一个类型起个新名字。 type s string; let str: s "123";type NameResolver () > string;: // 定义了一个类型别名NameResolver,它是一个函数类型。这个函数没有参数,返回值类型为string。这意味着任何被…

路灯夜景视频素材去哪里找?傍晚黄昏夜景路灯视频素材网分享

在这个数字化的时代,视频创作者们总是在寻找各种优质素材来提升作品的质感。特别是充满浪漫氛围的路灯夜景,为短视频、电影、广告等增添了独特的视觉魅力。今天,我为大家整理了几个优秀的视频素材网站,帮助您轻松找到高质量的路灯…