深入淺出 OpenID Connect (二)
OpencID Connect中的三個常用流程介紹
前言
在本系列文上篇從授權機制 OAuth2 的角度切入,介紹了如何以授權機制為基礎,建構認證協議,並分析其可行性與挑戰。另一方面,也初步介紹了 OpenID Connect (以下稱之為 OIDC)中的角色關係與 OIDC 中的常用的 Token (主要分為 Access token 與 ID token)。而本文將透過介紹 OIDC 規格中提供的三種認證流程,來說明 OIDC 中不同角色之間的互動關係,並補充在實作時,需要注意的相關細節 (如:scope定義與其他相關擴充協議等等)
流程介紹
以下介紹的各種流程其實就是考慮 OIDC 在面臨各種不同軟體架構時,利用排列組合的方法來預設不同的情境,並提供最適合的流程解決方案。各個 Flow 的概覽如下表所示:
以下分別將深入圖解各個 Flow 的流程,並說明相關實作細節:
Authorization Code Flow 流程概述
- RP 收集與認證請求 (Authentication request)相關的參數
- RP 向 IdP 發送 Request
- IdP 認證 End-User 的身分
- IdP 取得 End-User 對 RP 存取權限的即時授權
- IdP 將 End-User redirect 回 RP 並同時攜帶 authorization code
- RP 向 Token endpoint 發送帶有 authorization code 的請求
- Token endpoint 返回一個帶有 ID token 與 Access token 的 response (在 response body 中)
- RP 驗證 ID token 中的訊息,並從中取得 End-User’s Subject Identifier
Implicit Flow 流程概述
- RP 收集與認證請求 (Authentication request)相關的參數
- RP 向 IdP 發送 Request
- IdP 認證 End-User 的身分
- IdP 取得 End-User 對 RP 存取權限的即時授權
- IdP 直接向 End-User 回傳 ID token,如果 RP 有在認證請求的參數中要求 Access token,IdP 也會同時返回 Access token
- RP 驗證 ID token 中的訊息,並從中取得 End-User’s Subject Identifier
Hybrid Flow 流程概述
- RP 收集與認證請求 (Authentication request)相關的參數
- RP 向 IdP 發送 Request
- IdP 認證 End-User 的身分
- IdP 取得 End-User 對 RP 存取權限的即時授權
- IdP 將 End-User redirect 回 RP 並同時攜帶 authorization code,也可能同時攜帶 ID token 或 Access token (要看認證請求參數中的 Response Type 而定)
- RP 向 Token endpoint 發送帶有 authorization code 的請求
- Token endpoint 返回一個帶有 (response body中) ID token 與 Access token 的 response
- RP 驗證 ID token 中的訊息,並從中取得 End-User’s Subject Identifier
OIDC 中其他特性補充
- ID token 中因帶有相關使用者資料,所以通常具有較短的時效 (例如:數分或數秒)
- Access token 與 Refresh token 由於不帶有認證資訊,故具有較長的時效 (RP不能把 token 當作認證的象徵)
- IdP 或是 End-user 可以以安全性為由,隨時撤回在時效期間的 token 之效力
OIDC 規格中對於 Scope 的定義
在 OAuth2 中,Scope 用來劃定特定 token 能夠存取 protected resource 的範圍。OIDC 也有針對 Scope 的相關定義,主要包含:profile, email, address, phone,這些 scope 被定義來回傳一組 claim。此外,一個 Access token 也可以被 mapping 到多個 scope。 詳細資料可以參考 OIDC 官方文獻中的規格。
OIDC 之相關延伸協議
OIDC的延伸協議可以幫助開發人員建置更完整的認證系統,最主要的兩個協議如下:
- Discovery protocol:幫助 RP 取得未知的 IdP 的資料
- Client registration protocol:幫助 RP 註冊資料至新的 IdP (利用OAuth Dynamic Client Registration protocol),使得 IdP 能夠認得 RP。
由於此部分以超出本文的範圍,故詳細部分可以參考 OIDC 官方網站所提供的規格書。
結語
這個系列文除了紀錄自己在研究所生活中所學,也希望幫助對 OpenID Connect 等相關認證協議有興趣的開發人員。API security 等資安議題在現在的大數據與物聯網時代越來越重要,如何認證使用者的身分,對一個資源或裝置提供者來說,也是一個非常值得探討的議題,而 OIDC 正恰好提供一個有效的即時授權的認證解決方案,提供了開發人員更為彈性的選擇。
參考文獻
[1] OAuth2 in Action
[2] Sakimura, N., Bradley, J., Jones, M., De Medeiros, B., & Mortimore, C. (2014). Openid connect core 1.0. The OpenID Foundation, S3.