授权协议OAuth 2.0之通过OIDC实现SSO

news2024/10/6 13:58:19

写在前面

本文来一起看下OIDC(openid connect)相关内容。

1:什么是OIDC

OIDC的全称是openid connect,和OAuth2.0一样,也是属于协议和规范的范畴。OAuth2.0是一种授权协议,即规定了what you can do的内容。而OIDC是OAuth2.0的超集,不仅规定了what you can do,还定义了who you are的内容,即OIDC不仅是授权协议,也是一种认证协议。实际上,OIDC也正是在OAuth2.0的基础上做了扩展,从而支持了身份认证的功能,如下图:
在这里插入图片描述

为了更加容易理解OIDC,我们先来回一下OAuth2.0所包含的4个角色:

1:受保护资源的拥有者
    一般是我们自己
2:受保护的资源
    一般就是HTTP的接口形式的API,当然也可以是其他形式
3:三方软件
    一般是希望拿到受保护资源的角色
4:授权服务器
    给客户端完成授权的角色

OIDC要做的事情是用户通过认证服务器来证明自己的身份,从而访问三方服务,所以OIDC包含如下3个角色:

用户:规范中叫End User,即EU
认证服务器:规范中叫OpenID Provider,即OP
三方服务:规范中叫relying party,依赖方,即RP

如果要把OAuth2.0的四个角色和OIDC的3个角色做对比的话,可以按照下面这种关系来理解:
在这里插入图片描述

接下来我们来看下OIDC规范中定义的流程,就会更加明白它就是在OAuth2.0的基础上做了认证相关的扩展了:
在这里插入图片描述
是不是和OAuth2.0的流程基本上完全一样,除了code换取令牌时多了id_token,而这里的id_token也正是实现用户认证的关键所在,因为要使用其来标记用户的登录态,所以如下的信息是必须设置的:

* iss,令牌的颁发者,其值就是身份认证服务(OP)的 URL。
* sub,令牌的主题,其值是一个能够代表最终用户(EU)的全局唯一标识符。
* aud,令牌的目标受众,其值是三方软件(RP)的 app_id。
* exp,令牌的到期时间戳,所有的 ID 令牌都会有一个过期时间。
* iat,颁发令牌的时间戳。

如下代码:

String iss = "http://localhost:8899/auth";
String sub = userId;
String aud = appId;
Date exp = new Date(System.currentTimeMillis() + 10000);
Date iat = new Date((System.currentTimeMillis()));
String idToken = JwtUtils.generateIdTokenJwt(iss, sub, aud, exp, iat);

RP在获取到id_token之后,就可以获取到其中的用户关键信息,来标记用户的登录态了。

接着我们来看下如何使用OIDC来实现SSO。

2:SSO

使用OIDC实现SSO的流程如下:
在这里插入图片描述
其中,如果是认证服务判断用户已经登录,就不会要求用户重新登录了,而只是回调code,让RP获取ID_token和access_token,这也是实现SSO的关键所在。

2.1:SSO实战

源码 。

以下点需要注意:

1:简单起见,RP,OP都放在一个项目中了,工程上他们应该是独立的项目
2:例子中有RP,也是在一个项目中的,工程上他们也应该是独立的项目
3:简单起见,省略了在OP中注册RP的步骤,注册是为了获取合法的客户端标识app_id,app_secret等,这和授权是一样的。工程上OP需要提供这样的注册功能
4:简单起见,OP中省略很多很多的安全性校验,比如app_id的校验,回调地址的合法性校验等,工程上,这些校验必不可少,一定要注意

首先我们访问第一个RP:http://localhost:8899/app1/index
在这里插入图片描述
点击:
在这里插入图片描述
点击登录:
在这里插入图片描述
成功登录,此时我们还会将sub信息记录到浏览器中(记录的是用户id),这样下次访问时RP就可以咨询OP当前用户是否登录了:
在这里插入图片描述
当然,具体如何记录登录态的信息,你可以根据具体的情况来处理,不一定非得这样子实现。

好,接着我们再来访问RP 2http://localhost:8899/app2/index
在这里插入图片描述
此时直接就访问了,而不需要重新登陆。

当然,如果是将localstorage中的内容删除的话,就又要重新登陆了:
在这里插入图片描述
在这里插入图片描述

写在后面

参考文章列表

如何通过 OIDC 协议实现单点登录?[通俗易懂]

多知道一点

联合登陆,单点登录

比如你开发了一个三方软件,希望使用微信,微博,等来直接登录,就叫做联合登录。

比如你公司有n个系统,这n个系统是一家子的,你希望在其中任何一个系统中登录之后,再去访问其他的任何一个系统都不需要登录,这种功能或者是效果就叫做单点登录。

