当前位置: 首页 > 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…...

Android Wi-Fi 连接失败日志分析

1. Android wifi 关键日志总结 (1) Wi-Fi 断开 (CTRL-EVENT-DISCONNECTED reason3) 日志相关部分: 06-05 10:48:40.987 943 943 I wpa_supplicant: wlan0: CTRL-EVENT-DISCONNECTED bssid44:9b:c1:57:a8:90 reason3 locally_generated1解析: CTR…...

React 第五十五节 Router 中 useAsyncError的使用详解

前言 useAsyncError 是 React Router v6.4 引入的一个钩子,用于处理异步操作(如数据加载)中的错误。下面我将详细解释其用途并提供代码示例。 一、useAsyncError 用途 处理异步错误:捕获在 loader 或 action 中发生的异步错误替…...

【Redis技术进阶之路】「原理分析系列开篇」分析客户端和服务端网络诵信交互实现(服务端执行命令请求的过程 - 初始化服务器)

服务端执行命令请求的过程 【专栏简介】【技术大纲】【专栏目标】【目标人群】1. Redis爱好者与社区成员2. 后端开发和系统架构师3. 计算机专业的本科生及研究生 初始化服务器1. 初始化服务器状态结构初始化RedisServer变量 2. 加载相关系统配置和用户配置参数定制化配置参数案…...

【android bluetooth 框架分析 04】【bt-framework 层详解 1】【BluetoothProperties介绍】

1. BluetoothProperties介绍 libsysprop/srcs/android/sysprop/BluetoothProperties.sysprop BluetoothProperties.sysprop 是 Android AOSP 中的一种 系统属性定义文件(System Property Definition File),用于声明和管理 Bluetooth 模块相…...

Linux --进程控制

本文从以下五个方面来初步认识进程控制: 目录 进程创建 进程终止 进程等待 进程替换 模拟实现一个微型shell 进程创建 在Linux系统中我们可以在一个进程使用系统调用fork()来创建子进程,创建出来的进程就是子进程,原来的进程为父进程。…...

鸿蒙DevEco Studio HarmonyOS 5跑酷小游戏实现指南

1. 项目概述 本跑酷小游戏基于鸿蒙HarmonyOS 5开发,使用DevEco Studio作为开发工具,采用Java语言实现,包含角色控制、障碍物生成和分数计算系统。 2. 项目结构 /src/main/java/com/example/runner/├── MainAbilitySlice.java // 主界…...

初学 pytest 记录

安装 pip install pytest用例可以是函数也可以是类中的方法 def test_func():print()class TestAdd: # def __init__(self): 在 pytest 中不可以使用__init__方法 # self.cc 12345 pytest.mark.api def test_str(self):res add(1, 2)assert res 12def test_int(self):r…...

在web-view 加载的本地及远程HTML中调用uniapp的API及网页和vue页面是如何通讯的?

uni-app 中 Web-view 与 Vue 页面的通讯机制详解 一、Web-view 简介 Web-view 是 uni-app 提供的一个重要组件,用于在原生应用中加载 HTML 页面: 支持加载本地 HTML 文件支持加载远程 HTML 页面实现 Web 与原生的双向通讯可用于嵌入第三方网页或 H5 应…...

rnn判断string中第一次出现a的下标

# coding:utf8 import torch import torch.nn as nn import numpy as np import random import json""" 基于pytorch的网络编写 实现一个RNN网络完成多分类任务 判断字符 a 第一次出现在字符串中的位置 """class TorchModel(nn.Module):def __in…...

Go 语言并发编程基础:无缓冲与有缓冲通道

在上一章节中,我们了解了 Channel 的基本用法。本章将重点分析 Go 中通道的两种类型 —— 无缓冲通道与有缓冲通道,它们在并发编程中各具特点和应用场景。 一、通道的基本分类 类型定义形式特点无缓冲通道make(chan T)发送和接收都必须准备好&#xff0…...