以Azure为例的SSO

由于文章的篇幅有限,无法将全部的代码贴上来,如想要看完整案例,请在公众号文章中留言(其他平台很少看…毕竟最近印度同事的UI组件库搞得我好烦)


1.关于SSO

单点登录又称之为SSO,全称为 Single Sign On ,一般在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统。

比如,当我们使用一个腾讯旗下的产品时,我们一般会接入QQ登陆,此时就可以认为QQ登陆为我们的SSO。只要我们登录了QQ,就可以根据凭证获取到你在QQ中的信息,并登录该平台。

2.SSO流程

无论使用第三方或者是自己的sso,下面将以一个开发人员的角度,以QQ作为例子讲解一个SSO的过程,

1.当用户第一次登录平台A的时候,由于该平台使用了QQ的服务去获取用户信息,该平台会自动调用QQ的服务(比如跳转QQ登录),此时我们会设置一个RedirectURL的参数到qq的login服务上。

2.当用户从qq登录后,qq的后台服务会根据我们的 RedirectURL 参数,将一个token传到我们的Redirect的地址。

3.当我们的服务接收到了来自QQ服务器的一个重定向请求,且该请求还会带一个token,我们可以根据QQ文档去调用Api获取我们想要的信息,比如获取用户信息等。

4.当我们获取到用户的信息之后,我们用 JsonWebToken 的形式重新去设置我们的token,并且使用其作为前后端通讯的token。

在上述的过程中,我们使用第三方的SSO,是基于以下几个原因

  • qq本质上提供了用户的信息给我们,并且提供了一个便捷的,获取用户信息的api。
  • QQ作为一个维护多年的平台,对于权限以及用户管理等模块已经很完善了
  • 我们自己开发的话,我们需要花费大量的时间和精力,还不能保证一定没问题

3.关于Azure

上面的过程中,已经知道SSO的流程,想必大家都已经对SSO有了初步的认知,而选择一个SSO是要根据市场以及客户所用的SSO有关,比如对于外企,我们会选择Azure作为SSO,而不是选择很少外国人用的QQ。

Microsoft Azure 作为微软云计算,大公司背书.

最主要是我们的客户选择使用它,所以下面的例子会以其作为例子

4.使用SSO

不同平台的sso参数思路‘大差不差’,都是用 AppID + AppScrect 这一套,所以下面的例子也按照这个套路来介绍。

1.准备各类参数,其中最主要的参数是CLIENT_ID,TENANT_ID,CLIENT_SECRET。

//当前域名
LOGIN_REDIRECT=https://xxx.com
//重定向地址
OAUTH2_REDIRECT_URL=https://xxx.com/user/login_callback
//client_id,在app的详情中查看,由管理员给的
OAUTH2_CLIENT_ID=6aaaaaae-7aaa-4aaa-baaa-aaaaaaaaad89
//tent_id,可以理解为密钥。由管理员给的
OAUTH2_TENANT_ID=4266ec6c-fe9f-4893-82e9-996189e0b81b
//在Azure上生成的,验证机器是否允许登录
OAUTH2_CLIENT_SECRET=mvaaa~.qLgH8aaaaaaaaaTpnWaLD9Em-H3Z6gb_T

2.准备我们的登陆接口重定向到auzre的登陆接口

当用户调用我们的登陆接口时,我们会马上调用到Azure的服务去登陆。

  @Get('user/login')login(@Response() res) {res.redirect(this.userServie.processLogin());}
​

此时,浏览器的弹窗如下:

3.登陆成功后获取到用户的凭证

@Get('user/login_callback')async loginCallback(@Request() req, @Response() res) {let code = '';if (req.query.code) {code = req.query.code;const tokenInfo = await this.userServie.getAccessTokenByCode(code, req.log);// if redirect error, check cookie has refresh_tokenif (tokenInfo.error) {req.log.error(`user login callback error will redirect to login`);res.redirect('/login');} else {const { claimsInfo, user, groups } = this.userServie.processAccessToken(tokenInfo.access_token);
​if (!groups.includes(environmentConfig.azure.adGroupName)) {req.log.error('User not in AD group');res.status(400).json({ message: 'User not in AD group' });}
​
​req.log.info(`login user name is ${user.id}`);const redirectUrl = `${environmentConfig.cx.frontend_url}?t=${claimsInfo}`;res.redirect(redirectUrl);}} else {req.log.error('ADFS grant code not found');res.status(400).json({ message: 'ADFS grant code not found' });}}
​

