以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.pswp.cn/web/10182.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/10182.shtml
英文地址,請注明出處:http://en.pswp.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盤剪切時文件會丟失呢&…

運營模型—歸因分析(Attribution Analysis)

運營模型—歸因分析(Attribution Analysis) 隨著互聯網技術和業務的發展,廣告投放相關的業務也隨之興起。那么廣告投放的效果評估也就隨之而來。廣告的投放一般都是收費模式,所以選中的渠道商的好壞直接和自己的利益掛鉤。于是,「歸因分析」便最早應用在了廣告投放行業。(…

IDEA 常見設置問題

OutOfMemoryError IDEA 第一次運行項目時,會報錯誤 - java.lang.OutOfMemoryError: Java heap space / insufficient memory,解決辦法是: 將圖示部分由默認的 700 改為 2048。 import * 工程lint檢查時不允許使用import *,IDE…

Python中如何讀取文件夾及其文件:使用os模塊詳解

路徑os Python中如何讀取文件夾及其文件:使用os模塊詳解引入os模塊讀取文件夾獲取當前工作目錄更改工作目錄列出目錄內容 讀取文件夾下的文件檢查是文件還是目錄使用os.path.join()**重點內容**:**使用os模塊來讀取和管理文件及目錄,特別是os…

使用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后得到下面的星號金字塔

拓撲排序——數據結構

拓撲排序是對有向無環圖(DAG)的頂點進行線性排序的方法。關鍵在于每個頂點代表了一個任務,而每條有向邊代表了任務間的先后依賴關系。這個排序保證了每個任務只在它依賴的任務完成后才開始。 拓撲排序的本質是這樣的:你有一堆任務…

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范圍和方差方面必須精確匹配。這種副作用限制了學生的表現,考慮到他們之間的能力差異,以及教師天生…