OAuth 只負責「授權」:讓應用程式存取你的資料。但如果我們想用「Google 登入」、「Facebook 登入」,需要的是「身分」而不是「資源存取」。這就是 OpenID Connect(OIDC) 的角色。
讓我們想像一下,假設我們開發了一個應用 MangaCloud,希望使用者能「用 Google 登入」:
所以 OAuth 只解決了「授權」,卻沒解決「認證」。OIDC 在 OAuth 上增加一層:身分層(Identity Layer)。而這個,就是所謂的OIDC
OIDC 規範中,最重要的東西就是 ID Token。簡單來說,就是多一條辨別你身份的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 讓 Client 不用硬編程,而是靠標準端點取資料。
https://accounts.google.com/.well-known/openid-configuration
流程:
比較 | 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 沒有創造全新的流程,而是在 OAuth 授權碼流程基礎上,加上 ID Token。
完整流程:
scope=openid email profile
和 nonce
。?code=abc123&state=xyz
。iss
、aud
、exp
、nonce
。OAuth/OIDC 也有 **登出(Logout)**的設計。
要注意,登出設計要考慮一致性(尤其多服務整合時)。
每次驗證 ID Token 時,至少要檢查:
client_id
。使用者在登入畫面點擊「使用 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。
今天我們學會了:
明天我們將正式在 Spring Boot 實作「Google 登入」,實際走一遍 OIDC Authorization Code Flow with PKCE,拿到 ID Token 並驗證。大家明天見!