OpenID 已成為廣泛採用的身份驗證標準,讓用戶憑單一身份識別符存取多個網站。在 第一部分 中,我們介紹了如何將 OpenID 整合為依賴方 (RP)。本文進一步探討 OpenID 提供者 (OP) 的建構,特別適用於「閉環」架構:多個受信任的 Java Web 應用組成叢集,共享同一身份驗證核心,實現單點登入 (SSO)。用戶只需登入一次,即可無縫存取叢集內所有受保護資源。
RP 是受保護的線上資源(網站、API、檔案等)。它將身份驗證委託給 OP,並可透過 Simple Registration (SReg) 或 Attribute Exchange (AX) 擴展請求使用者屬性(如電子郵件、全名)。
OP 是身份驗證的中央權威。它負責發行 OpenID、驗證使用者憑證、回應 RP 的驗證請求,並根據 SReg/AX 規範回傳使用者屬性。在閉環架構中,叢集內的某一應用扮演 OP 角色,其他應用作為 RP。
openid4java 庫完整實作了 OpenID Authentication 2.0 規範,大幅簡化開發。範例應用採用 Wicket 框架,將 OP 核心邏輯封裝於 OpenIdProviderService 類別中,主要方法包括:
getServerManager():配置並返回 ServerManager 實例。getOpEndpointUrl():回傳 OP 接收請求的端點 URL(如 https://localhost:8080/openid-provider-sample-app/sample/OpenIdLoginPage)。processAssociationRequest():處理 RP 發起的關聯請求(Diffie-Hellman 金鑰交換)。sendDiscoveryResponse():回傳 XRDS 文件,宣告 OP 的服務端點。createAuthResponse() / buildAuthResponse():建構驗證回應,包含 SReg/AX 屬性資料。OpenIdRegistrationPage)。RegistrationService.performDiscoveryOnUserSuppliedIdentifier(OP端點URL),取得 DiscoveryInformation 並與 OP 建立關聯。application/xrds+xml)回傳,確認其為使用者的 OpenID 服務提供者。AuthRequest,附加 SReg/AX 屬性請求(如 favoriteColor),重導瀏覽器至 OP 端點。DiscoveryInformation 存入 Session,回傳 AuthResponse。不同於 SReg 固定屬性集,AX 允許 RP 與 OP 交換任意自訂屬性,只需雙方協定屬性名稱與 URI(如 https://makotogroup.com/schema/1.0/favoriteColor)。範例中,RP 以 FetchRequest 要求屬性,OP 以 FetchResponse 回傳,實現極具彈性的資料交換。
範例應用打包為 WAR,部署於 Tomcat。啟動後訪問 https://localhost:8080/openid-provider-sample-app/ 即可體驗完整 SSO 流程。建議開啟 TRACE 級別日誌,觀察 openid4java 內部交互細節。
透過自建 OP,企業內部應用叢集可輕鬆實現安全、標準化的單點登入。openid4java 處理了繁複的協定細節,開發者專注於業務邏輯與屬性交換定義。完整原始碼可從文末下載連結獲取。


