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

写在前面

本文来一起看下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.mfbz.cn/a/570630.html

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

相关文章

2024 证券从业资格证考试备考资料分享

2024 证券从业资格证考试备考资料分享 2024 年 06月1、2日 证券从业资格考试全国统一考试(统考),预计将于5月初(考前一个月)左右开启报名 有没有小伙伴在准备备考的,不知道大家都准备怎么学习呢&#xff…

前端css中keyframes(关键帧)的简单使用

前端css中keyframes的使用 一、前言二、例子(一)、例子源码1(二)、源码1运行效果1.视频效果2.截图效果 三、结语四、定位日期 一、前言 关键帧keyframes是css动画的一种,主要用于定义动画过程中某一阶段的样式变化&am…

【小白误闯】这可能是对 Tomcat 工作原理解释最详细的文章

脑子一闪而过,当年 V 哥在面试 Java 开发时,被问到让你写一个 Tomcat 服务器,你有什么想法?尼码,面试官摆明是在压工资了,你得逞了,我回答不上来,当时也没研究过 Tomcat 的源码&…

Codeforces Round 940 E. Carousel of Combinations 【威尔逊定理】

题意 给定一个正整数 n n n,定义 C ( i , j ) C(i, j) C(i,j) 为:从 ( 1 , 2 , 3 , . . . , i ) (1,2,3,...,i) (1,2,3,...,i) 中选出 j j j 个不同的数,构成一个圆排列的不同的方案数 求出: ∑ i 1 n ∑ j 1 i ( C ( i ,…

STM32的GPIO控制寄存器开发

寄存器GPIO控制 寄存器地址 寄存器地址计算 某个寄存器地址,由三个参数决定:1、总线基地址(BUS_BASE_ADDR);2,外设基于总线基地址的偏移量(PERIPH_OFFSET);3&#xff…

Linux系统CPU持续飙高,如何排查

若一台服务器CPU使用率持续处于一个高峰值,可能导致如:无法ssh链接、操作卡顿、用户访问超时等问题 1.查看CPU使用情况 top命令常用于分析内存指标使用情况 htop命令更直观于top 当CPU达到70%-80%以上时,使用率已过高需要处理 2.找出CPU占…

C++ Qt QMainWindow实现无边框窗口自定义标题栏可拖拽移动拉伸改变窗口大小

本篇博客介绍C Qt QMainWindow实现无边框窗口,适用于win10/win11系统。 QMainWindow相对于QWidget多了dockedwidget功能,跟多人可能更喜欢用QMainWindow做主窗口,如果不需要dockedwidget功能,QMainWindow与QWidget做主窗口基本无…

一款新型的Linux服务器管理工具

最近发现了一款新型的Linux服务器管理工具,名称叫1Panel,本文跟大伙分享一下。 一. 产品介绍 1Panel 是一个开源的 Linux 服务器运维管理面板,具有丰富的功能,可对服务器和容器进行管理。 产品提供简洁直观的We图形界面&#x…

如何使用RRT模式进行交易,昂首资本实例讲解

在上篇文章中,昂首资本用一篇文章讲解了,如何使用RRT模式进行交易以及背后的原理。如果没有看到的各位投资者可以往前翻一下,当然了也有投资者提到了新的问题,那就如何使用,今天昂首资本就用下面有几个例子实例讲解&am…

【C++】---STL之list详解

【C】---STL之list详解 一、了解list的基本信息二、成员函数1、构造2、迭代器3、empty()4、size()5、front()6、back()7、push_front()8、pop_front()9、push_back()10、pop_back()11、insert()12、erase()13、swap()14、sort()15、reverse() 一、了解list的基本信息 1、库里面…

windows查看xxx的版本号

node -v python --version redis-server --version java -version go version mvn -version git --version

【python】随机模拟——赶火车问题、醉汉回家

问题描述 1.赶火车问题。2.模拟二维随机游动(醉汉回家) 1.赶火车问题。 一列列车从A站开往B站,某人每天赶往B站上车。他已经了解到火车从A站到B站的运行时间是服从均值为30min,标准差为2min的正态随机变量。火车大约下午13&#…

Linux 深入理解Linux文件系统与日志分析

在Linux系统中,文件名和文件数据是分开存储的 文件数据包含 元信息(即不包含文件名的文件属性) 和 实际数据 文件元信息存储在 inode(索引节点)里, 文件实际数据存储在 block(块)里; 文件名存储在目录块里 查看文件的元信息 stat 文件名 [ro…

曲线救国|基于函数计算FC3.0部署AI数字绘画stable-diffusion

曲线救国|基于函数计算FC3.0部署AI数字绘画stable-diffusion 基于函数计算FC2.0部署AI数字绘画stable-diffusion基于函数计算FC3.0部署AI数字绘画stable-diffusion总结 在经过了上一次曲线救国失败经历之后,失败经历参考博文:https://developer.aliyun.c…

C++ —— 继承

什么是继承? 继承是指一种代码可以被复用的机制,在一个类的基础上进行扩展,产生的新类叫做派生类,被继承的类叫基类。(也可称为子类和父类) 继承的写法: class B : 继承方式 A (…

MCU功耗测量

功耗测量 一、相关概念二、功耗的需求三、测量仪器仪表测量连接SMU功能SMU性能指标 四、功耗测量注意点板子部分存在功耗MCU方面,可能存在干扰项仪器仪表方面 一、相关概念 静态功耗和动态功耗:动态功耗为运行功耗,功耗测量注重每MHz下的功耗…

智能调度|AIRIOT智能车队管理解决方案

客运、货运、汽车租赁、出租运营等行业对车辆管理、车队管理以及司乘人员的管理方式,逐渐向数字化和智能化转型。传统的依赖人工调度、记录和跟踪的管理模式已经难以满足业务发展需要,存在如下痛点: 实时监控与定位功能弱:无法实时…

实验4 数字频率计

实验目的: 1、使用铆孔U7输出一个脉冲,频率不定。 2、使用铆孔V7测量脉冲频率,并在数码管上显示。 实验内容及步骤: 设计原理 测量频率的方法有很多,按照其工作原理分为无源测量法、比较法、示波器法和计数法等。…

restful请求风格的增删改查-----修改and删除

一、修改&#xff08;和添加类似&#xff09; 前端&#xff1a; <script type"text/javascript">function update(){//创建user对象var user {id:$("#id").val(),username:$("#username").val(),password:$("#password").val…

aweraweg

c语言中的小小白-CSDN博客c语言中的小小白关注算法,c,c语言,贪心算法,链表,mysql,动态规划,后端,线性回归,数据结构,排序算法领域.https://blog.csdn.net/bhbcdxb123?spm1001.2014.3001.5343 给大家分享一句我很喜欢我话&#xff1a; 知不足而奋进&#xff0c;望远山而前行&am…
最新文章