其实联合登录和单点登录是很相似的,比如联合登录需要你到比如微信的OP来验证微信的的登陆状态,而单点登录是需要你输入你在自己的系统中注册的用户名密码信息,然后到自己的OP中验证用户名密码从而完成登录。

进一步看,二者都可以分为两种情况来分析:

  • 未登录时
联合登录:会跳转到微信,让你登录微信
单点登录:会弹出自己家的登录页面,让你输入用户名密码登录
  • 已登录时
联合登陆:微信会问你是否允许授权登录,你同意就登陆了
单点登录:因为是自家的应用,所以也就不问你了,直接就登陆了

OIDC基于OAuth2.0来做扩展是一个明智的选择吗?

必须是,站在巨人的肩膀上永远是一个明智的正确的不能更正确选择。

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

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

相关文章

kafka部分partition的leader=-1修复方案整理

kafka部分partition的leader-1修复方案整理 1. 背景说明2. 修复测试2.1 创建正常的topic并验证生产和消费2.2 停止kafka模拟leader-12.3 修复parition2.4 修复完成验证生产消费是否恢复 3. 疑问和思考3.1 kafka在进行数据消费时,如果有partition的leader-1&#xff…

MySQL基础之多表操作(多表查询,事务,索引)

目录 一、多表关系1.1 一对多1.2 外键约束1.3 一对一1.4 多对多 二、多表查询2.1 测试数据准备2.2 笛卡尔积2.3 内连接2.4 外连接2.5 子查询1.标量子查询2.列子查询3.行子查询4.表子查询 三、事务3.1 问题场景引入3.2 概念3.3 事务操作3.4 事务的四大特性ACID 四、索引4.1 概念…

人工智能高速发展 苹果能否赶上AI热潮

近年来,人工智能高速发展,科技大佬们竞相布局人工智能赛道。苹果虽然“晚”了一步,但也在不断追赶这股热潮。随着AI技术不断发展,这项技术已经成为手机发展的新风向标,甚至2024年被视为AI手机元年。 众多手机厂商铆足了…

vue做导入导出excel文档

