当前位置: 首页 > news >正文

前端从普通登录到单点登录(SSO)

随着前端登录场景的日益复杂化和技术思想的不断演进,前端在登录方面的知识结构变得越来越复杂。对于前端开发者来说,在日常工作中根据不同的登录场景提供合适的解决方案是我们的职责所在,本文将梳理前端登录的演变过程。

1、无状态的HTTP

HTTP是无状态的,每条请求都是独立进行的。同一个用户多次发起请求,服务端无法识别多个HTTP请求来自同一个用户。为了解决这个问题,引入了会话机制(session)。

2、基于会话(session)的认证

会话(session)机制,使每条HTTP请求之间保持客户端的状态信息。session对象保存在服务端的内存或数据库中,这个session对象包含有用户的基本信息。sessionId(会话ID)保存在客户端中的cookie或localstorage中,每次客户端向服务端发送请求时,都会携带sessionId,服务端拿到sessionId对该请求进行身份验证。sessionId在请求传输过程中,可以被放置在cookie中,也可以放置在body中。

基于会话的认证方式是传统的方法,在很长的时间内被使用。但也存在一些缺点:

  • 服务器负担大。服务端需要为每个用户维护一个会话对象,这可能在大规模应用中导致服务器负载增加
  • 水平扩展困难。在分布式架构中,即应用程序在多个服务器上运行时,用户可能会在不同的服务器上交替访问应用程序,所以需要确保服务器之间可以共享会话状态。
  • 不适用于无状态服务。对于RESTful API这种无状态服务,更适合基于令牌的认证方式。

3、跨域认证

随着前后端开发模式的变化,前端和后端更倾向于分开部署,前端的静态资源部署在一个服务器中,后端的API部署在另外一个服务器中。这意味着前端的登录需要进行跨域认证。跨域认证即使用跨域请求的方式,进行身份认证。常见的几种跨域认证方案:

  • JSOP:只能用于跨域请求,不能进行身份验证
  • CORS:可以进行跨域请求和身份认证。但是当多个业务系统调用同一个API服务下的接口时,随着业务系统数量的增长,后端开发人员需要频繁地更改跨域配置才能使新开发的系统可以进行跨域请求。当出现这种情况时,使用nginx反向代理将跨域的控制权移交至前端,是更好的方案。
  • 代理:使用nginx做代理,将跨域请求转发至目标服务器,并将响应返回给客户端。

iframe场景下,使用localstorage做跨域存储,通过postmessage和iframe的方式跨域共享localstorage,但是safari不能使用postMessage,可以改用url方式跨域共享localstorage

4、基于令牌(token)的认证

为了解决在分布式架构中session认证存在的问题,可以使用基于token的认证方式。由于token只会存储在客户端,这样可以减少服务端的负担和提升了服务端水平扩展能力。

基于令牌(token)的认证时序图

优点:

  • 减少服务端的负担。因为token只会存储在客户端上,不会存储在服务端。
  • 提升了服务端水平扩展能力。因为服务端水平扩展不再需要处理会话状态的同步逻辑。

缺点:

  • 签发的token无法撤销。token包含了有效期信息,在整个有效期内不能撤销,直至过期。
  • 无法实现单点登出。如果使用令牌方式实现单点登录SSO功能,那么难以实现单点登出SLO。因为单点登出涉及到在所有相关联系统中注销用户,所以要实现此功能需要额外的机制配合。

以上是最基础版本的令牌的认证方式,还存在着一些缺点,主要用来阐述令牌认证的核心流程。要规避掉上述缺点,还需要配合其他机制(下面OAUTH部分会更深一步讲解)。

令牌(token)的生成

