iT邦幫忙

2025 iThome 鐵人賽

DAY 19
0
Security

「站住 口令 誰」關於資安權限與授權的觀念教學,以Spring boot Security框架實作系列 第 19

Day 19 (身分篇)— OpenID Connect(OIDC)概念:用 ID Token 說清「你是誰」

  • 分享至 

  • xImage
  •  

OAuth 只負責「授權」:讓應用程式存取你的資料。但如果我們想用「Google 登入」、「Facebook 登入」,需要的是「身分」而不是「資源存取」。這就是 OpenID Connect(OIDC) 的角色。

OAuth 還遠遠不夠

讓我們想像一下,假設我們開發了一個應用 MangaCloud,希望使用者能「用 Google 登入」:

  • 你用 OAuth 拿到了 Access Token
  • 這張 Access Token 只能讓你存取 Google API,但 它本身不代表使用者的身分
  • 你無法確定:「這個使用者是誰?」、「他的 Email 是什麼?」

所以 OAuth 只解決了「授權」,卻沒解決「認證」。OIDC 在 OAuth 上增加一層:身分層(Identity Layer)。而這個,就是所謂的OIDC

OIDC 的核心:ID Token

OIDC 規範中,最重要的東西就是 ID Token。簡單來說,就是多一條辨別你身份的Token

  • 格式:ID Token 是一顆 JWT(JSON Web Token)
  • 用途:代表使用者的身分(你是誰)。
  • 簽發者:Authorization Server(身分提供者,IdP)。
  • 讀取方式:由 Client 驗證後用來建立本地 Session。

ID Token 的結構

ID Token = Header.Payload.Signature

常見的 claims(聲明)

Claim 說明
iss 簽發者(issuer),例如 https://accounts.google.com
sub 使用者唯一 ID(Google 全域唯一字串)
aud Audience,必須包含你的 client_id
exp 過期時間
iat 簽發時間
nonce 防止重放攻擊(與登入請求的 nonce 對應)
email 使用者 Email(如果 scope 包含 email
name 使用者名稱
picture 使用者頭像

OIDC 的三大端點

OIDC 讓 Client 不用硬編程,而是靠標準端點取資料。

  1. Discovery(自動發現)
    • 位址:https://accounts.google.com/.well-known/openid-configuration
    • 告訴你授權端點、Token 端點、UserInfo 端點、金鑰輪換方式。
  2. JWKS(JSON Web Key Set)
    • OIDC 會提供一個公開金鑰端點,用來驗證 ID Token 的簽章。
  3. UserInfo 端點
    • 用 Access Token 呼叫,拿到使用者更多屬性(例如生日、語言偏好)。

流程:

  • 登入時拿到 ID Token(JWT,馬上就能辨識使用者)。
  • 如果需要更多資訊,再呼叫 UserInfo 端點

OIDC 與 OAuth 的差別

比較 OAuth 2.0 OIDC
核心任務 授權(存取資源) 身分認證(登入)
憑證 Access Token ID Token(JWT)
Audience Resource Server Client(RP)
主要用途 讓第三方存取 API 確認「你是誰」
延伸機制 Scope: calendar.read Scope: openid email profile

簡單來說,OAuth 解決了「能不能用」這個權限授權問題;OIDC 解決了「你是誰」的問題。

OIDC 推薦流程:Authorization Code Flow + PKCE

OIDC 沒有創造全新的流程,而是在 OAuth 授權碼流程基礎上,加上 ID Token

完整流程:

  1. Client 導引使用者到 Google,同時帶上 scope=openid email profilenonce
  2. 使用者同意 → 回跳 ?code=abc123&state=xyz
  3. Client 用 code + code_verifier 換取 Access Token + ID Token
  4. 驗證 ID Token:檢查 issaudexpnonce
  5. 建立本地 Session,確認使用者身份。
  6. (可選)再用 Access Token 打 UserInfo API,拿更多屬性。

登出議題

OAuth/OIDC 也有 **登出(Logout)**的設計。

  • 本地 Session 登出:只清掉你的應用 Session,不影響 IdP(Google)。
  • RP-initiated Logout:你的應用發送請求到 IdP,連 IdP 的 Session 也清除(使用者在其他 App 也會被登出)。

要注意,登出設計要考慮一致性(尤其多服務整合時)。

安全檢核清單

每次驗證 ID Token 時,至少要檢查:

  1. iss 是否正確(必須是 Google 的官方 URL)。
  2. aud 是否包含你的 client_id
  3. exp 是否過期。
  4. nonce 是否與請求時相符。
  5. 簽章是否能用 JWKS 驗證成功。

案例:MangaCloud Google 登入

  • 使用者在登入畫面點擊「使用 Google 登入」。

  • 你的應用帶上 scope=openid email profile,並加上 nonce

  • Google 回傳一個 ID Token(JWT)

    {
      "iss": "https://accounts.google.com",
      "sub": "113289473829473",
      "aud": "your-client-id",
      "email": "user@gmail.com",
      "email_verified": true,
      "exp": 1693647293,
      "nonce": "xyz123"
    }
    
    
  • 你的應用驗證 ID Token,確認這個人就是 user@gmail.com,然後建立 Session。

今天我們學會了:

  • OAuth 只解決「授權」,OIDC 解決「認證」。
  • OIDC 的核心是 ID Token,用 JWT 承載使用者身分資訊。
  • OIDC 提供 Discovery、JWKS、UserInfo 端點,讓整合更標準化。
  • 驗證 ID Token 時必須檢查 iss/aud/exp/nonce 與簽章。

明天我們將正式在 Spring Boot 實作「Google 登入」,實際走一遍 OIDC Authorization Code Flow with PKCE,拿到 ID Token 並驗證。大家明天見!


上一篇
Day 18 (流程篇)— Authorization Code Flow(含 PKCE):逐步解剖與威脅模型
下一篇
Day 20 OIDC with Spring Boot(Google 登入)
系列文
「站住 口令 誰」關於資安權限與授權的觀念教學,以Spring boot Security框架實作20
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言