系统中经常会遇到要实现批量导入/导出数据的功能,导入就需要先下载一个模板,然后在模板文件中填写内容,最后导入模板,导出就可能是下载一个excel文件。 1、导出 新建一个export.js文件如下: import {MessageBox,Mes…

【Xilinx】时序约束学习 TIMING-2: 基准时钟源管脚无效

在错误的管脚 <pin_name> 上创建了基准时钟 <clock_name>。建议仅在适当的时钟根&#xff08;不含时序弧的输入端口或原语输出管脚&#xff09; 上创建基准时钟。 描述 基准时钟必须在时钟树的源时钟上定义。例如&#xff0c; 源时钟可能是设计的输入端口。如果在…

4.20.1 深度神经网络提高放射科医生在乳腺癌筛查中的表现

新颖的两阶段神经网络&#xff0c;用于将全局和局部信息与适当的训练过程结合起来。这使我们能够使用非常高容量的块级网络从像素级标签中学习&#xff0c;同时网络也可以从宏观乳房级标签中学习。模型可以生成可解释的热图&#xff0c;指示可疑发现的位置。即使在拥有大量图像…

Neo4j数据库(二)

目录 WHERE子句 简单WHERE子句语法 复杂WHERE子句语法 DELETE删除 删除节点 DELETE节点子句语法 REMOVE删除 删除节点/关系的属性 REMOVE属性子句语法 SET子句 SET子句语法 WHERE子句 像SQL一样&#xff0c;Neo4j CQL在CQL MATCH命令中提供了WHERE子句来过滤MATCH查询…

VMware-Linux切换桥接模式上网教程(超详细)

这里写目录标题 1. 虚拟机关机2. VMware 虚拟网络配置2.1 检查是否存在 VMnet02.2 修改桥接模式2.3 修改Linux虚拟机网络适配器 3. Linux 系统配置3.1 修改系统网卡配置3.1.1 配置项含义解释3.1.2 查看物理机网络信息3.3.3 修改配置 3.2 重启服务 4. 测试网络连接情况5. 注意事…

Oracle Analytics BIEE 操作方法(四)仪表盘导出“区域”不换行也不合并居中的方法

1 分析 取消所有区域内列格式里面的换行 2 仪表盘 点击“工具” 打印和导出选项 设置固定列宽&#xff08;范围是&#xff1a;0-300&#xff09;

图片像素高效处理,轻松将图片像素进行按比例缩小50%并保存在指定位置,让您的图像更精致!

图像与我们的日常生活紧密相连&#xff0c;从社交媒体分享到专业摄影作品展示&#xff0c;高质量的图片像素处理显得至关重要。然而&#xff0c;面对海量的图片数据和高分辨率的图像处理需求&#xff0c;如何高效、简便地进行像素调整成为了众多用户关注的焦点。 第一步&#…

怎么通过PHP语言实现远程控制门锁

怎么通过PHP语言实现远程控制门锁呢&#xff1f; 本文描述了使用PHP语言调用HTTP接口&#xff0c;实现控制门锁&#xff0c;通过智能出门开关&#xff0c;配合普通的电插锁、电磁锁&#xff0c;来实现门禁控制。 可选用产品&#xff1a;可根据实际场景需求&#xff0c;选择对应…

有时候知道自己该去做什么,但就是不去行动,怎么办?

只要有想法&#xff0c;马上就去办&#xff01;马上、及时、立刻去办&#xff01;这可能是唯一解决这个问题的方法&#xff0c;您办完事情之后的感觉会有极强的满足感&#xff0c;然后再逐步慢慢的开始您所有的计划安排&#xff0c;一定会水到渠成&#xff01;您可能不信&#…

4.3网安学习第四阶段第三周回顾(个人学习记录使用)

本周重点 ①Java入门基础 ②Java方法入门 ③Java面向对象(**重点) ④Java的Maven构建项目工具 ⑤Java其他操作补充 ⑥Java序列化和反序列化 ⑦Url 的DNS 审计链(**难点) ⑧Springboot和前端数据分离(主流使用) ⑨Common Collections(CC链漏洞) 本周主要内容 ①Java入…

GDPU unity游戏开发 碰撞体与关节

让你设计的角色跑起来吧&#xff0c;可以是动画&#xff0c;也可以是碰撞器的运动。 运动小车 找到小车素材&#xff0c;导入到层级面板。然后可以新建一个地面让小车在上面运动&#xff0c;新建一个方块当障碍物。 摆放好后&#xff0c;要加组件。记住&#xff0c;在unity中运…

算法刷题day47

目录 引言一、滑动窗口二、单调栈三、繁忙的都市 引言 今天把所有的最短路算法和最小生成树算法又给复习了一下&#xff0c;有 s p f a , 朴素版 d i j k s t r a , 堆优化版 d i j k s t r a , f l o y d , p r i m , k r u s k a l spfa,朴素版dijkstra,堆优化版dijkstra,f…

顺序栈算法库构建

学习贺利坚老师,顺序栈,构建顺序栈算法库 数据结构之自建算法库——顺序栈_设计一个主函数实现对顺序栈进行操作测试&#xff0c;测试方法&#xff0c;依次把元素-CSDN博客文章浏览阅读4.9k次&#xff0c;点赞10次&#xff0c;收藏10次。本文针对数据结构基础系列网络课程(2)&…

基于模糊控制的纯跟踪横向控制在倒车中的应用及实现

文章目录 1. 引言2. Pure Pursuit在倒车场景的推导3. 模糊控制器的设计3.1 基础知识3.2 预瞄距离系数k的模糊控制器设计 4. 算法和仿真实现 1. 引言 Pure Pursuit是一种几何跟踪控制算法&#xff0c;也被称为纯跟踪控制算法。他的思想就是基于当前车辆的后轮中心的位置&#x…

基于OpenCV+QT的人脸识别打卡项目

1.基本概念 基于OpenCV的人脸识别是一个多步骤的过程&#xff0c;通常涉及以下步骤&#xff1a; 人脸检测&#xff1a;使用Haar级联或深度学习模型来检测图像中的面部区域。OpenCV提供了预训练的Haar级联分类器&#xff0c;可以用于快速检测。 特征提取&#xff1a;一旦检测到…

如何快速学习盲打键盘的指法

学习盲打键盘的指法需要一定的时间和练习&#xff0c;但是以下几个方法可以帮助你加快学习的速度&#xff1a; 掌握正确的手位&#xff1a;了解标准的键盘布局以及手指应该放置的位置是学习盲打的第一步。在QWERTY键盘上&#xff0c;你的左手应该放在ASDF键上&#xff0c;右手应…

Win10 搭建 YOLOv8 运行环境(20240423)

一、环境要求 1、Python&#xff0c;版本要求>3.7 2、PyTorch&#xff0c;版本要求>1.7。PyTorch 是一个开源的深度学习平台&#xff0c;为人工智能研究提供了一个灵活的、易于使用的工具集。YOLOv8 是基于 PyTorch 框架实现的&#xff0c;所以需要安装 PyTorch。 3、CUD…