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. 对应解决单点登出接口,实现各个业务应用同步

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【SpringBoot + Vue 尚庭公寓实战】项目初始化准备(二)

尚庭公寓SpringBoot Vue 项目实战】项目初始化准备(二) 文章目录 尚庭公寓SpringBoot Vue 项目实战】项目初始化准备(二)1、导入数据库2、创建工程3、项目初始配置3.1、SpringBoot依赖配置3.2、创建application.yml文件3.3、创建…

【Mac】Alfred 5 for Mac(苹果效率提升工具)v5.5软件介绍及安装教程

软件介绍 Alfred 是适用于 Mac 操作系统的流行生产力应用程序。它旨在帮助用户在 Mac 电脑上更高效地启动应用程序、搜索文件和文件夹以及执行各种任务。借助 Alfred,用户可以创建自定义键盘快捷方式、设置自定义工作流程并使用热键访问功能。 Alfred for Mac 的一…

离散数学期末复习题库(含答案)

目录 1.判断题 1-1 1-2 1-3 1-4 2.选择题 2-1 2-2 2-3 3.多选题 3-1 4.填空题 4-1 4-2 4-3 4-4 4-5 5.主观题 5-1 5-2 5-3 5-4 1.判断题 1-1 ϕ⊆{ϕ} (对) 1-2 {a,b}∈{a,b,c,{a,b}} (对) 1-3 {a,b…

【西瓜书】2.模型评估与选择

1.经验误差与过拟合 (1)错误率、精度 (2)误差:训练误差/经验误差、泛化误差 (3)过拟合、欠拟合 欠拟合好克服,过拟合无法彻底避免 2.三大任务——评估方法 泛化误差的评估方法&a…

14本剔除!Scopus目录第四次更新,Hindawi期刊再次上榜

【SciencePub学术】近期,Scopus数据库迎来本年度第四次更新!此次更新后,有89本期刊发生变动: 变动详情 •【新增】75本新增期刊进入Scopus数据库 •【剔除】14本期刊被Scopus数据库剔除 目前Scopus 来源出版物列表(…

day4-函数图像

基础知识 幂函数 研究最值,可以用单调性一样的函数 指数函数 牛啊 lnx 三角函数 比如计算定积分 例1 的第二步不会 求导 严格来说,还要验证,导数 是不是 大于0 再 小于0,判断是最大值还是最小值 例2 easy 买的资料到手了&#x…

JVM之【类的生命周期】

首先,请区分Bean的声明周期和类的声明周期。此处讲的是类的声明周期 可以同步观看另一篇文章JVM之【类加载机制】 概述 在Java中数据类型分为基本数据类型和引用数据类型 基本数据类型由虚拟机预先定义,引用数据类型则需要进行类的加载 按照]ava虚拟机…

伯克希尔·哈撒韦:“股神”的“登神长阶”

股价跳水大家见过不少,但一秒跌掉62万美元的你见过吗? 今天我们来聊聊“股市”巴菲特的公司——伯克希尔哈撒韦 最近,由于纽交所技术故障,伯克希尔哈撒韦A类股股价上演一秒归“零”,从超过62万美元跌成185.1美元&…

python API自动化(接口测试基础与原理)

1.接口测试概念及应用 什么是接口 接口是前后端沟通的桥梁,是数据传输的通道,包括外部接口、内部接口,内部接口又包括:上层服务与下层服务接口,同级接口 外部接口:比如你要从 别的网站 或 服务器 上获取 资源或信息 &a…

开源网关Apache APISIX启用JWT身份验证

说明: 本文APISIX的配置参考我之前写的《Ubuntu部署Apache APISIX》 创建最小API 首先,确保你已经安装了.NET 6 SDK。创建文件夹“MinimalApiDemo”,VS Code打开文件夹,打开终端 dotnet new web -o MinimalApiDemo cd Minimal…

AGP8+ android.useNewApkCreator‘ is deprecated 打包失败

问题 新建一个项目,默认使用最新版的 AGP 和 Gradle,打包构建立马失败! 错误日志 Caused by: com.android.builder.errors.EvalIssueException: The option android.useNewApkCreator is deprecated. An exception occurred applying plu…

gitee上传整个项目文件夹

1.访问git官网并下载 Git 如下图: 点击download,然后选择合适的版本进行下载: 如下图,我下载的是2.32.0.2版本,64位windows版。 下载完之后,直接点击安装。 然后根据向导,一路默认到安装完成。…

数据虚拟化:零数据搬运,实现全域数据的集成和自适应加速

数据虚拟化技术的兴起,与传统数据仓库体系的弊端日益显现有着密切关系。 过去,企业通常会构建数据仓库来存储与加工结构化数据。数据仓库虽然实现了数据的物理集中存储,但过于依赖大量的 ETL 工程师来支持数据的集成、准备、开发与管理。随着…

Docker高级篇之安装Redis集群(分布式存储案例)

文章目录 1. 案例场景2. 3主3从redis集群扩缩容配置案例架构说明3. 3主3从redis集群扩缩容配置案例搭建4. 主从容错切换迁移案例5. 主从扩容6. 主从缩容 1. 案例场景 1~2亿条数据需要缓存,如何设计这个存储案例?这种情况下单机存储100%是不可…

【kubernetes】k8s集群安全机制 保姆级攻略哦

目录 一、认证(Authentication) 1.1三种认证方式 1.2需要被认证的访问类型: 1.3安全性说明: 1.4证书颁发: 1.5kubeconfig 1.6Service Account 1.7Secret 与 SA 的关系 1.7.1Kubernetes 设计了一种资源对象叫做…

Qt Creator常用的快捷键和常用功能

常用快捷键 新建项目,ctrl n 运行项目,ctrl r 构建项目,ctrl b 改变编辑器界面字体显示比例大小,ctrl 鼠标滚轮 对齐代码,ctrl a; ctrl i 跳转到上一行,ctrl shift enter 跳转到下一行,…

sc.tl.rank_genes_groups()问题

今天被问到了一个关于sc.tl.rank_genes_groups()的奇怪的问题 import scanpy as sc import pandas as pd import numpy as np import seaborn as sns import matplotlib.pyplot as plt # from CellDART import da_cellfraction # from CellDART.utils import random_mix from…

Linux网络服务之SSH(远程访问及控制)

ssh远程管理: ssh是一种安全通道协议,用来实现字符界面的远程登录。远程复制,远程文本传输。 ssh对通信双方的数据进行了加密 用户名和密码登录 密钥对认证方式(可以实现免密登录) ssh 22 网络层 传输层 数据传输…

制造执行MES系统在光伏行业的应用

全球对可再生能源的需求不断增长,光伏能源作为一种清洁、可持续的能源形式,已经在广泛应用中受到了广泛关注。为满足工业领域的光伏能源需求,光伏制造执行系统(MES)作为一种集成化的技术解决方案,提供了更高效、更可靠的解决方案。…

代码随想录算法训练营第四十六 | ● 139.单词拆分 ● 关于多重背包,你该了解这些! ● 背包问题总结篇!

139.单词拆分 视频讲解&#xff1a;https://www.bilibili.com/video/BV1pd4y147Rh https://programmercarl.com/0139.%E5%8D%95%E8%AF%8D%E6%8B%86%E5%88%86.html class Solution { public:bool wordBreak(string s, vector<string>& wordDict) {unordered_set<st…