前端从普通登录到单点登录(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除了单点登录,还可以为第三方软件提供授权服务

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

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

相关文章

【面试题】webpack的五大核心、构建流程、性能优化

【面试题】webpack的五大核心、webpack的构建流程、webpack的性能优化 webpack是什么?webpack的五大核心webpack的构建流程webpack性能优化 webpack是什么? js静态模块打包工具。 功能 将多个文件打包成更小的文件,(压缩)翻译 babal-loader es6进行降级兼容。 …

合泰HT66F2390----定时器中断学习笔记

前言 无需多言 直接开始定时器中断 的学习 通过上次的PWM学习&#xff0c;上次用的是周期型TM定时器模块 这次使用标准型TM定时器模块&#xff08;STM&#xff09; 代码 #include <HT66F2390.h>void Timer0_Init(void){_stm0c0 0b00001000;_stm0c1 0b11000001;_stm…

基于巨控GRM561/562/563Y西门子1200PLC发邮件

巨控GRM560,GRM600系列同比之前的GRM530&#xff0c;除短信&#xff0c;微信&#xff0c;电话语音播报增加了邮件发送功能&#xff0c;简单介绍一下PLC发邮件。 1在博途中建立好DB块 2.打开GRMDEV6&#xff0c;新建工程&#xff0c;做好数据采集&#xff0c;这里以DB4.D0&#…

三大数学软件之Maple

相信钻研数学的小伙伴们对MATLAB、SPSS这样的重量级软件并不陌生&#xff0c;这些大型软件能求解复杂的运算&#xff0c;解决各领域的数学问题。今天博主为大家带来了一款名不见经传的软件——Maple&#xff0c;作为三大数学软件之一&#xff0c;Maple同样拥有不菲的计算能力&a…

Java设计模式:工厂模式之简单工厂、工厂方法、抽象工厂(三)

本文将详细介绍Java中工厂模式的多种实现方式&#xff0c;包括简单工厂模式、工厂方法模式和抽象工厂模式。我们将通过示例代码和解释来阐述每种工厂模式的特点、使用场景以及优缺点&#xff0c;帮助读者更好地理解和应用这些设计模式。 [参见]&#xff1a; Java设计模式&…

sqoop-import 详解

文章目录 前言一、介绍1. sqoop简介2. sqoop import的作用3. 语法3.1 sqoop import 语法3.2 导入配置属性 二、导入参数1. 常见参数2. 验证参数3. 导入控制参数4. 用于覆盖映射的参数5. 增量导入参数6. 输出行格式参数7. 输入解析参数8. Hive 参数9. HBase 参数10. Accumulo 参…

栈和队列之队列

1.队列 1.1队列的概念 队列&#xff1a;只允许在一端进行插入数据操作&#xff0c;在另一端进行删除数据操作的特殊线性表&#xff0c;队列具有先进先出 FIFO(First In First Out) 入队列&#xff1a;进行插入操作的一端称为队尾 出队列&#xff1a;进行删除操作的一端称为队…

数学建模【基于熵权法对TOPSIS模型的修正】

一、修正原因 在前面有关于TOPSIS法和熵权法的介绍&#xff0c;我们可以知道TOPSIS有一个和层次分析法共有的问题&#xff0c;就是各个指标的权重是由我们主观或根据专家的主观评价估计的。层次分析法这个问题还更甚之。而恰好熵权法中的权重是由数据确定的&#xff0c;绝对客…

009-CSS-Less、Scss、Sass

Less、Scss、Sass 概念常用的扩展能力1、嵌套&#xff1a;代码层级清晰2、变量&#xff1a;项目风格抽离3、混合&#xff1a;公共样式封装4、&&#xff1a;当前选择器的父级5、导入&#xff1a;公共文件抽离 在实际工作中&#xff0c;CSS 编写更多的采用 CSS 扩展语言&…

Git 撤销修改

如果我们在我们的工作区写了很长时间代码&#xff0c;发现出现错误&#xff0c;想回退到之前的版本&#xff0c;这时改怎么做呢&#xff1f; 情况一&#xff1a;对于工作区的代码&#xff0c;还没有 add 我们当然也可以使用git diff 查看与上次提交的差异&#xff0c;进行手动删…

【场景题】让你设计一个订单号生成服务,该怎么做?

方案 当设计订单号生成服务时&#xff0c;我们需要考虑唯一性、数据量、可读性、基因法、可扩展性、高性能和高可用性等多个方面。根据这些考虑&#xff0c;一个简单的订单号生成服务设计方案可以采取以下措施&#xff1a; 使用Snowflake算法或第三方分布式ID生成器&#xff…

【力扣经典面试题】58. 最后一个单词的长度

目录 一、问题描述 二、解题思路 三、代码实现&#xff08;C版&#xff09; 四、总结 喜欢可以点赞关注哦&#xff01;谢谢大家哦 一、问题描述 给你一个字符串 s&#xff0c;由若干单词组成&#xff0c;单词前后用一些空格字符隔开。返回字符串中 最后一个 单词的长度。 单词 …

PackagesNotFoundError:学习利用报错信息找到解决方法

反思&#xff1a;之前看到报错经常是直接复制报错信息去网上搜&#xff0c;但很多情况下报错信息里其实就给出了解决方案 报错信息&#xff1a; Collecting package metadata (current_repodata.json): done Solving environment: unsuccessful initial attempt using frozen …

FRM模型十五:净值归因之Fama_French三因子模型

文章目录 一、起源二、构建因子三、投资组合的净值归因1. 市场因子2. 规模因子3.价值因子4. 基于净值的归因方法 三、代码实现 一、起源 在多因子模型推出之前&#xff0c;CAPM模型被视为资产定价的第一标准。随着市场不断发展&#xff0c;发现了越来越多CAPM模型无法解释的现…

java中的this

在Java中&#xff0c;this 是一个关键字&#xff0c;用于引用当前对象。它可以用于访问当前对象的实例变量和方法。this 关键字通常在以下情况下使用&#xff1a;区分实例变量和局部变量&#xff1a;当实例变量和局部变量名称相同时&#xff0c;可以使用 this 关键字来引用实例…

【linux】crontab定时任务介绍

1.简介2.crontab语法3.crontab限制4.crontab配置文件5.crontab格式介绍 1.简介 Linux crontab 是用来定期执行程序的命令。 当安装完成操作系统之后&#xff0c;默认便会启动此任务调度命令。 crond 命令每分钟会定期检查是否有要执行的工作&#xff0c;如果有要执行的工作便…

u-boot的DM驱动模型

0、本文基于U-Boot 2022.01-v2.07版本进行分析。 1、u-boot编译流程简要分析 2、u-boot启动流程简要分析 3、u-boot增加自定义命令 4、u-boot的DM驱动模型 4.1、参考资料 Uboot中的DM驱动模型&#xff1a;这篇文章详细介绍了DM驱动模型的原理。 本文重点整理了几个数据结构…

超详细的Scrapy框架的基本使用教程

Scrapy的介绍 scrapy的工作流程&#xff08;重点&#xff01;&#xff01;&#xff01;&#xff09; 如下图所示&#xff1a; 爬虫&#xff1a; 负责向引擎提供要爬取网页的URL&#xff0c;引擎会把这个URL封装成request对象并传递给调度器&#xff0c;把引擎传递过来的resp…

常用区块链安全关键名词和攻击方法解释

文章目录 一、重点名词解释1.1 钱包&#xff08;Wallet&#xff09;1.2 冷钱包(Cold Wallet)1.3 热钱包 &#xff08;Hot Wallet&#xff09;1.4 公钥(Public Key)1.5 私钥(Private Key)1.6 助记词(Mnemonic)1.7 Keystore1.8 公链(Public Blockchain)1.9 交易所 Exchange1.10 节…

API 常用的序列化协议详解

目录 JSON (JavaScript Object Notation) XML (Extensible Markup Language) Protocol Buffers (Protobuf) MessagePack Thrift Avro 小结 API&#xff08;Application Programming Interface&#xff0c;应用程序编程接口&#xff09;在软件开发中扮演着至关重要的角色…