前言
OAuth2
官網:https://oauth.net/2/
OIDC:Open ID Connect
官網:http://openid.net/connect/
What is OpenID Connect?
OpenID Connect 1.0 is a simple identity layer on top of the OAuth 2.0 protocol. It allows Clients to verify the identity of the End-User based on the authentication performed by an Authorization Server, as well as to obtain basic profile information about the End-User in an interoperable and REST-like manner.
OpenID Connect allows clients of all types, including Web-based, mobile, and JavaScript clients, to request and receive information about authenticated sessions and end-users. The specification suite is extensible, allowing participants to use optional features such as encryption of identity data, discovery of OpenID Providers, and session management, when it makes sense for them.
大致意思就是openid connect1.0是oauth2.0協議之上的一個簡單的身份層;
為什么要使用idToken?
jwt的payload部分,一般包含7個默認欄位資訊(還不了解jwt的建議先在官網了解jwt的結構):
iss:發行人
exp:到期時間
sub:主題
aud:用戶
nbf:在此之前不可用
iat:發布時間
jti:JWT ID用于標識該JWT
除以上默認欄位外,我們還可以自定義私有欄位,如下例:
大家都知道oauth2協議,會簽發jwt形式的access token,用于介面請求的憑證;
筆者之前在做oauth2集成的時候一直在想,已經有了jwt簽名的access token,為什么還需要idToken呢?
我剛開始有這樣的疑問,有三個原因:
1.jwt的payload部分包含了豐富的資訊,且還可以自定義私有欄位,在自定義私有欄位時候,將username等用戶資訊引數簽發進來,不就滿足了用戶身份資訊認證?
2.jwt有簽名防篡改的能力,將username等用戶資訊簽發到payload不會有篡改風險;
3.已經有access token的情況下,idToken顯得多余;
后來在集成微軟的azure oauth2登錄的時候,終于Get到了idToken的優勢,那么為什么要用idToken呢?
在我看來有以下原因:
1.在access token添加用戶身份資訊,可能導致用戶資訊泄露;
因為每次介面請求都攜帶access token,其payload部分的用戶資訊是可決議的,相當于是明文的;
2.access token目的是用于介面訪問的憑證,如果同時包含用戶資訊的話,功能就不分離了;
3.使用idToken替換userinfo endpoint獲取用戶資訊;
就像微軟官方doc也提到:
一般oauth2協議,都提供userinfo endpoint獲取用戶資訊,例微軟:https://graph.microsoft.com/oidc/userinfo,使用access token呼叫此介面獲取得到用戶資訊;idToken可節省呼叫userinfo API介面的額外消耗;
4.某些場景,如只需要用戶登錄認證并獲取用戶資訊,而不必呼叫Resource Server的其他API;那么這種場景只需要回傳idToken,accessToken將不必回傳;
例如微軟提到的sign-in request
Send the sign-in request
綜上可知,idToken的優勢就體現到了,
需要補充說明一點的是,idToken只用于用戶身份資訊認證,并不能用戶介面呼叫的憑證,設計的系統的時候一定要區分開;
另外網上一些關于OIDC的解釋,我覺得是有歧義的:
OIDC是基于OAuth2的,OAuth2只解決了授權的問題,沒有解決認證問題,而OpenID是個認證協議,所以二者結合就是OIDC,
我認為:OAuth2應該是同時解決了認證和授權的問題,以為OAuth2登錄,用戶在第三方平臺登錄的時候,不管是輸入憑證的方式,還是選擇已登錄account的方式,這個步驟就是認證的程序;
然后用戶也一并授權了能訪問用戶的資訊,如頭像,昵稱等,并簽發了access token,這個步驟是授權;
OIDC= OAuth2 + OpenID
我認為:OIDC并不一定OAuth2 + OpenID,如果是access token和idToken一并簽發,這種場景是可以這么理解;但是像微軟提到的sign-in request,這類場景僅單純回傳idToken,就不能這么認為了;
OIDC在OAuth2的access_token的基礎上增加了身份認證資訊, 通過公鑰私鑰配合校驗獲取身份等其他資訊—– 即idToken
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/271884.html
標籤:其他




