前言
OAuth是”Open Authorization”,它讓使用者在授權伺服器上,同意 Client App 代表使用者去存取資源 => 授權。
但在存取前,我們需要的是驗證(Authentication)這個使用者是誰及取得這個使用者的其他資訊。
而要取得使用者的一些資訊,例如,名稱、Email、地址等資訊,
如果都是從 authorize 及 token 這2個 endpoint 來拿,又有點不太合適,
則會從 OpenID Connect UserInfo endpoint (通常是 /userinfo)來取得。
OpenID Connect
OpenID Connect是架構在 OAuth 2.0 之上,可以讓我們在 Authorization Server(這時變成 Identity Provider) 登入認證完成後,取回 Access Token 外,還可以取回 Identity Token。
以下使用OpenID Connect Authorization Code Flow來演示。
1.組出跟 Authorization Server 取回 Code 的 URL(authorize),
response_type的值為code(表示我們要取回授權碼),client_id, redirect_uri為 Client 註冊的資訊,
scope 則為要求的 Resources,這裡給的值為 openid, profile, email (identity 的資料)及 photo ,這裡是用 **+**,有些是使用 空白 分隔,
state 為防止 XSRF 準備的值,當 Authorization Server 回 Call 時,也會把接收到的 state 回傳回來,
nonce 會放在 Identity Token Payload 之中。
1 | https://authorization-server.com/authorize? |
2.轉址到上述建立的 URL(Authorization Server 的 Authorization endpoint),在 Authorization Server系統中,輸入使用者帳號及密碼
3.顯示同意 Client 存取要求的 scope 權限(consent 畫面可以設定顯示與否)。
4.當使用者同意後,Authorization Server 會把產生的 code (授權碼)及剛才傳過去的 state 一併傳回來給 redirect_uri 的網址(oidc.html)去驗證 state 值是否正確。
註:參數透過 QueryString ,所以 response_mode=query
5.組出要透過 Code 來跟 Authorization Server 取回 AccessToken 及 Identity Token 的 URL(token),
grant_type為authorization_code,code為剛才從 Authorization Server 取回的 授權碼
1 | POST https://authorization-server.com/token |
6.Post後就會得到 access_token 及 id_token
1 | { |
- 註: id_token 是 JWTs(Json Web Token)
7.呼叫 userinfo Endpoint 取回使用者的相關資訊(可透過 IdentityModel 的擴充方法來取回使用者的資訊)
以下用 IdentityServer4 來測試,要求的 scopes 為 openid profile email address
1 | var userInfoResponse = await tokenClient.GetUserInfoAsync(new UserInfoRequest |
以下為使用 postman 取回的資料畫面,
- 註: 如果要 IdentityServer4 自動取得 User 的相關資料,則在設定 Client 時,可以設定
AlwaysIncludeUserClaimsInIdToken = true
參考資料
OAuth 2.0 - Authorization Code Flow
OAuth 2.0 - Authorization Code Flow With PKCE
OAuth 2.0 - Implicit Flow
OAuth 2.0 Playground
OpenID Connect
Difference between OAuth 2.0 “state” and OpenID “nonce” parameter? Why state could not be reused?
Diagrams of All The OpenID Connect Flows