一百七十五

2021-10-13 06:52:07 字數 4327 閱讀 5782

簡介

openid connect簡稱為oidc,已成為internet上單點登入和身份管理的通用標準。 它在oauth2上構建了乙個身份層,是乙個基於oauth2協議的身份認證標準協議。

oauth2實際上只做了授權,而openid connect在授權的基礎上又加上了認證。

oidc的優點是:簡單的基於json的身份令牌(jwt),並且完全相容oauth2協議。

今天我們將會介紹一下oidc的具體原理。

openid connect是什麼

openid connect發布於2023年,是建立在oauth 2.0協議之上的簡單身份層,它允許客戶端基於授權伺服器或身份提供商(idp)進行的身份驗證來驗證終端使用者的身份,並獲得使用者的相關資訊。

openid connect提供了restful http api,並使用json作為資料的傳遞格式。

之前我們講到了基於xml格式的saml協議,而openid connect因為其更加簡潔的資料交換格式,被越來越多的應用使用,已經成為事實上的標準。

我們看一下openid connect的基本流程:

rp(client)傳送乙個認證請求到 openid provider(op)。

op對end user進行認證並獲得相應的授權。

op返回乙個id token或者access token給rp。

rp使用access token向userinfo endpoint請求使用者資訊。

userinfo endpoint返回相應的使用者資訊給rp。

id token

id token就像是乙個使用者的身份證,它是以jwt格式存在的,並且由op進行簽名,保證它的安全性。

獲取id token的方式就是向op傳送認證請求。

因為id token是以jwt格式存在的,jwt可以分為三個部分,分別是header,payload和signature。

這裡我們主要關注一下payload的json內容:

sub = subject identifier:必須。iss提供的eu的唯一標識;最長為255個ascii個字元;

iss = issuer identifier:必須。提供認證資訊者的唯一標識。一般是url的host+path部分;

aud = audience(s):必須。標識id-token的受眾。必須包含oauth2的client_id;

nonce:rp傳送請求的時候提供的隨機字串,用來減緩重放攻擊,也可以來關聯id-token和rp本身的session資訊。

auth_time = authenticationtime:eu完成認證的時間。如果rp傳送認證請求的時候攜帶max_age的引數,則此claim是必須的。

acr = authentication context class reference:可選。表示乙個認證上下文引用值,可以用來標識認證上下文類。

iat = issued at time:必須。jwt的構建的時間。

exp = expiration time:必須。id-token的過期時間;

上面的是id token的標準claims。

請求id token

現在我們知道了id token是什麼,那麼在openid connect的rp客戶端如何請求乙個id token呢?

雖然openid connect並未指定應如何實際驗證使用者身份,這取決於提供者來決定。但是我們通常由web瀏覽器來執行認證步驟。

瀏覽器將使用者重定向到認證伺服器的認證視窗,使用者輸入使用者名稱和密碼之後,通過oauth 2.0協議請求id token。

使用oauth 2.0來獲取id token有3種方式:

authorization code模式

authorization code流程的步驟如下:

客戶端準備身份認證請求,請求裡包含所需要的引數

客戶端傳送請求到授權伺服器

授權伺服器對最紅使用者進行身份認證

授權服務得終端使用者的統一/授權

授權伺服器把終端使用者傳送回客戶端,同時帶著授權碼

客戶端使用授權碼向token端點請求乙個響應

客戶端接收到響應,響應的body裡面包含在和id token和access token

客戶端驗證id token,並獲得使用者的一些身份資訊

隱式授權

上圖就是乙個隱式授權的例子,和authorization code模式不同的是,認證伺服器返回的是乙個access token片段,只有這個片段,我們是無法得到access token的。

這裡我們需要額外請求一次client resource伺服器,伺服器將會返回乙個script指令碼,通過這個指令碼,我們對access token片段進行解析,得到最終的access token。

混合模式

混合模式比較少用到,它是前面兩種模式的混合,它允許從前端和後端分別獲取token值。

id token可以做什麼

那麼我們拿到請求得到的id token可以做什麼事情呢?

無狀態session,通過將token儲存在瀏覽器的cookie中,我們可以實現輕量級的無狀態會話。

伺服器端不需要儲存會話資訊,我們只需要在伺服器端對token進行驗證即可。

可以將token傳遞給第三方,因為token本身並不是敏感資訊,所以我們可以將token傳遞給其他應用程式或者後端服務。

令牌互動,我們可以通過id token去idp伺服器中請求access token,從而起到了互動token的目的。

open connect認證碼授權的例子

這裡我們舉乙個使用認證碼授權獲取到id token的例子。

rp通過重定向到openid provider的oauth 2.0認證終端,來初始化乙個使用者認證。

下面是乙個重定向的例子:

response_type:因為我們是認證碼模式,這裡選擇code

scope:openid表示請求的是openid。

client_id:rp的client id,op通過這個client_id來識別是否是可識別的rp。可以提前註冊或者提前約定。

state:rp生成的乙個狀態標準,主要為了防止攻擊。

在op端,將會檢測是否已經存在乙個有效的使用者session,否則將會彈出使用者登入介面,讓使用者登入。

登入成功之後,client將會重定向到redirect_uri,並帶上認證碼:

使用code獲取id token

上面返回的code只是乙個中間產物,rp需要將code提交給op換取id token。

這次我們直接使用乙個後端的post請求:

grant_type:authorization_code表示是授權碼格式

code就是上面一步獲得的code

redirect_uri是callback url

如果成功,op會返回乙個json物件,帶有id token, access token 或者 refresh token:

其中id token的格式是jwt。

user info

我們獲取到的id token裡面已經包含了一些非常有用的claims資訊。

事實上id token還可以包含其他的user info資訊:

比如name,profile,picture,email,gender,birthdate,phone_number,address等等有用的資訊。

我們可以在token請求的時候新增上額外的scope:

比如上面的例子中,我們新增了額外的email資訊,那麼op將會在token中加入email選項。

比如:

IT女人,從二十五到三十五

it女人,從二十五到三十五 伴著老公和兒子的酣聲,一氣完成了此文,這周沒有工作的日子讓我很無奈。我的三十五歲是去年秋天在家裡過的,因為乙個月前老闆讓我回家。11月的時候,不甘心又找了乙份工作,但是今天又開始找工作了。兩次失去工作都是一樣的經歷,給所任職公司做 有人做網頁,但是沒人出內容,我就負責 的...

十五周總結

時間總是想留也留不住,從學設計模式到現在關於設計模式的總結我寫得不多,看設計模式的時候總是感覺作者寫的這些東西都很對,針對具體情況,本著擴充套件性強 方便繼承能復用的方向去解決。對於 大話設計模式 上的例子,要想真正的要理解透了,方便以後自己在專案編碼中更快的應用到設計模式,大家也都體會到了,就設計...

十五周實驗

實驗目的 學會ascii檔案的操作 實驗內容 從檔案中讀入資料,排序並輸出到另外乙個檔案中 作 者 114 4 彭志康 完成日期 2011 年 11 月 29 日 版 本號 對任務及求解方法的描述部分 輸入描述 檔案salary.txt 問題描述 從檔案salary.txt中讀入500名工人的工資,...