上述代码中,流程在于获取到了azure的token之后,调用api获取用户信息,并生成新的token并给到前端。

4.根据凭证获取到用户的信息。

在上述代码中,我们完成了整个流程,但是最主要的核心代码如下

processAccessToken(azureToken) {const auzraUserInfo = JWT.decode(azureToken);const {onPremisesSamAccountName = '',cn = '',name = '',family_name = '',given_name = '',username = '',groups = []} = auzraUserInfo;let adKeyWord = '';let userName = '';adKeyWord = name;userName = `${given_name} ${family_name}`;const jwtToken = JWT.sign({cn: adKeyWord,sAMAccountName: adKeyWord,username: userName,auth: 'saml',thumbnail: ''},environmentConfig.cx.jwt_token_secret,// { expiresIn: 7 * 24 * 60 * 60 }{ expiresIn: 1 * 24 * 60 * 60 });return { claimsInfo: jwtToken, user: { id: userName }, groups: groups };}

至此,一个流程就结束了,我们将生成的 token 放到前端就可以了。

需要注意的是,我们的凭证是有expiry date的。

多谢关注~ 公众号求关注~

公众号文章

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

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

相关文章

Github2024-05-10开日报 Top10

根据Github Trendings的统计,今日(2024-05-10统计)共有10个项目上榜。根据开发语言中项目的数量,汇总情况如下: 开发语言项目数量Python项目4TypeScript项目4JavaScript项目1Lua项目1C项目1Rust项目1Dart项目1 RustDesk: 用Rust编写的开源远…

U盘文件剪切丢失怎么办?揭秘原因并给出恢复方法

在日常生活和工作中,U盘已成为我们不可或缺的数据存储和传输工具。但有时候,我们在对U盘中的文件进行剪切操作时,会遇到文件丢失的情况。这种突如其来的数据消失往往会让人感到惊慌和困惑。那么,为什么U盘剪切时文件会丢失呢&…

IDEA 常见设置问题

OutOfMemoryError IDEA 第一次运行项目时,会报错误 - java.lang.OutOfMemoryError: Java heap space / insufficient memory,解决办法是: 将图示部分由默认的 700 改为 2048。 import * 工程lint检查时不允许使用import *,IDE…

使用Selenium自动化操作浏览器!

Selenium可以自动化操作浏览器,例如:选择元素,输入,点击等,可以用于软件自动化测试,爬虫等工作,也可以做你想做的任何事情。 本文环境: Python3.12,Windows10&#xff0…

python实现星号打印出金字塔

#编程实现下列图形的打印 a input() for i in range(int(a)//21): num * * ((i1)*2-1) print(num.center(int(a), )) 编译后通过。输入20后得到下面的星号金字塔

c#教程——索引器

前言: 索引器(Indexer)可以像操作数组一样来访问对象的元素。它允许你使用索引来访问对象中的元素,就像使用数组索引一样。在C#中,索引器的定义方式类似于属性,但具有类似数组的访问方式。 索引器&#x…

Cloudera的简介及安装部署

简介 Cloudera是一家位于美国的软件公司,成立于2008年,专注于为企业客户提供基于Apache Hadoop的软件、支持、服务以及培训。Cloudera的开源Apache Hadoop发行版,即Cloudera Distribution including Apache Hadoop(CDH&am…

【计算机网络原理】初识网络原理和一些名词解释​​

˃͈꒵˂͈꒱ write in front ꒰˃͈꒵˂͈꒱ ʕ̯•͡˔•̯᷅ʔ大家好,我是xiaoxie.希望你看完之后,有不足之处请多多谅解,让我们一起共同进步૮₍❀ᴗ͈ . ᴗ͈ აxiaoxieʕ̯•͡˔•̯᷅ʔ—CSDN博客 本文由xiaoxieʕ̯•͡˔•̯᷅ʔ 原创 CSDN 如…

未来办公新方式--智能体与程序完美配合

Agent AI智能体的未来 工作中,有时候我们就像是在不停地踩着缝纫机,重复地做着那些单调乏味的任务,不仅耗时费力,还特别容易出错。可是,咱们现在可是生活在数字化时代啊!这时候,Python编程语言…

docker私有仓库registry

简介 Docker私有仓库的Registry是一个服务,主要用于存储、管理和分发Docker镜像。具体来说,Registry的功能包括: 存储镜像:Registry提供一个集中的地方来存储Docker镜像,包括镜像的层次结构和元数据。 版本控制&…

嵌入式人工智能是一个怎样的概念呢?

嵌入式人工智能将会是未来几年人工智能发展的主要方向之一,并且会伴随着一系列的职位和角色的出现。虽然目前还没有嵌入式人工智能的确切定义,但随着人工智能的不断发展,它势必会延伸到边缘、终端和嵌入式市场。 嵌入式人工智能具有速度快、功…

攻略:大学生三下乡投稿媒体网站和快速方法

作为当代大学生,不仅需要学习和掌握知识,更需要将所学知识运用到实践中,参与各种社会实践活动。其中,“三下乡”活动就是一个非常有意义的社会实践活动。三下乡社会实践活动新闻稿投稿网站有哪些?有哪些方式可以快速投稿呢?今天小编给大家一次讲个明白。 三下乡新…

高效文件管理:一键提取文件名关键字,快速创建对应文件夹

在数字化时代,文件管理成为我们日常工作中不可或缺的一部分。随着文件数量的不断增加,如何高效、有序地管理这些文件成为了许多人的挑战。传统的文件管理方法,如手动创建文件夹和分类文件,不仅耗时耗力,而且容易出错。…

KAN网络

目录 背景知识 什么是神经网络? 神经网络发展史 MP神经元模型 感知机模型 KAN 引言 MLP架构vsKAN架构 从数学定理方面来看: 从算法层面上看: 从实际应用过程看: KAN的架构细节 KAN的准确性 KAN的可解释性 监督学习…

https://是怎么实现的?

默认的网站建设好后都是http访问模式,这种模式对于纯内容类型的网站来说,没有什么问题,但如果受到中间网络劫持会让网站轻易的跳转钓鱼网站,为避免这种情况下发生,所以传统的网站改为https协议,这种协议自己…

MyBatis——在WEB中使用MyBatis(MVC架构模式)

一、在 Web 应用中使用 MyBatis 项目目录结构 pojo package org.qiu.bank.pojo;/*** 账户类,封装账户数据* author 秋玄* version 1.0* package org.qiu.bank.pojo* date 2022-09-27-20:31* since 1.0*/ public class Account {private Long id;private String …

Logit Standardization in Knowledge Distillation 知识蒸馏中的logit标准化

摘要 知识蒸馏涉及使用基于共享温度的softmax函数将软标签从教师转移到学生。然而,教师和学生之间共享温度的假设意味着他们的logits在logit范围和方差方面必须精确匹配。这种副作用限制了学生的表现,考虑到他们之间的能力差异,以及教师天生…

农业生产中,土壤墒情的监测方法有哪些?

农业是人类的生命之源,而土壤墒情则是农业生产的基础。我们应该倍加珍惜土地资源,合理利用水资源,努力创造出更加宜人的生长环境。让每一滴水都能为农作物带来生机,让每一寸土地都能孕育丰收。这样才能实现农业可持续发展的目标&a…

存内计算加速大模型——REM-CiM的RGB-事件融合多模态类比计算内存(CiM)技术

本文为大模型&存内计算融合专题的首篇文章,我们将以这篇名为《REM-CiM: Attentional RGB-Event Fusion Multi-modal Analog CiM for Area/Energy-efficient Edge Object Detection during both Day and Night》为例[1],探讨其在文中提到的多模态大模…

护眼台灯和普通台灯差别很大吗?专业护眼灯品牌有哪些?

随着科技的不断演进,台灯的设计也日益脱胎换骨,从曾经的笨重造型转变为如今轻盈雅致的外观。它们的功能同样经历了多样化的革新,变得更加人性化和便捷。作为学习、阅读和办公环境中不可或缺的照明工具,台灯所提供的光线舒适度至关…