# OpenID Connect ## 什麼是OpenID Connect? OpenID Connect 是一種身份驗證協議,它是在 OAuth 2.0 協議的基礎上構建的。它允許客戶端驗證用戶的身份,並獲取基本的個人資訊。OpenID Connect 是由 OpenID Foundation 開發的。 OpenID Connect 的工作流程大致如下: 1. 用戶嘗試登入一個應用(稱為客戶端)。 2. 客戶端將用戶重定向到身份提供者(IDP)。 3. 用戶在 IDP 上進行身份驗證(例如,輸入用戶名和密碼)。 4. 一旦身份驗證成功,IDP 將用戶重定向回客戶端,並在重定向的 URL 中包含一個 ID Token 和一個 Access Token。 5. 客戶端可以解析和驗證 ID Token 來確認用戶的身份,並可以使用 Access Token 來訪問用戶在 IDP 上的資訊。 OpenID Connect 的一個主要優點是它允許單一登入(SSO),這意味著用戶可以使用同一組憑證在多個應用中登入。此外,由於身份驗證是由 IDP 進行的,因此客戶端不需要處理用戶的憑證,這提高了安全性。 ## OpenID Connect 的角色定義及和OAuth2.0的角色差異 OpenID Connect 和 OAuth 2.0 的角色基本上差,但是名稱和一些細節有所不同。以下是兩者的角色對比: | OpenID Connect 角色 | OAuth2.0 角色 | | | :--------------------: |:--------------------:| -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | End-User | Resource Owner | 在 OAuth 2.0 中,Resource Owner 是擁有資源的實體,通常是最終用戶。在 OpenID Connect 中,這個角色被稱為 End-User。 | | Relying Party (RP) | Client | 在 OAuth 2.0 中,Client 是需要訪問資源的應用程式。在 OpenID Connect 中,這個角色被稱為 Relying Party。 | | OpenID Provider (OP) | Authorization Server | 在 OAuth 2.0 中,Authorization Server 是負責驗證 Resource Owner 的身份,並發出 Access Token 的服務。在 OpenID Connect 中,這個角色被稱為 OpenID Provider。 | | -- | Resource Server | 這是 OAuth 2.0 中的一個角色,它是擁有 Resource Owner 資源的服務,並能夠接受和響應使用 Access Token 的請求。在 OpenID Connect 中,這個角色並不明確,因為 OpenID Connect 主要關注的是身份驗證,而不是資源訪問。 | | UserInfo Endpoint | -- | 在OpenID Connect 中 UserInfo Endpoint 是一個可選的組件,並非所有的 OpenID Provider 都會提供。UserInfo Endpoint 是一個可以使用 Access Token 來獲取用戶資訊的 API 端點。| :::info 如果一個 OpenID Provider 沒有提供 UserInfo Endpoint,那麼可能的原因有: 1. **所有需要的用戶資訊都在 ID Token 中**:ID Token 是 OpenID Connect 協議中的一個核心組件,它包含了用戶的基本資訊。如果所有需要的用戶資訊都可以從 ID Token 中獲取,那麼就不需要 UserInfo Endpoint。 2. **保護用戶隱私**:UserInfo Endpoint 可能會暴露更多的用戶資訊,因此一些 OpenID Provider 可能選擇不提供 UserInfo Endpoint 來更好地保護用戶的隱私。 3. **簡化實現**:不提供 UserInfo Endpoint 可以簡化 OpenID Provider 的實現。 如果你需要從 OpenID Provider 獲取更多的用戶資訊,並且它沒有提供 UserInfo Endpoint,那麼你可能需要與該 OpenID Provider 聯繫,看看是否有其他的方式可以獲取這些資訊。 ::: :::warning Resource Server v.s. UserInfo Endpoint 在 OAuth 2.0 中,Resource Server 是一個服務,它擁有和管理資源(例如用戶的個人資訊),並能夠接受和響應使用 Access Token 的請求。Access Token 是由 Authorization Server 發出的,它代表了 Client(應用程式)對 Resource Owner(用戶)的資源的訪問權限。 在 OpenID Connect 中,UserInfo Endpoint 是一個可以使用 Access Token 來獲取用戶資訊的 API 端點。這些資訊可能包括用戶的姓名、電子郵件地址等。因此,你可以將 UserInfo Endpoint 看作是一種特殊的 Resource Server,它專門用於提供用戶資訊。 然而,這種對應關係並不完全。例如,一個 Resource Server 可能會提供更多種類的資源,而不僅僅是用戶資訊。同樣,一個 OpenID Provider 可能會提供多個不同的 UserInfo Endpoints,每個 Endpoint 提供不同的用戶資訊。 ::: 總的來說,OAuth 2.0 和 OpenID Connect 的角色都是圍繞著身份驗證和授權的流程來定義的,但 OpenID Connect 在 OAuth 2.0 的基礎上添加了一些新的概念,例如 ID Token 和 UserInfo Endpoint,以支援更豐富的身份驗證場景。 ## OpenID Connect的基本流程 以下是 OpenID Connect 取得資源的基本流程: 1. **用戶認證**:當用戶嘗試登入一個應用(稱為 Relying Party 或客戶端)時,客戶端會將用戶重定向到 OpenID Provider(身份提供者)。這個重定向的 URL 會包含一些參數,例如客戶端的 ID,重定向 URI,以及客戶端想要的 OAuth 2.0 scopes。 2. **身份驗證**:用戶在 OpenID Provider 上進行身份驗證,例如輸入用戶名和密碼。這一步可能還包括其他的身份驗證步驟,例如雙因素認證。 3. **授權確認**:一旦身份驗證成功,OpenID Provider 會詢問用戶是否同意將他們的資訊(由 scopes 決定)分享給客戶端。如果用戶同意,則 OpenID Provider 會生成一個授權碼。 4. **獲取授權碼**:OpenID Provider 將用戶重定向回客戶端,並在重定向的 URL 中包含授權碼。 5. **獲取 ID Token 和 Access Token**:客戶端將授權碼發送回 OpenID Provider,以換取 ID Token 和 Access Token。ID Token 包含了用戶的基本資訊,而 Access Token 可以用來訪問用戶在 OpenID Provider 上的其他資訊。 6. **驗證 ID Token**:客戶端需要驗證 ID Token 的簽名,以確保它是由 OpenID Provider 生成的,並且沒有被篡改。客戶端還需要檢查 ID Token 的一些聲明(claims),例如發行者(iss)、受眾(aud)和到期時間(exp)。 7. **使用 Access Token**:客戶端可以使用 Access Token 來訪問用戶在 OpenID Provider 上的資訊,例如用戶的姓名和電子郵件地址。這些資訊可以用來個性化用戶的體驗,或者用於其他的業務邏輯。 ## OpenID Connect Flows [OIDC Authorization Code Flow](https://ithelp.ithome.com.tw/articles/10299038) [OIDC Implicit Flow](https://ithelp.ithome.com.tw/articles/10299696) [OIDC Hybrid Flow](https://ithelp.ithome.com.tw/articles/10300430) [Use cases of different OAuth grants and OIDC flows](https://ithelp.ithome.com.tw/articles/10300898) ### 參考資料 [每當點選社群帳號登入,背後發生了什麼事?](https://petertc.medium.com/openid-connect-a27e0a3cc2ae) [OpenID Connect 協定簡介](https://ithelp.ithome.com.tw/articles/10293020) [OpenID Connect Flows](https://www.youtube.com/watch?v=WVCzv50BslE&ab_channel=OracleLearning)
×
Sign in
Email
Password
Forgot password
or
By clicking below, you agree to our
terms of service
.
Sign in via Facebook
Sign in via Twitter
Sign in via GitHub
Sign in via Dropbox
Sign in with Wallet
Wallet (
)
Connect another wallet
New to HackMD?
Sign up