token最常见的方式是JWT(JSON Web Token),JWT是为了在网络应用环境间传递声明而执行的一种基于JSON的开放标准((RFC 7519),该token被设计为紧凑且安全的,特别适用于分布式站点的单点登录(SSO)场景。JWT由三部分组成,由.分割,形如:Header.Payload.Signature

1. Header(头部)

Header部分是一个JSON对象,描述JWT元数据,如下:

{"alg": "HS256","typ": "JWT"
}

alg表示签名的算法,type表示令牌的类型。最后将上面的JSON对象使用Base64URL算法转成字符串。

2. Payload(负载)

payload部分是一个JSON对象,表示JWT实际传输的数据,官方定义了如下字段供选择:

-   iss (issuer):签发人
-   exp (expiration time):过期时间
-   sub (subject):主题
-   aud (audience):受众
-   nbf (Not Before):生效时间
-   iat (Issued At):签发时间
-   jti (JWT ID):编号

也可以自定义字段,最后将上面的JSON对象使用Base64URL算法转成字符串。

3. Signature(签名)

signature部分是对前两部分的签名,防止数据被篡改。公式如下:

HMACSHA256(base64UrlEncode(header) + "." +base64UrlEncode(payload),secret)

 secret是由服务端才有的密钥。

5、单点登录(SSO)

用户只需要登录一次,就可以在多个相关联的系统上访问,避免了多次登录的麻烦。单点登录简化了登录流程,提升了用户体验。目前有两种比较常见的实现方式:CASOIDC

CAS

CAS(Central Authentication Service)是一种用于实现单点登录SSO的开源协议。它提供了一个中心化的认证服务器(CAS),CAS服务器负责用户的登录和身份认证,并生成一个票据(ticket)用于访问其他应用程序。如下图是CAS标准流程的时序图:

需要注意的几点:

  • CAS是基于票据(ticket)实现单点登录的。票据是一种身份验证凭据,与token有一定区别。
  • CAS中包含有TGT和ST两种ticket。TGT是长期有效的凭据,用于获取短期的ST凭据;ST凭据用来向特定服务验证身份的。

OIDC(OpenID Connect)

OAUTH是一个授权协议,在全世界得到了广泛的应用,目前是2.0版本,但并不是专门针对单点登录SSO设计的协议。OIDC是基于OAUTH实现的身份认证协议,是OAUTH的超集,可以实现单点登录功能。与CAS不同的是,OIDC是基于token的认证方式。

1. OAUTH2.0

OAUTH是一个授权协议,是为了解决同一个账号可以登录所有应用的问题。现在很多第三方应用都接入了微信登录,那么微信登录就是一个大的身份认证服务,所有接入了微信登录体系的APP,都可以使用微信账号直接登录。

1.1. OAUTH2.0 原理

OAuth 2.0的运行流程如下图,摘自RFC 6749。

认证服务器除了返回access token,refresh token也是可选项。

  • access token:表示访问令牌。有效期短,解决token无法撤销问题。
  • refresh token:表示更新令牌。有效期长,用于获取access token。

2. OIDC

下图是网上找到的一张基于token实现单点登录的时序图,虽然与标准的OIDC流程不一样,但是也大致说清楚了基于token实现单点登录的流程

CAS与OIDC的总结:

  • CAS业务系统是基于session的保持登录态,而OIDC业务系统是基于token的
  • CAS单点登录的方式更适合企业内部各个业务系统之间统一单点登录;而OIDC除了单点登录,还可以为第三方软件提供授权服务

相关文章:

前端从普通登录到单点登录(SSO)

随着前端登录场景的日益复杂化和技术思想的不断演进,前端在登录方面的知识结构变得越来越复杂。对于前端开发者来说,在日常工作中根据不同的登录场景提供合适的解决方案是我们的职责所在,本文将梳理前端登录的演变过程。 1、无状态的HTTP H…...

考研总计划(基础篇)

分为数学,专业课,英语三个部分 数学规划表 高数基础:3月初到4月15号 具体实行计划:分为看课日和写题日 看课日:早上10点到12点半看课,19:30到21:30继续看课。 写题日:早上10点到12点半复习前一天的题目&#xff0…...

力扣周赛387

第一题 代码 package Competition.The387Competitioin;public class Demo1 {public static void main(String[] args) {}public int[] resultArray(int[] nums) {int ans[]new int[nums.length];int arr1[]new int[nums.length];int arr2[]new int[nums.length];if(nums.leng…...

部署PhotoMaker通过堆叠 ID 嵌入自定义逼真的人物照片

PhotoMaker只需要一张人脸照片就可以生成不同风格的人物照片,可以快速出图,无需额外的LoRA培训。 安装环境 python 3.10gitVisual Studio 2022 安装依赖库 git clone https://github.com/bmaltais/PhotoMaker.git cd PhotoMaker python -m venv venv…...

挑战杯 基于深度学习的中文情感分类 - 卷积神经网络 情感分类 情感分析 情感识别 评论情感分类

文章目录 1 前言2 情感文本分类2.1 参考论文2.2 输入层2.3 第一层卷积层:2.4 池化层:2.5 全连接softmax层:2.6 训练方案 3 实现3.1 sentence部分3.2 filters部分3.3 featuremaps部分3.4 1max部分3.5 concat1max部分3.6 关键代码 4 实现效果4.…...

关于RSA公私钥加密报错Data must not be longer than 117 bytes问题解决办法

一、问题描述 1.背景 大家都知道,在日常项目开发过程中,数据的传输安全一直都是值得重视的问题,当然了市面上解决此类办法的技术也有很多,本项目在提供给第三方使用是数据以及校验第三方传递的参数,采用常用的RSA公私…...

【云原生】kubeadm快速搭建K8s集群Kubernetes1.19.0

目录 一、 Kubernetes 的概述 二、服务器配置 2.1 服务器部署规划 2.2服务器初始化配置 三、安装Docker/kubeadm/kubelet【所有节点】 3.1 安装Docker 3.2 添加阿里云YUM软件源 3.3 安装kubeadm,kubelet和kubectl 四、部署Kubernetes Master 五、部署Kube…...

Android 开发环境搭建的步骤

本文将为您详细讲解 Android 开发环境搭建的步骤。搭建 Android 开发环境需要准备一些软件和工具,以下是一些基础步骤: 1. 安装 Java Development Kit (JDK) 首先,您需要安装 Java Development Kit (JDK)。JDK 是 Android 开发的基础&#xf…...

六、继承(一)

1 继承的引入 以往我们想分别实现描述学生、老师的类,可能会这样子做: class Student {string _name;string _number;int _tel;int id;string _address;int _age; }; class Teacher {string _name;int _level;int _tel;int id;string _address;int _ag…...

数字化转型导师鹏:政府数字化转型政务服务类案例研究

政府数字化转型政务服务类案例研究 课程背景: 很多地方政府存在以下问题: 不清楚标杆省政府数字化转型的政务服务类成功案例 不清楚地级市政府数字化转型的政务服务类成功案例 不清楚县区级政府数字化转型的政务服务类成功案例 课程特色&#x…...

解决ODOO12 恢复数据库提示内存不够报错

1. 现象 点击 ‘restore database’ 控制台报错: 2. 解决措施 a. 进入启动脚本的文件夹 cd odoo/odoo-12.0/输入命令 ./odoo-bin --addons-pathaddons --databaseodoo --db_userodoo --db_passwordodoo --db_hostlocalhost --db_port5432 -i INITb. 刷新页面…...

关于数据提交上传服务端的数据类型以及项目打包上线的流程

1 请求头的类型: content-type; 01: application/json 数据以json格式请求:{"key":"value"} 02: application/x-www.form-urlencoded from表单的数据格式 name"zs"&age12 03 mutipart/form-data…...

儿童悬吊训练系统:改善脑性麻痹儿童平衡感与运动能力的有效途径

脑性麻痹(CP)是一种运动障碍,常常由于早期的运动皮层损伤而引起。这种损伤可能导致姿势、操纵技能和行走能力的差异。平衡控制不良是 CP 患儿面临的一项主要挑战,它可能导致动作控制异常以及步态问题,从而影响日常活动…...

ElasticSearch之文档的存储

写在前面 本文看下文档的存储相关内容。 1:如何确定文档存储在哪个分片? 我们需要确保文档均匀分布在所有的分片中,避免某些部分机器空闲,部分机器繁忙的情况出现,想要实现均匀分布我们可以考虑如下的几种分片路由算…...

在Redhat 7 Linux上安装llama.cpp [ 错误stdatomic.h: No such file or directory]

前期准备 在github上下载llama.cpp或克隆。 GitHub - ggerganov/llama.cpp: LLM inference in C/C ​ git clone https://github.com/ggerganov/llama.cpp.gitcd llama.cpp 执行make命令编译llama.cpp make 在huggingface里下载量化了的 gguf格式的llama2模型。 https:/…...

linux 常用 命令行HTTP客户端

在Linux环境中,命令行HTTP客户端是一种用于发送HTTP请求的工具,它们通常用于测试网站、服务器或API的响应。这些客户端支持各种HTTP方法,如GET、POST、PUT、DELETE等,并允许用户设置请求头、发送数据等。以下是一些常用的命令行HT…...

深入理解@Param注解:用于参数映射的利器

摘要:Param注解在Java开发中被广泛应用,它可以优雅地解决方法参数与SQL语句中占位符的映射问题,提高代码的可读性和可维护性。本文将深入探讨Param注解的背景、使用方法、解决的问题、映射原理,并对使用与不使用Param注解的情况进…...

OCP Secure boot必要特性

三点必需要求: The platform components must: 1. Provide a mechanism for securely anchoring a root of trust public key. // 提供一种用于安全地锚定信任根公钥的机制。 2. Verify the device firmware digital signature using the anchored public key /…...

全新攻击面管理平台

首页大屏 内测阶段,免费试用一个月 有兴趣体验的师傅,来长亭云图极速版群里找我 py...

在VMware中安装CentOS 7并配置Docker

VMware安装CentOS 7 一、介绍 该文章介绍如何使用启动U盘在虚拟机里面安装系统,虚拟机版本为VMware Workstation 16 pro,Linux版本为CentOS Linux release 7.9.2009 (Core)。 二、安装 1、创建虚拟机 点击创建新的虚拟机 选择典型就可以了&#xf…...

IDEA运行Tomcat出现乱码问题解决汇总

最近正值期末周,有很多同学在写期末Java web作业时,运行tomcat出现乱码问题,经过多次解决与研究,我做了如下整理: 原因: IDEA本身编码与tomcat的编码与Windows编码不同导致,Windows 系统控制台…...

Qt/C++开发监控GB28181系统/取流协议/同时支持udp/tcp被动/tcp主动

一、前言说明 在2011版本的gb28181协议中,拉取视频流只要求udp方式,从2016开始要求新增支持tcp被动和tcp主动两种方式,udp理论上会丢包的,所以实际使用过程可能会出现画面花屏的情况,而tcp肯定不丢包,起码…...

以下是对华为 HarmonyOS NETX 5属性动画(ArkTS)文档的结构化整理,通过层级标题、表格和代码块提升可读性:

一、属性动画概述NETX 作用:实现组件通用属性的渐变过渡效果,提升用户体验。支持属性:width、height、backgroundColor、opacity、scale、rotate、translate等。注意事项: 布局类属性(如宽高)变化时&#…...

Objective-C常用命名规范总结

【OC】常用命名规范总结 文章目录 【OC】常用命名规范总结1.类名(Class Name)2.协议名(Protocol Name)3.方法名(Method Name)4.属性名(Property Name)5.局部变量/实例变量(Local / Instance Variables&…...

JVM垃圾回收机制全解析

Java虚拟机(JVM)中的垃圾收集器(Garbage Collector,简称GC)是用于自动管理内存的机制。它负责识别和清除不再被程序使用的对象,从而释放内存空间,避免内存泄漏和内存溢出等问题。垃圾收集器在Ja…...

视频字幕质量评估的大规模细粒度基准

大家读完觉得有帮助记得关注和点赞!!! 摘要 视频字幕在文本到视频生成任务中起着至关重要的作用,因为它们的质量直接影响所生成视频的语义连贯性和视觉保真度。尽管大型视觉-语言模型(VLMs)在字幕生成方面…...

C++.OpenGL (10/64)基础光照(Basic Lighting)

基础光照(Basic Lighting) 冯氏光照模型(Phong Lighting Model) #mermaid-svg-GLdskXwWINxNGHso {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-GLdskXwWINxNGHso .error-icon{fill:#552222;}#mermaid-svg-GLd…...

前端开发面试题总结-JavaScript篇(一)

文章目录 JavaScript高频问答一、作用域与闭包1.什么是闭包(Closure)?闭包有什么应用场景和潜在问题?2.解释 JavaScript 的作用域链(Scope Chain) 二、原型与继承3.原型链是什么?如何实现继承&a…...

实现弹窗随键盘上移居中

实现弹窗随键盘上移的核心思路 在Android中&#xff0c;可以通过监听键盘的显示和隐藏事件&#xff0c;动态调整弹窗的位置。关键点在于获取键盘高度&#xff0c;并计算剩余屏幕空间以重新定位弹窗。 // 在Activity或Fragment中设置键盘监听 val rootView findViewById<V…...

在鸿蒙HarmonyOS 5中使用DevEco Studio实现企业微信功能

1. 开发环境准备 ​​安装DevEco Studio 3.1​​&#xff1a; 从华为开发者官网下载最新版DevEco Studio安装HarmonyOS 5.0 SDK ​​项目配置​​&#xff1a; // module.json5 {"module": {"requestPermissions": [{"name": "ohos.permis…...