簡介
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名工人的工資,...