| 目錄 |
|
OpenID Connect 1.0 是 OAuth 2.0 協議之上的簡單身份層。它使客戶端能夠根據授權服務器執行的身份驗證來驗證最終用戶的身份,并以可互操作和REST 風格的方式獲取有關最終用戶的基本資料信息。
該規范定義了 OpenID Connect 的核心功能:基于 OAuth 2.0 構建的身份驗證以及使用聲明來傳達有關最終用戶的信息。它還描述了使用 OpenID Connect 的安全和隱私注意事項。
1.
簡介
1.1. 要求符號和約定
1.2. 術語
1.3.
概述
2.
ID 令牌
3.
身份驗證
3.1.
使用授權碼流程進行身份驗證
3.1.1.
授權碼流程步驟
3.1.2.
授權端點
3.1.2.1. 身份驗證請求
3.1.2.2. 身份驗證請求驗證
3.1.2.3.
授權服務器對最終用戶進行身份驗證
3.1.2.4.
授權服務器獲得最終用戶同意/授權
3.1.2.5.
成功的身份驗證響應
3.1.2.6.
身份驗證錯誤響應
3.1.2.7. 身份驗證響應驗證
3.1.3.
令牌端點
3.1.3.1.
令牌請求
3.1.3.2. 令牌請求驗證
3.1.3.3.
成功的令牌響應
3.1.3.4.
令牌錯誤響應
3.1.3.5. 令牌響應驗證
3.1.3.6.
ID 令牌
3.1.3.7.
ID 令牌驗證
3.1.3.8. 訪問令牌驗證
3.2.
使用隱式流程進行身份驗證
3.2.1.
隱式流程步驟
3.2.2.
授權端點
3.2.2.1.
身份驗證請求
3.2.2.2. 身份驗證請求驗證
3.2.2.3. 授權服務器對最終用戶進行身份驗證
3.2.2.4.
授權服務器獲得最終用戶同意/授權
3.2.2.5.
成功的身份驗證響應
3.2.2.6.
身份驗證錯誤響應
3.2.2.7.
重定向 URI 片段處理
3.2.2.8. 身份驗證響應驗證
3.2.2.9.
訪問令牌驗證
3.2.2.10. ID 令牌
3.2.2.11. ID 令牌驗證
3.3.
使用混合流進行身份驗證
3.3.1.
混合流步驟
3.3.2.
授權端點
3.3.2.1. 身份驗證請求
3.3.2.2. 身份驗證請求驗證
3.3.2.3.
授權服務器對最終用戶進行身份驗證
3.3.2.4.
授權服務器獲得最終用戶同意/授權
3.3.2.5.
成功的身份驗證響應
3.3.2.6.
身份驗證錯誤響應
3.3.2.7.
重定向 URI 片段處理
3.3.2.8.
身份驗證響應驗證
3.3.2.9.
訪問令牌驗證
3.3.2.10. 授權碼驗證
3.3.2.11.
ID 令牌
3.3.2.12.
ID 令牌驗證
3.3.3.
令牌端點
3.3.3.1.
令牌請求
3.3.3.2. 令牌請求驗證
3.3.3.3.
成功的令牌響應
3.3.3.4.
令牌錯誤響應
3.3.3.5.
令牌響應驗證
3.3.3.6.
ID 令牌
3.3.3.7. ID 令牌驗證
3.3.3.8.
訪問令牌
3.3.3.9.
訪問令牌驗證
4.
啟動第三方登錄
5.
聲明
5.1.
標準聲明
5.1.1.
地址聲明
5.1.2.
附加聲明
5.2.
權利要求語言和文字
5.3.
用戶信息端點
5.3.1.
用戶信息請求
5.3.2.
成功的 UserInfo 響應
5.3.3.
用戶信息錯誤響應
5.3.4.
用戶信息響應驗證
5.4.
使用范圍值請求聲明
5.5.
使用“claims”請求參數請求聲明
5.5.1.
單個聲明請求
5.5.1.1.
請求“acr”聲明
5.5.2.
單個聲明的語言和文字
5.6.
聲明類型
5.6.1.
普通聲明
5.6.2.
聚合和分布式聲明
5.6.2.1. 匯總聲明示例
5.6.2.2.
分布式聲明的示例
5.7.
聲明穩定性和唯一性
6.
將請求參數作為 JWT 傳遞
6.1.
按值傳遞請求對象
6.1.1.
請求使用“request”請求參數
6.2.
通過引用傳遞請求對象
6.2.1. 引用請求對象的 URI
6.2.2.
使用“request_uri”請求參數進行請求
6.2.3. 授權服務器獲取請求對象
6.2.4.
“request_uri” 基本原理
6.3.
驗證基于 JWT 的請求
6.3.1.
加密請求對象
6.3.2.
簽名請求對象
6.3.3.
請求參數組裝和驗證
7.
自簽發 OpenID 提供方
7.1.
自簽發 OpenID 提供方發現
7.2.
自簽發 OpenID 提供方注冊
7.2.1.
通過“注冊”請求參數提供信息
7.3.
自簽發 OpenID 提供方請求
7.4.
自簽發 OpenID 提供方響應
7.5.
自頒發的 ID 令牌驗證
8.
主體標識符類型
8.1.
成對標識符算法
9.
客戶端身份驗證
10.
簽名和加密
10.1.
簽署
10.1.1.
非對稱簽名密鑰的輪換
10.2.
加密
10.2.1.
非對稱加密密鑰的輪換
11.
離線訪問
12.
使用刷新令牌
12.1.
刷新請求
12.2.
成功刷新響應
12.3.
刷新錯誤響應
13.
序列化
13.1.
查詢字符串序列化
13.2.
表單序列化
13.3.
JSON 序列化
14.
字符串操作
15.
實現注意事項
15.1. 所有 OpenID 提供方必須實現的功能
15.2. 動態 OpenID 提供方必須實現的功能
15.3. 發現和注冊
15.4.
依賴方必須實現的功能
15.5. 實現說明
15.5.1.
授權碼實施說明
15.5.2.
隨機數實施說明
15.5.3.
重定向 URI 片段處理實施說明
15.6.
兼容性說明
15.7.
相關規范和實施者指南
16.
安全考慮
16.1. 請求披露
16.2.
服務器偽裝
16.3. 令牌制造/修改
16.4. 訪問令牌披露
16.5. 服務器響應披露
16.6. 服務器響應否認
16.7.
請求否認
16.8.
訪問令牌重定向
16.9.
令牌重用
16.10.
竊聽或泄露授權碼(輔助驗證器捕獲)
16.11.
令牌替換
16.12.
定時攻擊
16.13.
其他與加密相關的攻擊
16.14.
簽署和加密命令
16.15.
頒發者標識符
16.16.
隱式流量威脅
16.17.
TLS 要求
16.18.
訪問令牌和刷新令牌的生命周期
16.19.
對稱密鑰熵
16.20.
需要簽署請求
16.21.
需要加密請求
16.22.
HTTP 307 重定向
16.23. iOS上的自定義 URI 方案
17
隱私注意事項
17.1.
個人身份信息
17.2.
數據訪問監控
17.3.
相關性
17.4.
離線訪問
18.
IANA 注意事項
18.1.
JSON Web 令牌聲明注冊
18.1.1.
注冊表內容
18.2.
OAuth 參數注冊
18.2.1.
注冊表內容
18.3.
OAuth 擴展錯誤注冊
18.3.1.
注冊表內容
18.4.
URI 方案注冊
18.4.1.
登記內容
19.
參考文獻
19.1.
規范性參考文獻
19.2.
資料性參考文獻
附錄 A.
授權示例
A.1.
使用response_type=code 的示例
A.2.
使用response_type=id_token 的示例
A.3.
使用response_type=id_token 令牌的示例
A.4.
使用response_type=code id_token 的示例
A.5.
使用response_type=code 令牌的示例
A.6.
使用response_type=code id_token 令牌的示例
A.7.
示例中使用的 RSA 密鑰
附錄 B.
致謝
附錄 C.
通知
§
作者地址
| 目錄 |
OpenID Connect 1.0 是 OAuth 2.0 [RFC6749](Hardt, D., Ed.,“OAuth 2.0 授權框架”,2012 年 10 月。)協議 之上的簡單身份層 。它使客戶端能夠根據授權服務器執行的身份驗證來驗證最終用戶的身份,并以可互操作和REST 風格的方式獲取有關最終用戶的基本資料信息。
OpenID Connect Core 1.0 規范定義了核心 OpenID Connect 功能:基于 OAuth 2.0 構建的身份驗證以及使用聲明來傳達有關最終用戶的信息。它還描述了使用 OpenID Connect 的安全和隱私注意事項。
作為背景,OAuth 2.0 授權框架(Hardt, D., Ed.,“OAuth 2.0 授權框架”,2012 年 10 月。)[RFC6749] 和OAuth 2.0 承載令牌使用(Jones, M. 和 D. Hardt,“OAuth 2.0 授權框架:不記名令牌的使用”,2012 年 10 月。)[RFC6750] 規范為第三方應用程序獲取和使用對 HTTP 資源的有限訪問提供了通用框架。他們定義了獲取和使用訪問令牌來訪問資源的機制,但沒有定義提供身份信息的標準方法。值得注意的是,如果不分析 OAuth 2.0,它就無法提供有關最終用戶身份驗證的信息。讀者應該熟悉這些規范。
OpenID Connect 將身份驗證作為 OAuth 2.0 授權流程的擴展來實現。客戶端通過在授權請求中包含openid范圍值來請求使用此擴展。有關所執行身份驗證的信息以JSON Web 令牌 (JWT)(Jones, M.、Bradley, J. 和 N. Sakimura,“JSON Web 令牌 (JWT)”,2015 年 5 月。) [JWT]形式返回,稱為 ID 令牌(請參閱第 2 節(身份令牌))。實現 OpenID Connect 的 OAuth 2.0 身份驗證服務器也稱為 OpenID 提供方 (OP)。使用 OpenID Connect 的 OAuth 2.0 客戶端也稱為依賴方 (RP)。
本規范假設依賴方已獲得有關 OpenID 提供方的配置信息,包括其授權端點和令牌端點位置。此信息通常通過 Discovery 獲取,如OpenID Connect Discovery 1.0(Sakimura, N.、Bradley, J.、Jones, M. 和 E. Jay,“OpenID Connect Discovery 1.0”,2023 年 12 月。) [OpenID.Discovery] 中所述,或者可以通過其他機制獲取。
同樣,本規范假設依賴方已獲得足夠的憑據并提供了使用 OpenID 提供方所需的信息。這通常通過動態注冊完成,如 OpenID Connect 動態客戶端注冊 1.0(Sakimura, N.、Bradley, J. 和 M. Jones,“OpenID Connect 動態客戶端注冊 1.0”,2023 年 12 月。) [OpenID.Registration] 中所述,或者可以通過其他機制獲得。
該規范的先前版本是:
| 目錄 |
關鍵詞“必須”、“不得”、“必需”、“應”、“不應”、“應該”、“不應該”、“推薦”、“不推薦”、“可以”和“可選”本文檔中的“應按照RFC 2119(Bradner, S.,“RFC 中用于指示需求級別的關鍵詞”,1997 年 3 月。) [RFC2119] 中的描述進行解釋。
在本規范的 .txt 版本中,引用值表明它們應按字面意思理解。在協議消息中使用這些值時,不得將引號用作值的一部分。在本規范的 HTML 版本中,按字面意思取值是通過使用這種固定寬度字體來指示的。
本規范中JSON Web 簽名 (JWS)(Jones, M.、Bradley, J. 和 N. Sakimura,“JSON Web 簽名 (JWS)”,2015 年 5 月。) [JWS] 和JSON Web 加密 (JWE)(Jones, M. 和 J. Hildebrand,“JSON Web 加密 (JWE)”,2015 年 5 月。) [JWE] 數據結構 的所有使用均利用 JWS 緊湊序列化或 JWE 緊湊序列化;不使用 JWS JSON 序列化和 JWE JSON 序列化。
| 目錄 |
本規范使用術語“訪問令牌”、“授權碼”、“授權端點”、“授權許可”、“授權服務器”、“客戶端”、“客戶端身份驗證”、“客戶端標識符”、“客戶端密鑰”、“ OAuth 2.0(Hardt, D., Ed.,“OAuth 2.0 授權框架”,2012 年 10 月。) [RFC6749]定義的“授權許可類型”、“受保護資源”、“重定向 URI”、“刷新令牌”、“資源服務器”、“響應類型”和“令牌端點”,術語“聲明名稱”、“聲明值”、“JSON Web 令牌 (JWT)”、“JWT 聲明集”和由JSON Web 令牌 (JWT)(Jones, M.、Bradley, J. 和 N. Sakimura,“JSON Web 令牌 (JWT)”,2015 年 5 月。) [JWT] 定義的“嵌套 JWT”,術語“Base64url 編碼”、“標頭參數”和“ JSON Web 簽名 (JWS)(Jones, M.、Bradley, J. 和 N. Sakimura,“JSON Web 簽名 (JWS)”,2015 年 5 月。) [JWS]定義的“JOSE 標頭” 、 RFC 7230(Fielding, R., Ed. and J. Reschke, Ed., “Hypertext Transfer Protocol (HTTP/1.1): Message Syntax and Routing,” June 2014.) [RFC7230]定義的術語“用戶代理”以及OAuth 2.0 多重響應類型編碼實踐 (de Medeiros, B., Ed., Scurtescu, M., Tarjan, P., and M. Jones, “OAuth 2.0 Multiple Response Type Encoding Practices,” February 2014.)[OAuth.Responses]定義的術語“響應模式” 。
本規范還定義了以下術語:
- 驗證
- 用于對實體和所呈現的身份之間的綁定實現足夠的信任的過程。
- 認證請求
- OAuth 2.0 授權請求使用 OpenID Connect 定義的擴展參數和范圍來請求授權服務器(OpenID Connect 提供方)向客戶端(OpenID Connect 依賴方)對最終用戶進行身份驗證。
- 認證上下文
- 依賴方在針對身份驗證響應做出權利決定之前可以要求的信息。此類上下文可以包括但不限于所使用的實際身份驗證方法或保證級別,例如 ISO/IEC 29115 (International Organization for Standardization, “ISO/IEC 29115:2013. Information technology - Security techniques - Entity authentication assurance framework,” April 2013.) [ISO29115] 實體身份驗證保證級別。
- 認證上下文類
- 在特定上下文中被認為彼此等效的一組身份驗證方法或過程。
- 身份驗證上下文類參考
- 身份驗證上下文類的標識符。
- 授權碼流程
- OAuth 2.0 流程,其中從授權端點返回授權碼,并且從令牌端點返回所有令牌。
- 授權請求
- [RFC6749] (Hardt, D., Ed., “The OAuth 2.0 Authorization Framework,” October 2012.) 定義的 OAuth 2.0 授權請求。
- 宣稱
- 斷言有關實體的信息。
- 聲明類型
- 用于表示聲明值的語法。該規范定義了普通、聚合和分布式聲明類型。
- 理賠提供方
- 可以返回有關實體的聲明的服務器。
- 憑據
- 作為使用身份或其他資源的權利證據提供的數據。
- 最終用戶
- 人類參與者。
- 實體
- 具有獨立且獨特的存在并且可以在上下文中識別的東西。最終用戶是實體的一個示例。
- 基本聲明
- 客戶指定的聲明是確保最終用戶請求的特定任務順利授權體驗所必需。
- 混合流
- OAuth 2.0 流程,其中從授權端點返回授權碼,從授權端點返回一些令牌,從令牌端點返回其他令牌。
- 身份令牌
- JSON Web 令牌 (JWT) (Jones, M., Bradley, J., and N. Sakimura, “JSON Web Token (JWT),” May 2015.) [JWT],包含有關身份驗證事件的聲明。它可能包含其他聲明。
- 標識符
- 在特定上下文中唯一表征實體的值。
- 身份
- 與實體相關的屬性集。
- 隱式流程
- OAuth 2.0 流程,其中所有令牌均從授權端點返回,并且既不使用令牌端點也不使用授權碼。
- 頒發者
- 發出一組聲明的實體。
- 頒發者標識符
- 頒發者的可驗證標識符。頒發者標識符是使用https方案的區分大小寫的 URL,其中包含方案、主機以及可選的端口號和路徑組件,但不包含查詢或片段組件。
- 信息
- OpenID 依賴方和 OpenID 提供方之間的請求或響應。
- OpenID 提供方 (OP)
- OAuth 2.0 授權服務器能夠對最終用戶進行身份驗證并向依賴方提供有關身份驗證事件和最終用戶的聲明。
- 請求對象
- JWT 包含一組請求參數作為其聲明。
- 請求URI
- 引用包含請求對象的資源的 URL。請求 URI 內容必須可由授權服務器檢索。
- 成對假名標識符 (PPID)
- 向依賴方標識實體的標識符,該標識符無法與另一個依賴方的實體的 PPID 相關聯。
- 個人身份信息 (PII)
- (a) 可用于識別與該信息相關的自然人的信息,或者 (b) 是或可能與與該信息相關的自然人直接或間接相關的信息。
- 依賴方 (RP)
- OAuth 2.0 客戶端應用程序需要來自 OpenID 提供方的最終用戶身份驗證和聲明。
- 扇區標識符
- 依賴方組織使用的 URL 的主機組件,是該依賴方成對主題標識符計算的輸入。
- 自簽發 OpenID 提供方
- 頒發自簽發的 ID 令牌的個人自托管 OpenID 提供方。
- 主題標識符
- 最終用戶的頒發者內部本地唯一且從未重新分配的標識符,旨在由客戶端使用。
- 用戶信息端點
- 受保護的資源,當客戶端提供訪問令牌時,返回有關由相應授權許可代表的最終用戶的授權信息。 UserInfo 端點 URL 必須使用https方案,并且可以包含端口、路徑和查詢參數組件。
- 驗證
- 旨在確定結構的健全性或正確性的過程。
- 確認
- 旨在測試或證明事實或值的真實性或準確性的過程。
- 自愿聲明
- 客戶指定的聲明對最終用戶請求的特定任務有用但不是必需。
讀者重要提示:本節中的術語定義是本規范的規范部分,對實現提出了要求。本規范文本中的所有大寫單詞(例如“頒發者標識符”)均引用這些定義的術語。每當讀者遇到它們時,都必須遵循本節中的定義。
有關某些術語的更多背景信息,請參閱《互聯網安全術語表》第 2 版 (Shirey, R., “Internet Security Glossary, Version 2,” August 2007.)[RFC4949]、 ISO/IEC 29115 實體身份驗證保證 (International Organization for Standardization, “ISO/IEC 29115:2013. Information technology - Security techniques - Entity authentication assurance framework,” April 2013.)[ISO29115] 和ITU-T X.1252 (International Telecommunication Union, “ITU-T Recommendation X.1252 - Cyberspace security - Identity management - Baseline identity management terms and definitions,” April 2010.) [X.1252]。
| 目錄 |
OpenID Connect 協議抽象地遵循以下步驟。
這些步驟如下圖所示:
+--------+ +--------+ | | | | | |---------(1) AuthN Request-------->| | | | | | | | +--------+ | | | | | | | | | | | End- |<--(2) AuthN & AuthZ-->| | | | | User | | | | RP | | | | OP | | | +--------+ | | | | | | | |<--------(3) AuthN Response--------| | | | | | | |---------(4) UserInfo Request----->| | | | | | | |<--------(5) UserInfo Response-----| | | | | | +--------+ +--------+
| 目錄 |
OpenID Connect 對 OAuth 2.0 進行的主要擴展是 ID 令牌數據結構,以使最終用戶能夠進行身份驗證。 ID 令牌是一種安全令牌,包含有關使用客戶端時授權服務器對最終用戶進行身份驗證的聲明,以及可能的其他請求的聲明。 ID 令牌表示為 JSON Web 令牌 (JWT) (Jones, M., Bradley, J., and N. Sakimura, “JSON Web Token (JWT),” May 2015.) [JWT]。
以下聲明在 OpenID Connect 使用的所有 OAuth 2.0 流的 ID 令牌中使用:
- 國際空間站
- 必需。響應的頒發者的頒發者標識符。 iss值是一個區分大小寫的 URL,使用https方案,其中包含方案、主機以及可選的端口號和路徑組件,但不包含查詢或片段組件。
- 子
- 必需。主題標識符。最終用戶的頒發者內本地唯一且永不重新分配的標識符,旨在由客戶端使用,例如24400320 或AItOawmwtWwcT0k51BayewNvutrJUqsvl6qs7A4。它的長度不得超過 255 個 ASCII [RFC20]字符。 (Cerf, V., “ASCII format for Network Interchange,” October 1969.)sub值是區分大小寫的字符串。
- 音頻
- 必需。此 ID 令牌的目標受眾。它必須包含 依賴方的OAuth 2.0 client_id作為受眾值。它還可以包含其他受眾的標識符。一般情況下,aud值是一個區分大小寫的字符串數組。在有一個觀眾的常見特殊情況下,aud值可以是單個區分大小寫的字符串。
- 經驗值
- 必需。到期時間,在該時間或之后,在與 OP 執行身份驗證時,RP 不得接受 ID 令牌。處理此參數要求當前日期/時間必須早于值中列出的到期日期/時間。實施者可以提供一些小的余地,通常不超過幾分鐘,以解決時鐘偏差。它的值是一個 JSON [RFC8259] (Bray, T., Ed., “The JavaScript Object Notation (JSON) Data Interchange Format,” December 2017.)數字,表示從 1970-01-01T00:00:00Z(以 UTC 測量)到日期/時間的秒數。有關一般日期/時間(特別是 UTC)的詳細信息,請參閱RFC 3339 (Klyne, G. and C. Newman, “Date and Time on the Internet: Timestamps,” July 2002.) [RFC3339]。注意:ID 令牌過期時間與 RP 和 OP 之間經過身份驗證的會話的生命周期無關。
- 我在
- 必需。 JWT 的發布時間。它的值是一個 JSON 數字,表示從 1970-01-01T00:00:00Z(以 UTC 測量)到該日期/時間的秒數。
- 驗證時間
- 最終用戶身份驗證發生的時間。它的值是一個 JSON 數字,表示從 1970-01-01T00:00:00Z(以 UTC 測量)到該日期/時間的秒數。當發出max_age請求或請求auth_time作為基本聲明時,則此聲明是必需的;否則,其包含是可選的。 (auth_time Claim 在語義上對應于 OpenID 2.0 PAPE (Recordon, D., Jones, M., Bufu, J., Ed., Daugherty, J., Ed., and N. Sakimura, “OpenID Provider Authentication Policy Extension 1.0,” December 2008.) [OpenID.PAPE] auth_time響應參數。)
- 隨機數
- 用于將客戶端會話與 ID 令牌相關聯并減輕重放攻擊的字符串值。該值未經修改地從身份驗證請求傳遞到 ID 令牌。如果 ID 令牌中存在,則客戶端必須驗證隨機數聲明值是否等于 身份驗證請求中發送的隨機數參數的值。如果出現在身份驗證請求中,授權服務器必須在 ID 令牌中包含一個隨機數聲明,該聲明值是身份驗證請求中發送的隨機數值。授權服務器不應該對使用的隨機數值執行其他處理。nonce值是區分大小寫的字符串。
- 丙烯酰胺
- 可選。身份驗證上下文類參考。指定身份驗證上下文類參考值的字符串,該值標識執行的身份驗證所滿足的身份驗證上下文類。值“0”表示最終用戶身份驗證不符合 ISO/IEC 29115 (International Organization for Standardization, “ISO/IEC 29115:2013. Information technology - Security techniques - Entity authentication assurance framework,” April 2013.) [ISO29115] 1 級的要求。由于歷史原因,值“0”用于表示不確信同一個人是同一個人。實際上在那里。級別 0 的身份驗證不應用于授權對任何貨幣價值的任何資源的訪問。 (這對應于 OpenID 2.0 PAPE (Recordon, D., Jones, M., Bufu, J., Ed., Daugherty, J., Ed., and N. Sakimura, “OpenID Provider Authentication Policy Extension 1.0,” December 2008.) [OpenID.PAPE] nist_auth_level 0.)絕對 URI 或RFC 6711 (Johansson, L., “An IANA Registry for Level of Assurance (LoA) Profiles,” August 2012.) [RFC6711] 注冊名稱應該用作acr值;注冊名稱不得以與注冊名稱不同的含義使用。使用此聲明的各方需要就所使用的值的含義達成一致,這可能是特定于上下文的。acr值是區分大小寫的字符串。
- 阿姆魯
- 可選。身份驗證方法參考。 JSON 字符串數組,是身份驗證中使用的身份驗證方法的標識符。例如,值可能表明同時使用了密碼和 OTP 身份驗證方法。amr值是區分大小寫的字符串數組。amr聲明中使用的值 應來自在[RFC8176] 建立的IANA 身份驗證方法參考值注冊表[IANA.AMR] (IANA, “Authentication Method Reference Values,” .)中注冊的值;使用此聲明的各方需要就所使用的任何未注冊值的含義達成一致,這可能是特定于上下文的。 (Jones, M., Hunt, P., and A. Nadalin, “Authentication Method Reference Values,” June 2017.)
- 氮雜蛋白
- 可選。授權方 - ID 令牌的頒發方。如果存在,它必須包含該方的 OAuth 2.0 客戶端 ID。azp值是包含 StringOrURI 值的區分大小寫的字符串。請注意,實際上,azp聲明僅在使用超出本規范范圍的擴展時出現;因此,鼓勵不使用此類擴展的實現不要使用azp ,并在它發生時忽略它。
ID 令牌可能包含其他聲明。任何不被理解的聲明都必須被忽略。 有關本規范定義的附加聲明, 請 參閱 第 3.1.3.6、3.3.2.11、5.1和 (ID Token)7.4 節 (ID Token)。 (Standard Claims) (Self-Issued OpenID Provider Response)
ID 令牌必須使用JWS [JWS] 進行簽名,并且可選地分別使用 (Jones, M., Bradley, J., and N. Sakimura, “JSON Web Signature (JWS),” May 2015.)JWS (Jones, M., Bradley, J., and N. Sakimura, “JSON Web Signature (JWS),” May 2015.) [JWS] 和JWE (Jones, M. and J. Hildebrand, “JSON Web Encryption (JWE),” May 2015.) [JWE]進行簽名和加密,從而根據第 16.14 節 (Signing and Encryption Order)提供身份驗證、完整性、不可否認性和可選的機密性。如果 ID 令牌已加密,則必須對其進行簽名然后加密,結果是嵌套 JWT,如[JWT] (Jones, M., Bradley, J., and N. Sakimura, “JSON Web Token (JWT),” May 2015.)中所定義。 ID 令牌不得使用none 作為alg值,除非使用的響應類型未從授權端點返回任何 ID 令牌(例如使用授權碼流程時)并且客戶端在注冊時 明確請求使用 none 。
ID 令牌不應使用 JWS 或 JWE x5u、 x5c、 jku或 jwk 標頭參數字段。相反,根據第 10 節 (Signatures and Encryption),使用發現和注冊參數提前傳達對所使用密鑰的引用。
以下是 ID 令牌中的聲明集(JWT 聲明集)的非規范示例:
{
"iss": "https://server.example.com",
"sub": "24400320",
"aud": "s6BhdRkqt3",
"nonce": "n-0S6_WzA2Mj",
"exp": 1311281970,
"iat": 1311280970,
"auth_time": 1311280969,
"acr": "urn:mace:incommon:iap:silver"
}
| 目錄 |
OpenID Connect 執行身份驗證以登錄最終用戶或確定最終用戶已登錄。OpenID Connect 將服務器執行的身份驗證結果以安全的方式返回給客戶端,以便客戶端可以信賴它。因此,在這種情況下,客戶端稱為依賴方 (RP)。
身份驗證結果以 ID 令牌形式返回,如第 2 節 (ID Token)中所定義。它有聲明,表達諸如頒發者、主題標識符、執行身份驗證的時間等信息。
身份驗證可以遵循以下三種路徑之一:授權碼流程 ( response_type=code )、隱式流(response_type=id_token token 或response_type=id_token)或混合流(使用 OAuth 2.0 多重響應類型編碼中定義的其他響應類型值)實踐 (de Medeiros, B., Ed., Scurtescu, M., Tarjan, P., and M. Jones, “OAuth 2.0 Multiple Response Type Encoding Practices,” February 2014.)[OAuth.Responses])。這些流程確定如何將 ID 令牌和訪問令牌返回給客戶端。
下面的非規范表總結了這三種流程的特征。該表旨在提供一些關于在特定情況下選擇哪種流程的指導。
| 屬性 | 授權碼流程 | 隱式流程 | 混合流程 |
|---|---|---|---|
| 所有令牌從授權端點返回 | 否 | 是 | 否 |
| 所有令牌從令牌端點返回 | 是 | 否 | 否 |
| 令牌不向用戶代理公開 | 是 | 否 | 否 |
| 客戶端可以進行身份驗證 | 是 | 否 | 是 |
| 可能有刷新令牌 | 是 | 否 | 是 |
| 一次往返通信 | 否 | 是 | 否 |
| 大部分通信為服務器到服務器通信 | 是 | 否 | 變化不定 |
| OpenID Connect 身份驗證流程 |
使用的流程由授權請求中包含的response_type值 確定。這些response_type值選擇這些流:
| “響應類型”值 | 授權類型 |
|---|---|
| code | 授權碼流程 |
| id_token | 隱式流程 |
| id_token token | 隱式流程 |
| code id_token | 混合流 |
| code token | 混合流 |
| code id_token token | 混合流 |
| OpenID Connect“response_type”值 |
除OAuth 2.0 [RFC6749]定義的代碼響應類型值 外,所有其他值均在OAuth 2.0 多重響應類型編碼實踐[OAuth.Responses] 規范中定義 。注意:雖然 OAuth 2.0 還定義了 隱式流的令牌響應類型值,但 OpenID Connect 不使用此響應類型,因為不會返回 ID 令牌。 (Hardt, D., Ed., “The OAuth 2.0 Authorization Framework,” October 2012.) (de Medeiros, B., Ed., Scurtescu, M., Tarjan, P., and M. Jones, “OAuth 2.0 Multiple Response Type Encoding Practices,” February 2014.)
| 目錄 |
本節介紹如何使用授權碼流程執行身份驗證。使用授權碼流程時,所有令牌均從令牌端點返回。
授權碼流程將授權碼返回給客戶端,然后客戶端可以直接將其交換為 ID 令牌和訪問令牌。這樣做的好處是不會向用戶代理以及可能訪問用戶代理的其他惡意應用程序暴露任何令牌。授權服務器還可以在將授權碼交換為訪問令牌之前對客戶端進行身份驗證。授權碼流程適用于可以在自己和授權服務器之間安全維護客戶端密鑰的客戶端。
| 目錄 |
授權碼流程經歷以下步驟。
| 目錄 |
授權端點執行最終用戶的身份驗證。這是通過使用 OAuth 2.0 定義的請求參數以及 OpenID Connect 定義的附加參數和參數值將用戶代理發送到授權服務器的授權端點進行身份驗證和授權來完成的。
與授權端點的通信必須使用 TLS。有關使用 TLS 的更多信息, 請參閱第 16.17 節。 (TLS Requirements)
| 目錄 |
身份驗證請求是 OAuth 2.0 授權請求,請求授權服務器對最終用戶進行身份驗證。
授權服務器必須支持在授權端點使用RFC 7231 [RFC7231]中定義的HTTP GET和 POST方法。客戶端可以使用 HTTP GET或 POST方法將授權請求發送到授權服務器。如果使用 HTTP GET方法,則根據第 13.1 節,使用 URI 查詢字符串序列化來序列化請求參數。如果使用 HTTP POST方法,則根據第 13.2 節 ,使用表單序列化來序列化請求參數。 (Fielding, R., Ed. and J. Reschke, Ed., “Hypertext Transfer Protocol (HTTP/1.1): Semantics and Content,” June 2014.) (Query String Serialization) (Form Serialization)
OpenID Connect 將以下 OAuth 2.0 請求參數與授權碼流程結合使用:
- 范圍
- 必需。 OpenID Connect 請求必須包含openid范圍值。如果openid范圍值不存在,則行為完全未指定。可能存在其他范圍值。實現不能理解的范圍值應該被忽略。 有關本規范定義的其他范圍值, 請參閱第 5.4 (Requesting Claims using Scope Values)節 和第 11節。 (Offline Access)
- 響應類型
- 必需。 OAuth 2.0 響應類型值,確定要使用的授權處理流程,包括從使用的端點返回哪些參數。使用授權碼流程時,該值為 code。
- 客戶ID
- 必需。 OAuth 2.0 客戶端標識符在授權服務器上有效。
- 重定向URI
- 必需。響應將發送到的重定向 URI。該 URI 必須與在 OpenID 提供方處預先注冊的客戶端的重定向 URI 值之一完全匹配,并按照[RFC3986] (Berners-Lee, T., Fielding, R., and L. Masinter, “Uniform Resource Identifier (URI): Generic Syntax,” January 2005.)(簡單字符串比較)第 6.2.1 節中所述執行匹配。使用此流程時,重定向 URI 應使用https方案;但是,它可以使用http方案,前提是客戶端類型是 機密的(如 OAuth 2.0 第 2.1 節中定義),并且 OP 允許在這種情況下使用 http重定向 URI。另外,如果客戶端是本機應用程序,它可以使用帶有 localhost的http方案或 IP 環回文字 127.0.0.1或[::1] 作為主機名。重定向 URI 可以使用替代方案,例如旨在識別對本機應用程序的回調的方案。
- 狀態
- 推薦。用于維護請求和回調之間的狀態的不透明值。通常,跨站點請求偽造(CSRF、XSRF)緩解是通過以加密方式將此參數的值與瀏覽器 cookie 綁定來完成的。
OpenID Connect 還使用以下 OAuth 2.0 請求參數,該參數在 OAuth 2.0 多重響應類型編碼實踐 (de Medeiros, B., Ed., Scurtescu, M., Tarjan, P., and M. Jones, “OAuth 2.0 Multiple Response Type Encoding Practices,” February 2014.)[OAuth.Responses] 中定義:
- 響應模式
- 可選。通知授權服務器用于從授權端點返回參數的機制。當請求的響應模式是為響應類型指定的默認模式時,不建議使用此參數。
該規范還定義了以下請求參數:
- 隨機數
- 可選。用于將客戶端會話與 ID 令牌相關聯并減輕重放攻擊的字符串值。該值未經修改地從身份驗證請求傳遞到 ID 令牌。用于防止攻擊者猜測值的隨機數值中必須存在足夠的熵 。有關實施說明,請參閱第 15.5.2 節 (Nonce Implementation Notes)。
- 展示
- 可選。指定授權服務器如何向最終用戶顯示身份驗證和同意用戶界面頁面的 ASCII 字符串值。定義的值為:
- 頁
- 授權服務器應該顯示與完整用戶代理頁面視圖一致的身份驗證和同意 UI。如果不指定顯示參數,則這是默認的顯示模式。
- 彈出窗口
- 授權服務器應該顯示與彈出的用戶代理窗口一致的身份驗證和同意 UI。彈出的用戶代理窗口的大小應適合以登錄為中心的對話框,并且不應遮蓋其彈出的整個窗口。
- 觸碰
- 授權服務器應該顯示與利用觸摸界面的設備一致的身份驗證和同意 UI。
- 無線應用程序
- 授權服務器應該顯示與“功能手機”類型顯示一致的身份驗證和同意 UI。
- 授權服務器還可以嘗試檢測用戶代理的功能并提供適當的顯示。
- 如果OP接收到一個它不理解的超出上面定義的顯示值,它可以返回一個錯誤或者可以忽略它;實際上,不返回不理解的值的錯誤將有助于促進使用新 顯示值的分階段擴展。
- 迅速的
- 可選。以空格分隔、區分大小寫的 ASCII 字符串值列表,指定授權服務器是否提示最終用戶重新進行身份驗證并同意。定義的值為:
- 沒有任何
- 授權服務器不得顯示任何身份驗證或同意用戶界面頁面。如果最終用戶尚未經過身份驗證,或者客戶沒有對所請求的聲明預先配置同意,或者不滿足處理請求的其他條件,則會返回錯誤。錯誤代碼通常是 login_required、 interaction_required或第3.1.2.6節 (Authentication Error Response)中定義的其他代碼。這可以用作檢查現有身份驗證和/或同意的方法。
- 登錄
- 授權服務器應該提示最終用戶重新進行身份驗證。如果它無法重新驗證最終用戶,它必須返回一個錯誤,通常是login_required。
- 同意
- 授權服務器應在將信息返回給客戶端之前提示最終用戶同意。如果它無法獲得同意,它必須返回一個錯誤,通常是consent_required。
- 選擇帳戶
- 授權服務器應提示最終用戶選擇用戶帳戶。這使得在授權服務器上擁有多個帳戶的最終用戶能夠在他們可能擁有當前會話的多個帳戶中進行選擇。如果它無法獲取最終用戶做出的帳戶選擇選擇,它必須返回錯誤,通常是account_selection_required。
- 客戶端可以使用prompt 參數來確保最終用戶仍在當前會話中或引起對請求的注意。如果此參數包含none 或任何其他值,則返回錯誤。
- 如果 OP 收到上面定義的集合之外的它不理解的提示值,它可以返回錯誤或可以忽略它;在實踐中,不返回不理解的值的錯誤將有助于促進使用新 提示值的分階段擴展。
- 最大年齡
- 可選。最大身份驗證年齡。指定自上次 OP 主動驗證最終用戶以來允許的經過時間(以秒為單位)。如果經過的時間大于此值,OP 必須嘗試主動重新驗證最終用戶。 (max_age請求參數對應于 OpenID 2.0 PAPE (Recordon, D., Jones, M., Bufu, J., Ed., Daugherty, J., Ed., and N. Sakimura, “OpenID Provider Authentication Policy Extension 1.0,” December 2008.) [OpenID.PAPE] max_auth_age請求參數。)當使用max_age時,返回的 ID 令牌必須包含auth_time聲明值。請注意,max_age=0相當于Prompt=login。
- 用戶界面區域設置
- 可選。最終用戶的用戶界面首選語言和腳本,表示為以空格分隔的 BCP47 (Phillips, A., Ed. and M. Davis, Ed., “Tags for Identifying Languages,” September 2009.) [RFC5646] 語言標簽值列表,按首選項排序。例如,值“fr-CA fr en”表示優先選擇在加拿大使用的法語,然后是法語(沒有地區指定),最后是英語(沒有地區指定)。如果 OpenID 提供方不支持部分或全部請求的語言環境,則不應產生錯誤。
- id_token_hint
- 可選。授權服務器先前頒發的 ID 令牌作為有關最終用戶當前或過去與客戶端進行身份驗證的會話的提示進行傳遞。如果 ID 令牌標識的最終用戶已經登錄或作為請求的結果登錄(OP 可能在此決策中評估 ID 令牌之外的其他信息),則授權服務器返回肯定響應;否則,它必須返回錯誤,例如login_required。如果可能的話,當使用prompt=none 時,應該存在id_token_hint ,如果不存在,可能會返回invalid_request錯誤;然而,服務器應該盡可能成功響應,即使它不存在。當授權服務器用作 id_token_hint值時,無需將其列為 ID 令牌的受眾。
- 如果 RP 從 OP 接收到的 ID 令牌是加密的,要將其用作 id_token_hint ,客戶端必須解密加密的 ID 令牌中包含的簽名 ID 令牌。客戶端可以使用密鑰重新加密發送給身份驗證服務器的簽名 ID 令牌,該密鑰使服務器能夠解密 ID 令牌并使用重新加密的 ID 令牌作為 id_token_hint值。
- 登錄提示
- 可選。向授權服務器提示最終用戶可能用于登錄的登錄標識符(如有必要)。如果 RP 首先向最終用戶詢問其電子郵件地址(或其他標識符),然后希望將該值作為提示傳遞給發現的授權服務,則可以使用此提示。建議提示值與用于發現的值匹配。該值也可以是為phone_number聲明指定的格式的電話號碼 。該參數的使用由 OP 自行決定。
- acr_值
- 可選。請求的身份驗證上下文類參考值。以空格分隔的字符串,指定 請求授權服務器用于處理此身份驗證請求的acr值,這些值按優先順序顯示。所執行的身份驗證所滿足的身份驗證上下文類作為acr聲明值返回,如第 2 節 (ID Token)中所指定。 acr Claim 是通過此參數作為自愿聲明請求的。
可以發送其他參數。 有關本規范定義的其他授權請求參數和參數值, 請參閱第3.2.2 (Authorization Endpoint)、 3.3.2 (Authorization Endpoint)、 5.2 (Claims Languages and Scripts)、 5.5 (Requesting Claims using the "claims" Request Parameter)、 6 (Passing Request Parameters as JWTs)和 7.2.1 (Providing Information with the "registration" Request Parameter)節。
以下是客戶端的非規范示例 HTTP 302 重定向響應,它觸發用戶代理向授權端點發出身份驗證請求(值內換行僅用于顯示目的):
HTTP/1.1 302 Found
Location: https://server.example.com/authorize?
response_type=code
&scope=openid%20profile%20email
&client_id=s6BhdRkqt3
&state=af0ifjsldkj
&redirect_uri=https%3A%2F%2Fclient.example.org%2Fcb
以下是非規范示例請求,該請求將由用戶代理發送到授權服務器,以響應上述客戶端的 HTTP 302 重定向響應(值內換行僅用于顯示目的):
GET /authorize?
response_type=code
&scope=openid%20profile%20email
&client_id=s6BhdRkqt3
&state=af0ifjsldkj
&redirect_uri=https%3A%2F%2Fclient.example.org%2Fcb HTTP/1.1
Host: server.example.com
| 目錄 |
授權服務器必須驗證收到的請求,如下所示:
正如OAuth 2.0 (Hardt, D., Ed., “The OAuth 2.0 Authorization Framework,” October 2012.) [RFC6749] 中所指定的,授權服務器應該忽略無法識別的請求參數。
如果授權服務器遇到任何錯誤,它必須根據第 3.1.2.6 節 (Authentication Error Response)返回錯誤響應。
| 目錄 |
如果請求有效,授權服務器將嘗試對最終用戶進行身份驗證或確定最終用戶是否已通過身份驗證,具體取決于所使用的請求參數值。授權服務器用于驗證最終用戶的方法(例如,用戶名和密碼、會話cookie 等)超出了本規范的范圍。授權服務器可以顯示身份驗證用戶界面,具體取決于所使用的請求參數值和所使用的身份驗證方法。
在以下情況下,授權服務器必須嘗試對最終用戶進行身份驗證:
在以下情況下,授權服務器不得與最終用戶交互:
與最終用戶交互時,授權服務器必須采用適當的措施來防止跨站點請求偽造和點擊劫持,如OAuth 2.0 (Hardt, D., Ed., “The OAuth 2.0 Authorization Framework,” October 2012.) [RFC6749] 的第 10.12 和 10.13 節中所述。
| 目錄 |
一旦最終用戶通過身份驗證,授權服務器必須在向依賴方發布信息之前獲得授權決定。當所使用的請求參數允許時,這可以通過與最終用戶的互動對話來完成,明確同意什么,或者通過處理請求的條件或其他方式(例如,通過先前的管理)建立同意。同意)。第2 (ID Token)節和 第5.3 (UserInfo Endpoint)節描述了信息發布機制。
| 目錄 |
身份驗證響應是從 OP 的授權端點返回的 OAuth 2.0 授權響應消息,以響應 RP 發送的授權請求消息。
當使用授權碼流程時,授權響應必須返回OAuth 2.0 (Hardt, D., Ed., “The OAuth 2.0 Authorization Framework,” October 2012.) [RFC6749] 第 4.1.2 節中定義的參數,方法是 將它們作為查詢參數添加到 使用application/x-www-form- 的授權請求中指定的redirect_uri urlencoded格式,除非指定了不同的響應模式。
以下是使用此流程的成功響應的非規范示例(僅出于顯示目的在值內換行):
HTTP/1.1 302 Found
Location: https://client.example.org/cb?
error=invalid_request
&error_description=
Unsupported%20response_type%20value
&state=af0ifjsldkj
有關授權碼內容的實施說明,請參閱第 15.5.1 節 (Authorization Code Implementation Notes)。
| 目錄 |
身份驗證錯誤響應是從 OP 的授權端點返回的 OAuth 2.0 授權錯誤響應消息,以響應 RP 發送的授權請求消息。
如果最終用戶拒絕請求或最終用戶身份驗證失敗,OP(授權服務器)將使用OAuth 2.0 (Hardt, D., Ed., “The OAuth 2.0 Authorization Framework,” October 2012.) [RFC6749] 第 4.1.2.1 節中定義的錯誤響應參數通知 RP(客戶端)。 (與 RFC 6749 無關的 HTTP 錯誤將使用適當的 HTTP 狀態代碼返回給用戶代理。)
除非重定向 URI 無效,否則授權服務器將客戶端返回到授權請求中指定的重定向 URI,并帶有適當的錯誤和狀態參數。其他參數不應返回。如果重定向 URI 無效,授權服務器不得將用戶代理重定向到無效的重定向 URI。
如果不支持響應模式值,則授權服務器將返回 HTTP 響應代碼 400(錯誤請求),且不帶錯誤響應參數,因為需要了解響應模式才能知道如何返回這些參數。
除了OAuth 2.0第4.1.2.1節中定義的錯誤代碼之外,本規范還定義了以下錯誤代碼:
- 需要交互
- 授權服務器需要某種形式的最終用戶交互才能繼續。當身份驗證請求中的提示參數值為none時,可能會返回此錯誤 ,但如果不顯示最終用戶交互的用戶界面,則無法完成身份驗證請求。
- 要求登錄
- 授權服務器需要最終用戶身份驗證。當身份驗證請求中的提示參數值為none時,可能會返回此錯誤 ,但如果不顯示最終用戶身份驗證的用戶界面,則無法完成身份驗證請求。
- account_selection_required
- 最終用戶需要在授權服務器上選擇一個會話。最終用戶可以在授權服務器上使用不同的關聯帳戶進行身份驗證,但最終用戶未選擇會話。當身份驗證請求中的提示參數值為none時,可能會返回此錯誤,但如果不顯示用戶界面來提示要使用的會話,則無法完成身份驗證請求。
- 需要同意
- 授權服務器需要最終用戶同意。當身份驗證請求中的提示參數值為none時,可能會返回此錯誤 ,但如果不顯示最終用戶同意的用戶界面,則無法完成身份驗證請求。
- 無效的請求URI
- 授權請求中的request_uri 返回 錯誤或包含無效數據。
- 無效請求對象
- 請求 參數 包含無效的請求對象。
- 請求不支持
- OP 不支持使用 第 6 節中定義的請求參數。 (Passing Request Parameters as JWTs)
- request_uri_not_supported
- OP 不支持使用 第 6 節中定義的request_uri參數。 (Passing Request Parameters as JWTs)
- 不支持注冊
- OP 不支持使用 第 7.2.1 節中定義的注冊參數。 (Providing Information with the "registration" Request Parameter)
錯誤響應參數如下:
- 錯誤
- 必需。錯誤代碼。
- 錯誤描述
- 可選。人類可讀的 ASCII 編碼文本描述錯誤。
- 錯誤_uri
- 可選。包含有關錯誤的附加信息的網頁的 URI。
- 狀態
- OAuth 2.0 狀態值。如果授權請求包含狀態參數,則為必需。設置為從客戶端收到的值。
使用授權碼流程時,錯誤響應參數將添加到重定向 URI 的查詢組件中,除非指定了不同的響應模式。
以下是使用此流程的非規范示例錯誤響應(值內換行僅用于顯示目的):
HTTP/1.1 302 Found
Location: https://client.example.org/cb?
error=invalid_request
&error_description=
Unsupported%20response_type%20value
&state=af0ifjsldkj
| 目錄 |
使用授權碼流程時,客戶端必須根據 RFC 6749 驗證響應,尤其是第 4.1.2 節和第 10.12 節。
| 目錄 |
為了獲取訪問令牌、ID 令牌和可選的刷新令牌,RP(客戶端)在 (Hardt, D., Ed., “The OAuth 2.0 Authorization Framework,” October 2012.)使用授權碼流程。
與令牌端點的通信必須使用 TLS。有關使用 TLS 的更多信息, 請參閱第 16.17 節。 (TLS Requirements)
| 目錄 |
客戶端通過使用grant_type值 authorization_code 向令牌端點提供其授權許可(以授權碼的形式)來發出令牌請求,如OAuth 2.0 (Hardt, D., Ed., “The OAuth 2.0 Authorization Framework,” October 2012.) [RFC6749] 的第 4.1.3 節中所述。如果客戶端是機密客戶端,則它必須使用為其client_id注冊的身份驗證方法向令牌端點進行身份驗證,如第 9 節 (Client Authentication)中所述。
客戶端根據第 13.2 節,使用 HTTP POST方法和表單序列化 將參數發送到令牌端點,如 OAuth 2.0 [RFC6749] 的第 4.1.3 節中所述。 (Form Serialization) (Hardt, D., Ed., “The OAuth 2.0 Authorization Framework,” October 2012.)
以下是令牌請求的非規范示例(值內換行僅用于顯示目的):
POST /token HTTP/1.1
Host: server.example.com
Content-Type: application/x-www-form-urlencoded
Authorization: Basic czZCaGRSa3F0MzpnWDFmQmF0M2JW
grant_type=authorization_code&code=SplxlOBeZQQYbYS6WxSbIA
&redirect_uri=https%3A%2F%2Fclient.example.org%2Fcb
| 目錄 |
授權服務器必須按如下方式驗證令牌請求:
| 目錄 |
在接收并驗證來自客戶端的有效且授權的令牌請求后,授權服務器返回包含 ID 令牌和訪問令牌的成功響應。成功響應中的參數在OAuth 2.0 (Hardt, D., Ed., “The OAuth 2.0 Authorization Framework,” October 2012.) [RFC6749]的第 4.1.4 節中定義。響應使用application/json 媒體類型。
OAuth 2.0 token_type響應參數值必須是Bearer,如OAuth 2.0 承載令牌使用 (Jones, M. and D. Hardt, “The OAuth 2.0 Authorization Framework: Bearer Token Usage,” October 2012.)[RFC6750] 中所指定,除非已與客戶端協商了另一個令牌類型。服務器應該支持承載令牌類型;使用其他令牌類型超出了本規范的范圍。請注意,token_type值不區分大小寫。
除了 OAuth 2.0 指定的響應參數之外,響應中還必須包含以下參數:
- id_token
- 與經過身份驗證的會話關聯的 ID 令牌值。
所有包含令牌、秘密或其他敏感信息的令牌響應必須包含以下 HTTP 響應標頭字段和值:
| 標頭名稱 | 標頭值 |
|---|---|
| Cache-Control | no-store |
| HTTP 響應標頭和值 |
以下是成功令牌響應的非規范示例。示例中的 ID Token 簽名可以使用 附錄 A.7 (RSA Key Used in Examples)中的密鑰進行驗證。
HTTP/1.1 200 OK
Content-Type: application/json
Cache-Control: no-store
{
"access_token": "SlAV32hkKG",
"token_type": "Bearer",
"refresh_token": "8xLOxBtZp8",
"expires_in": 3600,
"id_token": "eyJhbGciOiJSUzI1NiIsImtpZCI6IjFlOWdkazcifQ.ewogImlzc
yI6ICJodHRwOi8vc2VydmVyLmV4YW1wbGUuY29tIiwKICJzdWIiOiAiMjQ4Mjg5
NzYxMDAxIiwKICJhdWQiOiAiczZCaGRSa3F0MyIsCiAibm9uY2UiOiAibi0wUzZ
fV3pBMk1qIiwKICJleHAiOiAxMzExMjgxOTcwLAogImlhdCI6IDEzMTEyODA5Nz
AKfQ.ggW8hZ1EuVLuxNuuIJKX_V8a_OMXzR0EHR9R6jgdqrOOF4daGU96Sr_P6q
Jp6IcmD3HP99Obi1PRs-cwh3LO-p146waJ8IhehcwL7F09JdijmBqkvPeB2T9CJ
NqeGpe-gccMg4vfKjkM8FcGvnzZUN4_KSP0aAp1tOJ1zZwgjxqGByKHiOtX7Tpd
QyHE5lcMiKPXfEIQILVq0pc_E2DzL7emopWoaoZTF_m0_N0YzFC6g6EJbOEoRoS
K5hoDalrcvRYLSrQAZZKflyuVCyixEoV9GfNQC3_osjzw2PAithfubEEBLuVVk4
XUVrWOLrLl0nx7RkKU8NXNHq-rvKMzqg"
}
正如OAuth 2.0 (Hardt, D., Ed., “The OAuth 2.0 Authorization Framework,” October 2012.) [RFC6749] 中所指定的,客戶端應該忽略無法識別的響應參數。
| 目錄 |
如果令牌請求無效或未經授權,授權服務器將構造錯誤響應。令牌錯誤響應的參數在OAuth 2.0 (Hardt, D., Ed., “The OAuth 2.0 Authorization Framework,” October 2012.) [RFC6749]的第 5.2 節中定義。 HTTP 響應正文使用application/json 媒體類型,HTTP 響應代碼為 400.
以下是一個非規范的令牌錯誤響應示例:
HTTP/1.1 400 Bad Request
Content-Type: application/json
Cache-Control: no-store
{
"error": "invalid_request"
}
| 目錄 |
客戶端必須按如下方式驗證令牌響應:
| 目錄 |
ID Token 的內容如第 2 節 (ID Token)中所述。使用授權碼流程時,以下 ID 令牌聲明的附加要求適用:
- at_hash
- 可選。訪問令牌哈希值。它的值是access_token值的 ASCII 表示的八位字節的散列的最左半部分的 base64url 編碼 ,其中使用的散列算法是ID 令牌的 JOSE 標頭的alg標頭參數中使用的散列算法。例如,如果alg是 RS256,則使用 SHA-256 哈希 access_token值,然后獲取最左邊的 128 位并對它們進行 base64url 編碼。at_hash值是區分大小寫的字符串。
| 目錄 |
客戶端必須按以下方式驗證令牌響應中的 ID 令牌:
| 目錄 |
使用授權碼流程時,如果 ID 令牌包含at_hash聲明,則客戶端可以使用它以與隱式流相同的方式驗證訪問令牌(如第 3.2.2.9 節 (Access Token Validation)中定義),但使用 ID 令牌和從令牌端點返回的訪問令牌。
| 目錄 |
本節介紹如何使用隱式流程執行身份驗證。使用隱式流程時,所有令牌均從授權端點返回;未使用令牌端點。
隱式流程主要由使用腳本語言在瀏覽器中實現的客戶端使用。訪問令牌和 ID 令牌直接返回給客戶端,這可能會將它們公開給最終用戶和有權訪問最終用戶的用戶代理的應用程序。授權服務器不執行客戶端身份驗證。
| 目錄 |
隱式流程遵循以下步驟:
| 目錄 |
使用隱式流程時,授權端點的使用方式與第 3.1.2 節 (Authorization Endpoint)中定義的授權碼流程相同,但本節中指定的差異除外。
| 目錄 |
身份驗證請求按照第 3.1.2.1 節 (Authentication Request) 中的定義進行,但這些身份驗證請求參數的使用方式如下:
- 響應類型
- 必需。 OAuth 2.0 響應類型值,確定要使用的授權處理流程,包括從使用的端點返回哪些參數。當使用隱式流程時,該值為 id_token token或 id_token。這兩個值的含義在OAuth 2.0 多重響應類型編碼實踐 (de Medeiros, B., Ed., Scurtescu, M., Tarjan, P., and M. Jones, “OAuth 2.0 Multiple Response Type Encoding Practices,” February 2014.)[OAuth.Responses]中定義 。當值為id_token時,不會返回 Access Token 。
- 注意:雖然 OAuth 2.0 還定義了 隱式流的令牌響應類型值,但 OpenID Connect 不使用此響應類型,因為不會返回 ID 令牌。
- 重定向URI
- 必需。響應將發送到的重定向 URI。該 URI 必須與在 OpenID 提供方處預先注冊的客戶端的重定向 URI 值之一完全匹配,并按照[RFC3986] (Berners-Lee, T., Fielding, R., and L. Masinter, “Uniform Resource Identifier (URI): Generic Syntax,” January 2005.)(簡單字符串比較)第 6.2.1 節中所述執行匹配。使用此流程時,重定向 URI 不得使用http方案,除非客戶端是本機應用程序,在這種情況下,它可以使用帶有 localhost或 IP 環回文字 127.0.0.1或[::1] 作為主機名的http方案。
- 隨機數
- 必需。用于將客戶端會話與 ID 令牌相關聯并減輕重放攻擊的字符串值。該值未經修改地從身份驗證請求傳遞到 ID 令牌。用于防止攻擊者猜測值的隨機數值中必須存在足夠的熵 。有關實施說明,請參閱第 15.5.2 節 (Nonce Implementation Notes)。
以下是使用隱式流的非規范示例請求,該請求將由用戶代理發送到授權服務器,以響應客戶端的相應 HTTP 302 重定向響應(值內換行僅用于顯示目的):
GET /authorize?
response_type=id_token%20token
&client_id=s6BhdRkqt3
&redirect_uri=https%3A%2F%2Fclient.example.org%2Fcb
&scope=openid%20profile
&state=af0ifjsldkj
&nonce=n-0S6_WzA2Mj HTTP/1.1
Host: server.example.com
| 目錄 |
當使用隱式流程時,驗證請求的驗證方式與授權碼流程相同,如第3.1.2.2 節 (Authentication Request Validation)中所定義。
| 目錄 |
使用隱式流程時,最終用戶身份驗證的執行方式與授權碼流程相同,如第 3.1.2.3 節 (Authorization Server Authenticates End-User)中所定義。
| 目錄 |
使用隱式流程時,最終用戶同意的獲取方式與授權碼流程相同,如第3.1.2.4 節 (Authorization Server Obtains End-User Consent/Authorization)中所定義。
| 目錄 |
使用隱式流程時,身份驗證響應的方式與第 3.1.2.5 節 (Successful Authentication Response)中定義的授權碼流程相同,但本節中指定的差異除外。
使用隱式流時,所有響應參數都將添加到重定向 URI 的片段組件中,如 OAuth 2.0 多重響應類型編碼實踐 (de Medeiros, B., Ed., Scurtescu, M., Tarjan, P., and M. Jones, “OAuth 2.0 Multiple Response Type Encoding Practices,” February 2014.)[OAuth.Responses] 中所指定,除非指定了不同的響應模式。
這些參數從授權端點返回:
- 訪問令牌
- OAuth 2.0 訪問令牌。除非使用的response_type值為 id_token ,否則將返回此值。
- 令牌類型
- OAuth 2.0 令牌類型值。該值必須是Bearer或客戶端與授權服務器協商的另一個token_type值。實現此配置文件的客戶端必須支持OAuth 2.0 承載令牌使用 (Jones, M. and D. Hardt, “The OAuth 2.0 Authorization Framework: Bearer Token Usage,” October 2012.)[RFC6750] 規范。此配置文件僅描述不記名令牌的使用。這與access_token的返回情況相同 。
- id_token
- 必需。 ID 令牌。
- 狀態
- OAuth 2.0 狀態值。如果 授權請求中存在狀態參數,則為必需。客戶端必須驗證 狀態值是否等于授權請求中 狀態參數的值。
- 過期日期在
- 可選。訪問令牌的過期時間(以秒為單位,自響應生成以來)。
根據OAuth 2.0 (Hardt, D., Ed., “The OAuth 2.0 Authorization Framework,” October 2012.) [RFC6749] 的第 4.2.2 節,使用隱式流程時不會返回 任何代碼結果。
以下是使用隱式流程成功響應的非規范示例(換行僅用于顯示目的):
HTTP/1.1 302 Found
Location: https://client.example.org/cb#
access_token=SlAV32hkKG
&token_type=bearer
&id_token=eyJ0 ... NiJ9.eyJ1c ... I6IjIifX0.DeWt4Qu ... ZXso
&expires_in=3600
&state=af0ifjsldkj
| 目錄 |
使用隱式流程時,授權錯誤響應的方式與第 3.1.2.6 節 (Authentication Error Response)中定義的授權碼流程相同,但本節中指定的差異除外。
每當返回錯誤響應參數時,例如當最終用戶拒絕授權或最終用戶身份驗證失敗時,授權服務器必須在重定向 URI 的片段組件中返回錯誤授權響應,如第 4.2.2.1 節中所定義。 OAuth 2.0 (Hardt, D., Ed., “The OAuth 2.0 Authorization Framework,” October 2012.) [RFC6749] 和 OAuth 2.0 多重響應類型編碼實踐 (de Medeiros, B., Ed., Scurtescu, M., Tarjan, P., and M. Jones, “OAuth 2.0 Multiple Response Type Encoding Practices,” February 2014.)[OAuth.Responses],除非指定了不同的響應模式。
| 目錄 |
由于響應參數是在重定向 URI 片段值中返回的,因此客戶端需要讓用戶代理解析片段編碼值并將它們傳遞給客戶端的處理邏輯以供使用。有關 URI 片段處理的實現說明, 請參閱第 15.5.3 節。 (Redirect URI Fragment Handling Implementation Notes)
| 目錄 |
當使用隱式流程時,客戶端必須按如下方式驗證響應:
| 目錄 |
要使用 ID 令牌驗證從授權端點頒發的訪問令牌,客戶端應該執行以下操作:
| 目錄 |
ID Token 的內容如第 2 節 (ID Token)中所述。使用隱式流時,以下 ID 令牌聲明的附加要求適用:
- 隨機數
- 此流程需要 使用隨機數聲明。
- at_hash
- 訪問令牌哈希值。它的值是access_token值的 ASCII 表示的八位字節的散列的最左半部分的 base64url 編碼 ,其中使用的散列算法是ID 令牌的 JOSE 標頭的alg標頭參數中使用的散列算法。例如,如果alg是 RS256,則使用 SHA-256 哈希 access_token值,然后獲取最左邊的 128 位并對它們進行 base64url 編碼。at_hash值是區分大小寫的字符串。
- 如果 ID 令牌是從授權端點使用 access_token值發出的( response_type值 id_token token就是這種情況),則這是必需的;當沒有頒發訪問令牌時,不能使用它,response_type值 id_token就是這種情況。
| 目錄 |
使用隱式流時,必須以與授權碼流程相同的方式驗證 ID 令牌的內容(如第 3.1.3.7 節 (ID Token Validation)中定義),但本節中指定的差異除外。
| 目錄 |
本節介紹如何使用混合流程執行身份驗證。使用混合流時,一些令牌從授權端點返回,其他令牌從令牌端點返回。OAuth 2.0 多重響應類型編碼實踐 (de Medeiros, B., Ed., Scurtescu, M., Tarjan, P., and M. Jones, “OAuth 2.0 Multiple Response Type Encoding Practices,” February 2014.)[OAuth.Responses] 中指定了混合流中返回令牌的機制 。
| 目錄 |
混合流程遵循以下步驟:
| 目錄 |
使用混合流程時,授權端點的使用方式與第 3.1.2 節 (Authorization Endpoint)中定義的授權碼流程相同,但本節中指定的差異除外。
| 目錄 |
身份驗證請求按照第 3.1.2.1 節 (Authentication Request) 中的定義進行,但這些身份驗證請求參數的使用方式如下:
- 響應類型
- 必需。 OAuth 2.0 響應類型值,確定要使用的授權處理流程,包括從使用的端點返回哪些參數。使用混合流時,該值為 code id_token、 code token或 code id_token token。這些值的含義在OAuth 2.0 多重響應類型編碼實踐 (de Medeiros, B., Ed., Scurtescu, M., Tarjan, P., and M. Jones, “OAuth 2.0 Multiple Response Type Encoding Practices,” February 2014.)[OAuth.Responses]中定義 。
- 隨機數
- 如果請求的響應類型是code id_token 或code id_token token,則為必需;如果請求的響應類型為code token ,則為可選。它是一個字符串值,用于將客戶端會話與 ID 令牌相關聯,并減輕重放攻擊。該值未經修改地從身份驗證請求傳遞到 ID 令牌。用于防止攻擊者猜測值的隨機數值中必須存在足夠的熵 。有關實施說明,請參閱第 15.5.2 節 (Nonce Implementation Notes)。
以下是使用混合流的非規范示例請求,該請求將由用戶代理發送到授權服務器,以響應客戶端的相應 HTTP 302 重定向響應(值內換行僅用于顯示目的):
GET /authorize?
response_type=code%20id_token
&client_id=s6BhdRkqt3
&redirect_uri=https%3A%2F%2Fclient.example.org%2Fcb
&scope=openid%20profile%20email
&nonce=n-0S6_WzA2Mj
&state=af0ifjsldkj HTTP/1.1
Host: server.example.com
| 目錄 |
使用混合流程時,驗證請求的驗證方式與授權碼流程相同,如第3.1.2.2 節 (Authentication Request Validation)中所定義。
| 目錄 |
使用混合流程時,最終用戶身份驗證的執行方式與授權碼流程相同,如第3.1.2.3 節 (Authorization Server Authenticates End-User)中所定義。
| 目錄 |
使用混合流程時,最終用戶同意的獲取方式與授權碼流程相同,如第3.1.2.4 節 (Authorization Server Obtains End-User Consent/Authorization)中所定義。
| 目錄 |
當使用混合流時,認證響應的方式與隱式流相同,如第 3.2.2.5 節 (Successful Authentication Response)中所定義,但本節中指定的差異除外。
這些授權端點結果按以下方式使用:
- 訪問令牌
- OAuth 2.0 訪問令牌。當使用的response_type值是 code token或code id_token token時,返回此值。 (在相同情況下也會返回 token_type值。)
- id_token
- ID 令牌。當使用的response_type值是 code id_token或 code id_token token時返回。
- 代碼
- 授權碼。使用混合流時始終會返回此值。
以下是使用混合流成功響應的非規范示例(換行僅用于顯示目的):
HTTP/1.1 302 Found
Location: https://client.example.org/cb#
code=SplxlOBeZQQYbYS6WxSbIA
&id_token=eyJ0 ... NiJ9.eyJ1c ... I6IjIifX0.DeWt4Qu ... ZXso
&state=af0ifjsldkj
| 目錄 |
使用混合流程時,授權錯誤響應的方式與第 3.1.2.6 節 (Authentication Error Response)中定義的授權碼流程相同,但本節中指定的差異除外。
每當返回錯誤響應參數時,例如當最終用戶拒絕授權或最終用戶身份驗證失敗時,授權服務器必須在重定向 URI 的片段組件中返回錯誤授權響應,如第 4.2.2.1 節中所定義。 OAuth 2.0 (Hardt, D., Ed., “The OAuth 2.0 Authorization Framework,” October 2012.) [RFC6749] 和 OAuth 2.0 多重響應類型編碼實踐 (de Medeiros, B., Ed., Scurtescu, M., Tarjan, P., and M. Jones, “OAuth 2.0 Multiple Response Type Encoding Practices,” February 2014.)[OAuth.Responses],除非指定了不同的響應模式。
| 目錄 |
使用混合流時,重定向 URI 片段參數處理的要求與隱式流相同,如第 3.2.2.7 節 (Redirect URI Fragment Handling)中所定義。另請參閱第 15.5.3 節 (Redirect URI Fragment Handling Implementation Notes)有關 URI 片段處理的實現說明。
| 目錄 |
當使用混合流時,客戶端必須按如下方式驗證響應:
| 目錄 |
使用混合流時,從授權端點返回的訪問令牌將以與隱式流相同的方式進行驗證,如第 3.2.2.9 節 (Access Token Validation)中所定義。
| 目錄 |
要使用 ID 令牌驗證從授權端點發出的授權碼,客戶端應該執行以下操作:
| 目錄 |
ID Token 的內容如第 2 節 (ID Token)中所述。使用混合流時,以下 ID 令牌聲明的附加要求適用于從授權端點返回的 ID 令牌:
- 隨機數
- 如果身份驗證請求中存在隨機數參數,則授權服務器必須在 ID 令牌中 包含隨機數聲明。
- at_hash
- 訪問令牌哈希值。它的值是access_token值的 ASCII 表示的八位字節的散列的最左半部分的 base64url 編碼 ,其中使用的散列算法是ID 令牌的 JOSE 標頭的alg標頭參數中使用的散列算法。例如,如果alg是 RS256,則使用 SHA-256 哈希 access_token值,然后獲取最左邊的 128 位并對它們進行 base64url 編碼。at_hash值是區分大小寫的字符串。
- 如果 ID 令牌是從授權端點使用 access_token值發出的( response_type值 代碼 id_token token就是這種情況),則這是必需的;否則,其包含是可選的。
- c_hash
- 代碼哈希值。它的值是代碼值的 ASCII 表示的八位字節的散列的最左半部分的 base64url 編碼 ,其中使用的散列算法是ID 令牌的 JOSE 標頭的alg標頭參數中使用的散列算法。例如,如果alg是 HS512,則 使用 SHA-512 對代碼值進行哈希處理,然后獲取最左邊的 256 位并對它們進行 base64url 編碼。c_hash值是區分大小寫的字符串。
- 如果 ID 令牌是從授權端點發出的,帶有 code , response_type值 code id_token和 code id_token token就是這種情況,這是必需的;否則,其包含是可選的。
| 目錄 |
當使用混合流時,從授權端點返回的 ID 令牌的內容必須以與隱式流相同的方式進行驗證,如第 3.2.2.11 節 (ID Token Validation)中所定義。
| 目錄 |
使用混合流時,令牌端點的使用方式與第 3.1.3 節 (Token Endpoint)中定義的授權碼流程相同,但本節中指定的差異除外。
| 目錄 |
使用混合流程時,令牌請求的發出方式與授權碼流程相同,如第3.1.3.1 節 (Token Request)中所定義。
| 目錄 |
使用混合流程時,令牌請求的驗證方式與授權碼流程相同,如第3.1.3.2 節 (Token Request Validation)中所定義。
| 目錄 |
使用混合流程時,令牌響應的方式與授權碼流程相同,如第 3.1.3.3 節 (Successful Token Response)中所定義。
| 目錄 |
使用混合流程時,令牌錯誤響應的方式與授權碼流程相同,如第3.1.3.4 節 (Token Error Response)中所定義。
| 目錄 |
使用混合流程時,令牌響應的驗證方式與授權碼流程相同,如第3.1.3.5 節 (Token Response Validation)中所定義。
| 目錄 |
使用混合流時,從令牌端點返回的 ID 令牌的內容與從授權端點返回的 ID 令牌的內容相同,如第3.3.2.11 節 (ID Token)中所定義,但本節中指定的差異除外。
如果從授權端點和令牌端點都返回了 ID 令牌(response_type值 代碼 id_token和 代碼 id_token token就是這種情況) ,則兩個 ID 令牌中的iss和sub 聲明值必須相同。任何一個中存在的有關身份驗證事件的所有聲明都應該存在于兩個中。如果任一 ID 令牌包含有關最終用戶的聲明,則兩者中出現的任何內容都應具有相同的值。請注意,例如,出于隱私原因,OP 可以選擇從授權端點返回較少的有關最終用戶的聲明。 at_hash 和c_hash聲明可以從令牌端點返回的 ID 令牌中省略,即使這些聲明存在于從授權端點返回的 ID 令牌中,因為從令牌端點返回的 ID 令牌和訪問令牌值已經進行了加密綁定由令牌端點執行的 TLS 加密結合在一起。
| 目錄 |
使用混合流時,從令牌端點返回的 ID 令牌的內容必須以與授權碼流程相同的方式進行驗證,如第 3.1.3.7 節 (ID Token Validation)中所定義。
| 目錄 |
如果從授權端點和令牌端點都返回訪問令牌(response_type值 code token和 code id_token token就是這種情況),則它們的值可以相同也可以不同。請注意,由于兩個端點的安全特性不同,可能會返回不同的訪問令牌,并且它們的生命周期和對它們授予的資源的訪問權限也可能不同。
| 目錄 |
使用混合流時,從令牌端點返回的訪問令牌以與授權碼流程相同的方式進行驗證,如第 3.1.3.8 節 (Access Token Validation)中所定義。
| 目錄 |
在某些情況下,登錄流程是由 OpenID 提供方或另一方(而不是依賴方)發起的。在這種情況下,發起者在其登錄發起端點重定向到 RP,請求 RP 向指定的 OP 發送身份驗證請求。請注意,此登錄啟動端點可以是 RP 上與 RP 的默認登錄頁面不同的頁面。支持 OpenID Connect 動態客戶端注冊 1.0 (Sakimura, N., Bradley, J., and M. Jones, “OpenID Connect Dynamic Client Registration 1.0,” December 2023.) [OpenID.Registration] 的 RP 使用 initiate_login_uri注冊參數注冊此端點值。
發起登錄請求的一方通過重定向到 RP 上的登錄發起端點并傳遞以下參數來實現此目的:
- 國際空間站
- 必需。 RP 將向其發送身份驗證請求的 OP 的頒發者標識符。它的值必須是使用https方案的URL 。
- 登錄提示
- 可選。向授權服務器提示要進行身份驗證的最終用戶。這個字符串值參數的含義由OP自行決定。在常見用例中,該值將包含 RP 在向 OP 請求身份驗證之前收集的電子郵件地址、電話號碼或用戶名。例如,RP 在向最終用戶詢問其電子郵件地址(或其他標識符)后可以使用此提示,將該標識符作為提示傳遞給 OpenID 提供方。建議提示值與為發現提供的值相匹配。其他用途可以包括使用ID 令牌中的 子聲明作為提示值或有關請求的身份驗證的潛在其他類型的信息。
- 目標鏈接URI
- 可選。 RP認證后請求重定向到的URL。 RP 必須驗證target_link_uri的值, 以防止被用作外部站點的開放重定向器。
這些參數可以使用 HTTP GET方法 作為查詢參數傳遞,也可以作為在用戶代理中自動提交的 HTML 表單值傳遞,從而通過 HTTP POST方法傳輸。
如果擴展定義了其他參數,則可以發送。客戶端必須忽略所使用的任何不理解的參數。
客戶應該采用框架破壞和其他技術來防止最終用戶在不知情的情況下通過點擊劫持等攻擊被第三方網站登錄。有關更多詳細信息, 請參閱[RFC6819]的第 4.4.1.9 節。 (Lodderstedt, T., Ed., McGloin, M., and P. Hunt, “OAuth 2.0 Threat Model and Security Considerations,” January 2013.)
| 目錄 |
本節指定客戶端如何獲取有關最終用戶和身份驗證事件的聲明。它還定義了一組標準的基本資料聲明。可以使用特定范圍值請求預定義的聲明集,也可以使用 聲明請求參數請求單個聲明。聲明可以直接來自 OpenID 提供方,也可以來自分布式來源。
| 目錄 |
本規范定義了一組標準權利要求。可以請求在 UserInfo 響應(根據第 5.3.2 節 (Successful UserInfo Response))或 ID 令牌(根據第 2 節) (ID Token)中返回它們。
| 成員 | 類型 | 描述 |
|---|---|---|
| sub | 字符串 | 主題 - 頒發者的最終用戶的標識符。 |
| name | 字符串 | 可顯示形式的最終用戶全名,包括所有名稱部分,可能包括標題和后綴,根據最終用戶的區域設置和偏好排序。 |
| given_name | 字符串 | 最終用戶的名字。請注意,在某些文化中,人們可以有多個名字;全部都可以存在,名稱之間用空格字符分隔。 |
| family_name | 字符串 | 最終用戶的姓氏。請注意,在某些文化中,人們可以有多個姓氏,也可以沒有姓氏。全部都可以存在,名稱之間用空格字符分隔。 |
| middle_name | 字符串 | 最終用戶的中間名。請注意,在某些文化中,人們可以有多個中間名;全部都可以存在,名稱之間用空格字符分隔。另請注意,在某些文化中,不使用中間名。 |
| nickname | 字符串 | 最終用戶的臨時名稱可能與 給定名稱相同,也可能不同。例如,昵稱值Mike可能會與給定名稱 值Michael 一起返回。 |
| preferred_username | 字符串 | 最終用戶希望在 RP 中引用的簡寫名稱,例如 janedoe或j.doe。該值可以是任何有效的 JSON 字符串,包括特殊字符,例如@、 /或空格。 RP 不得依賴該值是唯一的,如第 5.7 節 (Claim Stability and Uniqueness)所述。 |
| profile | 字符串 | 最終用戶個人資料頁面的 URL。該網頁的內容應該是關于最終用戶的。 |
| picture | 字符串 | 最終用戶個人資料圖片的 URL。此 URL 必須引用圖像文件(例如,PNG、JPEG 或 GIF 圖像文件),而不是包含圖像的網頁。請注意,此 URL 應特別引用適合在描述最終用戶時顯示的最終用戶的個人資料照片,而不是最終用戶拍攝的任意照片。 |
| website | 字符串 | 最終用戶網頁或博客的 URL。該網頁應包含最終用戶或最終用戶所屬組織發布的信息。 |
| 字符串 | 最終用戶的首選電子郵件地址。它的值必須符合RFC 5322 (Resnick, P., Ed., “Internet Message Format,” October 2008.) [RFC5322] addr-spec 語法。 RP 不得依賴該值是唯一的,如第 5.7 節 (Claim Stability and Uniqueness)所述。 | |
| email_verified | 布爾值 | 如果最終用戶的電子郵件地址已得到驗證,則為 True;否則為假。當此聲明值為true時,這意味著 OP 采取了積極措施,以確保在執行驗證時該電子郵件地址由最終用戶控制。驗證電子郵件地址的方式是特定于上下文的,并且取決于雙方運作的信任框架或合同協議。 |
| gender | 字符串 | 最終用戶的性別。本規范定義的值為女性和 男性。當定義的值都不適用時,可以使用其他值。 |
| birthdate | 字符串 | 最終用戶的生日,以 ISO 8601-1 (International Organization for Standardization, “ISO 8601-1:2019/Amd 1:2022. Date and time - Representations for information interchange - Part 1: Basic rules,” October 2022.) [ISO8601-1] YYYY-MM-DD 格式表示。年份可以是0000,表明它被省略。為了僅表示年份,允許使用YYYY格式。請注意,根據底層平臺的日期相關功能,僅提供年份可能會導致月份和日期的變化,因此實施者需要考慮此因素以正確處理日期。 |
| zoneinfo | 字符串 | 來自 IANA 時區數據庫[IANA.time-zones] (IANA, “Time Zone Database,” .)的字符串 ,表示最終用戶的時區。例如,Europe/Paris或 America/Los_Angeles。 |
| locale | 字符串 | 最終用戶的區域設置,表示為 BCP47 (Phillips, A., Ed. and M. Davis, Ed., “Tags for Identifying Languages,” September 2009.) [RFC5646] 語言標簽。這通常是小寫的ISO 639 Alpha-2 [ISO639] 語言代碼和大寫的 (International Organization for Standardization, “ISO 639:2023. Code for individual languages and language groups,” November 2023.)ISO 3166-1 Alpha-2 (International Organization for Standardization, “ISO 3166-1:2020. Codes for the representation of names of countries and their subdivisions - Part 1: Country codes,” August 2020.) [ISO3166-1] 國家/地區代碼,并用破折號分隔。例如, en-US或fr-CA。作為兼容性說明,某些實現使用下劃線而不是破折號作為分隔符,例如 en_US;依賴方也可以選擇接受此語言環境語法。 |
| phone_number | 字符串 | 最終用戶的首選電話號碼。建議采用E.164 (International Telecommunication Union, “E.164: The international public telecommunication numbering plan,” 2010.) [E.164]作為本權利要求的格式,例如+1 (425) 555-1212 或+56 (2) 687 2400。如果電話號碼包含分機號,建議使用 RFC 3966 (Schulzrinne, H., “The tel URI for Telephone Numbers,” December 2004.) [RFC3966] 分機語法表示分機號,例如+1 (604) 555-1234;ext=5678。 |
| phone_number_verified | 布爾值 | 如果最終用戶的電話號碼已得到驗證,則為 True;否則為假。當此聲明值為true時,這意味著 OP 采取了積極措施,以確保在執行驗證時該電話號碼由最終用戶控制。驗證電話號碼的方式是特定于上下文的,并且取決于各方運作的信任框架或合同協議。如果為 true,phone_number 聲明必須采用 E.164 格式,并且任何分機必須以 RFC 3966 格式表示。 |
| address | JSON 對象 | 最終用戶的首選郵政地址。地址成員的值是一個 JSON [RFC8259]結構,包含 (Bray, T., Ed., “The JavaScript Object Notation (JSON) Data Interchange Format,” December 2017.)第 5.1.1 節 (Address Claim)中定義的部分或全部成員。 |
| updated_at | 數字 | 最終用戶信息的最后更新時間。它的值是一個 JSON 數字,表示從 1970-01-01T00:00:00Z(以 UTC 測量)到該日期/時間的秒數。 |
| 表 1:注冊會員定義 |
| 目錄 |
地址聲明代表實際郵寄地址。實現可以僅返回地址字段的子集,具體取決于可用信息和最終用戶的隱私偏好。例如,可能會返回國家和地區,而不返回更細粒度的地址信息。
實現可以僅將完整地址作為格式化子字段中的單個字符串返回,或者它們可以僅返回使用其他子字段的各個組件字段,或者它們可以同時返回兩者。如果返回兩個變體,它們應該表示相同的地址,格式化的地址指示如何組合組件字段。
下面定義的所有地址值均表示為 JSON 字符串。
- 格式化的
- 完整的郵寄地址,格式適合在郵寄標簽上顯示或使用。該字段可以包含多行,以換行符分隔。換行符可以表示為回車/換行對(“\r\n”)或單個換行符(“\n”)。
- 街道地址
- 完整的街道地址組件,可能包括門牌號、街道名稱、郵政信箱和多行擴展街道地址信息。該字段可以包含多行,以換行符分隔。換行符可以表示為回車/換行對(“\r\n”)或單個換行符(“\n”)。
- 地點
- 城市或地區組成部分。
- 地區
- 州、省、地區或地區組成部分。
- 郵政編碼
- 郵政編碼或郵政編碼的組成部分。
- 國家
- 國家/地區名稱組成部分。
| 目錄 |
雖然本說明書僅將一小部分權利要求定義為標準權利要求,但其他權利要求可以與標準權利要求結合使用。使用此類聲明時,建議對聲明名稱使用防沖突名稱,如 JSON Web 令牌 (JWT) (Jones, M., Bradley, J., and N. Sakimura, “JSON Web Token (JWT),” May 2015.) [JWT] 規范中所述。或者,當不太可能出現命名沖突時,可以安全地使用私有聲明名稱,如 JWT 規范中所述。或者,如果特定的附加聲明具有廣泛且普遍的適用性,則可以根據 JWT 規范使用注冊聲明名稱進行注冊。
| 目錄 |
人類可讀的聲明值和引用人類可讀值的聲明值可以用多種語言和腳本表示。為了指定語言和腳本,BCP47 (Phillips, A., Ed. and M. Davis, Ed., “Tags for Identifying Languages,” September 2009.) [RFC5646] 語言標簽被添加到成員名稱中,并由#字符分隔。例如, family_name#ja-Kana-JP表示日語中片假名的姓氏,通常用于索引和表示以family_name#ja-Hani-JP表示的相同名稱的漢字表示的語音。作為另一個示例,可能會返回website和 website#de聲明值,引用未指定語言的網站和德語網站。
由于聲明名稱區分大小寫,因此強烈建議聲明名稱中使用的語言標簽值應使用在 IANA“語言子標簽注冊表” [IANA.Language] (IANA, “Language Subtag Registry,” .) 中注冊的字符大小寫進行拼寫。特別地,通常語言名稱用小寫字符拼寫,區域名稱用大寫字符拼寫,并且腳本用混合大小寫字符拼寫。然而,由于 BCP47 語言標簽值不區分大小寫,因此實現應該解釋以不區分大小寫的方式提供的語言標簽值。
根據 BCP47 中的建議,聲明的語言標簽值應僅根據需要具體化。例如,在許多情況下使用fr可能就足夠了,而不是fr-CA或 fr-FR。在可能的情況下,OP 應該嘗試將請求的聲明區域設置與其擁有的聲明相匹配。例如,如果客戶要求帶有de(德語)語言標簽的聲明,并且 OP 具有帶有de-CH(瑞士德語)標記的值,并且沒有通用德語值,則 OP 應該返回瑞士語德國對客戶的價值。 (這有意將語言標簽匹配的復雜性盡可能轉移到 OP,以簡化客戶端。)
OpenID Connect 定義以下授權請求參數,以指定用于返回聲明的首選語言和腳本:
- 聲明_區域設置
- 可選。最終用戶返回的聲明的首選語言和腳本,表示為BCP47 (Phillips, A., Ed. and M. Davis, Ed., “Tags for Identifying Languages,” September 2009.) [RFC5646] 語言標簽值的空格分隔列表 ,按偏好排序。如果 OpenID 提供方不支持部分或全部請求的語言環境,則不應產生錯誤。
當OP通過 claims_locales參數或其他方式確定最終用戶和客戶端僅以一組語言和腳本請求聲明時,建議OP在使用該語言時返回不帶語言標簽的聲明和腳本。還建議客戶端以可以使用語言標簽處理和利用聲明的方式編寫。
| 目錄 |
UserInfo 端點是受 OAuth 2.0 保護的資源,可返回有關經過身份驗證的最終用戶的聲明。要獲取有關最終用戶的請求聲明,客戶端使用通過 OpenID Connect 身份驗證獲得的訪問令牌向 UserInfo 端點發出請求。這些聲明通常由 JSON 對象表示,該對象包含聲明的名稱和值對集合。
與 UserInfo 端點的通信必須使用 TLS。有關使用 TLS 的更多信息, 請參閱第 16.17 節。 (TLS Requirements)
UserInfo 端點必須支持使用RFC 7231 [RFC7231] 中定義的HTTP GET和 HTTP POST方法。 (Fielding, R., Ed. and J. Reschke, Ed., “Hypertext Transfer Protocol (HTTP/1.1): Semantics and Content,” June 2014.)
UserInfo 端點必須接受訪問令牌作為 OAuth 2.0 承載令牌用法 (Jones, M. and D. Hardt, “The OAuth 2.0 Authorization Framework: Bearer Token Usage,” October 2012.)[RFC6750]。
UserInfo 端點應支持使用 跨源資源共享 (CORS) (Opera Software ASA, “Cross-Origin Resource Sharing,” July 2010.) [CORS] 和/或其他適當的方法,以使 JavaScript 客戶端和其他基于瀏覽器的客戶端能夠訪問它。
| 目錄 |
客戶端使用 HTTP GET或 HTTP POST 發送 UserInfo 請求。根據OAuth 2.0 承載令牌使用 (Jones, M. and D. Hardt, “The OAuth 2.0 Authorization Framework: Bearer Token Usage,” October 2012.)[RFC6750] 第 2 節,從 OpenID Connect 身份驗證請求獲取的訪問令牌必須作為承載令牌發送。
建議請求使用 HTTP GET方法,并使用授權標頭字段發送訪問令牌 。
以下是 UserInfo 請求的非規范示例:
GET /userinfo HTTP/1.1 Host: server.example.com Authorization: Bearer [Your Access Token]
| 目錄 |
UserInfo 聲明必須作為 JSON 對象的成員返回,除非在客戶端注冊期間請求簽名或加密的響應。可以退回 第 5.1 節 (Standard Claims)中定義的聲明,以及此處未指定的其他聲明。
出于隱私原因,OpenID 提供方可以選擇不返回某些請求的聲明的值。不返回所請求的聲明并不是錯誤情況。
如果未返回聲明,則應從表示聲明的 JSON 對象中省略該聲明名稱;它不應該與 null 或空字符串值一起出現。
子(主題)聲明必須始終在 UserInfo 響應中返回。
注意:由于令牌替換攻擊的可能性(請參閱第 16.11 節 (Token Substitution)),用戶信息響應不能保證與ID 令牌的子(主題)元素標識的最終用戶有關。必須驗證 UserInfo 響應中的 子聲明是否與 ID 令牌中的子聲明完全匹配;如果它們不匹配,則不得使用 UserInfo 響應值。
收到 UserInfo 請求后,UserInfo 端點必須在 HTTP 響應正文中返回 UserInfo 響應的 JSON 序列化,如 第 13.3 節 (JSON Serialization)中所述,除非在注冊期間指定了不同的格式 [OpenID.Registration] (Sakimura, N., Bradley, J., and M. Jones, “OpenID Connect Dynamic Client Registration 1.0,” December 2023.)。 UserInfo 端點必須返回一個內容類型標頭以指示返回哪種格式。如果響應正文是文本 JSON 對象,則HTTP 響應的內容類型必須是application/json ;響應正文應該使用 UTF-8 進行編碼。
如果 UserInfo 響應已簽名和/或加密,則聲明將以 JWT 返回,并且內容類型必須為application/jwt。響應可以在不簽名的情況下進行加密。如果同時請求簽名和加密,則必須對響應進行簽名然后加密,結果是嵌套 JWT,如[JWT] (Jones, M., Bradley, J., and N. Sakimura, “JSON Web Token (JWT),” May 2015.)中定義。
如果已簽名,則 UserInfo 響應必須包含聲明 iss(頒發者)和aud(受眾)作為成員。 iss值必須是OP 的頒發者標識符 URL。 aud值必須是或包含 RP 的客戶端 ID 值。
以下是 UserInfo 響應的非規范示例:
HTTP/1.1 200 OK
Content-Type: application/json
{
"sub": "248289761001",
"name": "Jane Doe",
"given_name": "Jane",
"family_name": "Doe",
"preferred_username": "j.doe",
"email": "janedoe@example.com",
"picture": "http://example.com/janedoe/me.jpg"
}
| 目錄 |
當發生錯誤情況時,UserInfo 端點將返回錯誤響應,如 OAuth 2.0 承載令牌使用 (Jones, M. and D. Hardt, “The OAuth 2.0 Authorization Framework: Bearer Token Usage,” October 2012.)[RFC6750] 第 3 節中所定義。 (與 RFC 6750 無關的 HTTP 錯誤將使用適當的 HTTP 狀態代碼返回給用戶代理。)
以下是 UserInfo 錯誤響應的非規范示例:
HTTP/1.1 401 Unauthorized
WWW-Authenticate: Bearer error="invalid_token",
error_description="The Access Token expired"
| 目錄 |
客戶端必須按如下方式驗證 UserInfo 響應:
| 目錄 |
OpenID Connect 客戶端使用OAuth 2.0 [RFC6749]第 3.3 節中定義的范圍值來指定為訪問令牌請求哪些訪問權限。與訪問令牌關聯的范圍決定了哪些資源在用于訪問 OAuth 2.0 受保護端點時可用。受保護的資源端點可以根據請求提供的訪問令牌時使用的范圍值和其他參數執行不同的操作并返回不同的信息。 (Hardt, D., Ed., “The OAuth 2.0 Authorization Framework,” October 2012.)
對于 OpenID Connect,范圍可用于請求將特定信息集作為聲明值提供。
以下范圍請求的聲明被授權服務器視為自愿聲明。
OpenID Connect 定義了以下用于請求聲明的 范圍值:
- 輪廓
- 可選。此范圍值請求訪問最終用戶的默認資料聲明,其中包括: name、 family_name、 given_name、 middle_name、 nickname、 preferred_username、 profile、 picture、 website、 gender、 birthdate、 zoneinfo、 locale和 updated_at。
- 電子郵件
- 可選。此范圍值請求訪問電子郵件和 email_verified聲明。
- 地址
- 可選。該范圍值請求訪問地址Claim。
- 電話
- 可選。此范圍值請求訪問phone_number和 phone_number_verified聲明。
可以通過創建空格分隔、區分大小寫的 ASCII 范圍值列表來使用多個范圍值。
當使用導致頒發訪問令牌的response_type值時,如第5.3.2節中所述, profile、 email、 address和 phone范圍值 請求的聲明 將從UserInfo端點返回。但是,當沒有頒發訪問令牌時( response_type 值id_token就是這種情況),生成的聲明將在 ID 令牌中返回。 (Successful UserInfo Response)
在某些情況下,最終用戶可以選擇讓 OpenID 提供方拒絕提供 RP 請求的部分或全部信息。為了最大限度地減少最終用戶被要求披露的信息量,RP 可以選擇僅請求 UserInfo 端點提供的信息的子集。
以下是未編碼 范圍請求的非規范示例:
scope=openid profile email phone
| 目錄 |
OpenID Connect 定義以下授權請求參數,以允許請求單獨的聲明并指定適用于所請求的聲明的參數:
- 聲明
- 可選。該參數用于請求返回特定的聲明。該值是一個列出請求的聲明的 JSON 對象。
聲明身份驗證請求參數請求從 UserInfo 端點和/或 ID 令牌中返回特定聲明。它表示為一個 JSON 對象,其中包含從這些位置請求的聲明列表。所請求的聲明的屬性也可以被指定。
對聲明參數 的支持是可選的。如果 OP 不支持此參數而 RP 使用它,則 OP 應使用其認為合適的任何啟發式方法,向 RP 返回一組它認為對 RP 和最終用戶有用的聲明。 Claims_parameter_supported Discovery 結果指示OP是否支持該參數。
聲明 參數值在 OAuth 2.0 請求中表示為 UTF-8 編碼的 JSON(當作為 OAuth 參數傳遞時,最終會進行表單 urlencoded)。當在請求對象值中使用時,根據第 6.1 節 (Passing a Request Object by Value),JSON 用作 聲明成員的值。
聲明請求 JSON 對象的頂級成員是:
- 用戶信息
- 可選。請求從 UserInfo 端點返回列出的各個聲明。如果存在,則請求將列出的聲明添加到使用范圍值請求的任何聲明中 。如果不存在,則從 UserInfo 端點請求的聲明只是使用 范圍值請求的聲明。
- 當使用userinfo成員時,請求還必須使用response_type 值,該值會導致向客戶端頒發訪問令牌以在 UserInfo 端點處使用。
- id_token
- 可選。請求在 ID 令牌中返回列出的單個聲明。如果存在,則請求將列出的聲明添加到 ID 令牌中的默認聲明中。如果不存在,則根據第 2 節中的 ID 令牌定義以及第 (ID Token)3.1.3.6 (ID Token)、 3.2.2.10 (ID Token)、 3.3.2.11 (ID Token)和3.3.3.6 (ID Token) 節中的附加每流 ID 令牌要求 請求默認 ID 令牌聲明。
其他成員可能會在場。任何不被理解的成員都必須被忽略。
聲明請求示例如下:
{
"userinfo":
{
"given_name": {"essential": true},
"nickname": null,
"email": {"essential": true},
"email_verified": {"essential": true},
"picture": null,
"http://example.info/claims/groups": null
},
"id_token":
{
"auth_time": {"essential": true},
"acr": {"values": ["urn:mace:incommon:iap:silver"] }
}
}
| 目錄 |
聲明請求的 userinfo和 id_token成員 都是 JSON 對象,其中所請求的各個聲明的名稱作為成員名稱。成員值必須是以下之一:
- 無效的
- 表示正在以默認方式請求此聲明。特別是,這是自愿聲明。例如,聲明請求:
以默認方式 請求給定名稱聲明。"given_name": null- JSON 對象
- 用于提供有關所請求的聲明的附加信息。該規范定義了以下成員:
- 基本的
- 可選。指示所請求的聲明是否為基本聲明。如果該值為true,則表明該聲明是基本聲明。例如,聲明請求:
可用于指定必須返回 auth_time聲明值。"auth_time": {"essential": true}
- 如果該值為false,則表明它是自愿聲明。默認為false。
- 通過請求作為基本聲明的聲明,RP 向最終用戶表明釋放這些聲明將確保最終用戶請求的特定任務的順利授權。請注意,即使聲明因最終用戶未授權其發布或聲明不存在而不可用,授權服務器在未返回聲明時也不得生成錯誤,無論它們是基本的還是自愿的,除非在具體權利要求的描述。
- 價值
- 可選。請求以特定值返回聲明。例如,聲明請求:
可用于指定請求適用于主題標識符為248289761001 的最終用戶。"sub": {"value": "248289761001"}
- 值成員 的值必須是所請求的聲明的有效值。各個聲明的定義可以包括 在請求該聲明時如何以及是否使用值限定符的要求。相等比較用于確定請求的 Claim 值是否匹配。
- 當 Claim 值與請求的值不匹配時,該 Claim 不會包含在響應中。如果聲明是sub,則不匹配必須導致身份驗證失敗,如第 3.1.2.2 節 (Authentication Request Validation)中所述。
- 價值觀
- 可選。請求返回帶有一組值之一的聲明,這些值按優先順序出現。其處理方式與值請求相同,只是提供了可接受的聲明值的選擇。
- 例如,聲明請求:
指定必須 使用值 urn:mace:incommon:iap:silver或 urn:mace:incommon:iap:bronze返回acr Claim 。"acr": {"essential": true, "values": ["urn:mace:incommon:iap:silver", "urn:mace:incommon:iap:bronze"]}- Values成員數組 中的值必須是所請求的聲明的有效值。各個聲明的定義可以包括 在請求該聲明時如何以及是否使用值限定符的要求。相等比較用于確定請求的聲明值是否匹配。
- 當 Claim 值與任何請求的值都不匹配時,該 Claim 不會包含在響應中。
- 可以定義其他成員來提供有關所請求的聲明的附加信息。任何不被理解的成員都必須被忽略。
請注意,當支持聲明請求參數時,請求聲明的范圍值(如 第 5.4 節 (Requesting Claims using Scope Values)中定義)是請求單個聲明集的有效速記方法。例如,使用范圍值openid email 和返回訪問令牌的response_type相當于使用范圍值openid 和以下針對單個聲明的請求。
相當于使用電子郵件范圍值:
{
"userinfo":
{
"email": null,
"email_verified": null
}
}
| 目錄 |
如果acr聲明被請求為 ID 令牌的基本聲明,并且具有請求特定身份驗證上下文類參考值的一個或多個值參數,并且實現支持聲明參數,則授權服務器必須返回與 所請求的其中之一匹配的acr聲明值價值觀。授權服務器可以要求最終用戶使用其他因素重新進行身份驗證以滿足此要求。如果這是基本聲明并且無法滿足要求,則授權服務器必須將該結果視為失敗的身份驗證嘗試。
請注意,RP 可以通過使用acr_values請求參數或在單獨的 acr聲明請求中不包含 "essential": true 來請求acr 聲明作為自愿聲明。如果聲明不是必需的并且無法提供請求的值,則授權服務器應該返回會話的當前acr作為acr聲明的值。如果聲明不是必需的,則授權服務器不需要在其響應中提供此聲明。
如果客戶端同時使用acr_values請求參數和針對列出特定請求值的 ID 令牌的 單獨acr Claim 請求來請求acr Claim,則結果行為是未指定的。
| 目錄 |
如第 5.2 節 (Claims Languages and Scripts) 所述,人類可讀的聲明值和引用人類可讀值的聲明值可以用多種語言和腳本表示。在對單個聲明的請求中,可以通過在聲明請求中包含包含#分隔的 BCP47 [RFC5646] 語言標簽的聲明名稱來請求特定聲明的請求語言和腳本,使用 (Phillips, A., Ed. and M. Davis, Ed., “Tags for Identifying Languages,” September 2009.)第 5.2 節 (Claims Languages and Scripts)中指定的聲明名稱語法 。例如,可以使用聲明名稱family_name#ja-Kana-JP請求日語片假名的姓氏, 并且可以使用聲明名稱family_name#ja-Hani-JP 請求日語姓氏的漢字表示 。可以使用聲明名稱website#de來請求德語網站 。
如果 OP 收到對其不具備的語言和腳本的人類可讀聲明的請求,則返回的那些不使用所請求的語言和腳本的聲明的任何版本都應該在聲明名稱中使用語言標簽。
| 目錄 |
本規范定義了聲明值的三種表示形式:
- 普通聲明
- 由 OpenID 提供方直接聲明的聲明。
- 合計聲明
- 由除 OpenID 提供方之外的聲明提供方聲明但由 OpenID 提供方返回的聲明。
- 分布式聲明
- 由除 OpenID 提供方之外的聲明提供方聲明但由 OpenID 提供方作為引用返回的聲明。
普通聲明必須得到支持。對聚合聲明和分布式聲明的支持是可選的。
| 目錄 |
普通聲明表示為 JSON 對象中的成員。聲明名稱是成員名稱,聲明值是成員值。
以下是包含普通聲明的非規范響應:
{
"sub": "248289761001",
"name": "Jane Doe",
"given_name": "Jane",
"family_name": "Doe",
"email": "janedoe@example.com",
"picture": "http://example.com/janedoe/me.jpg"
}
| 目錄 |
聚合和分布式聲明通過使用包含聲明的 JSON 對象的 特殊_claim_names和 _claim_sources成員來表示。
- _claim_names
- JSON 對象,其成員名稱是聚合和分布式聲明的聲明名稱。成員值是對_claim_sources成員中的成員名稱的引用,可以從中檢索實際的聲明值。 OP 可以省略聲明名稱集中引用的聲明提供方提供的一些聲明。
- _claim_來源
- JSON 對象,其成員名稱由_claim_names成員 的成員值引用 。成員值包含聚合聲明集或分布式聲明的參考位置。成員值可以具有以下格式之一,具體取決于它是提供聚合聲明還是分布式聲明:
- 合計聲明
- JSON 對象,必須包含JWT成員,其值為JWT (Jones, M., Bradley, J., and N. Sakimura, “JSON Web Token (JWT),” May 2015.) [JWT],必須包含引用相應_claim_sources成員的_claim_names對象中的所有聲明。其他成員可能會在場。任何不被理解的成員都必須被忽略。
- 智威湯遜
- 必需。包含聲明值的 JWT。
- JWT 不應包含子(主題)聲明,除非其值是聲明提供方處的最終用戶的標識符(而不是 OpenID 提供方或另一方);這通常意味著不應提供 子聲明。
- 分布式聲明
- JSON 對象包含以下成員和值:
- 終點
- 必需。可以從中檢索關聯聲明的 OAuth 2.0 資源端點。端點 URL 必須以 JWT 形式返回聲明。
- 訪問令牌
- 可選。訪問令牌允許使用OAuth 2.0 承載令牌使用 (Jones, M. and D. Hardt, “The OAuth 2.0 Authorization Framework: Bearer Token Usage,” October 2012.)[RFC6750] 協議從端點 URL 檢索聲明。聲明應該使用授權請求頭字段來請求,并且聲明提供方必須支持此方法。如果訪問令牌不可用,RP 可能需要在帶外檢索訪問令牌或使用聲明提供方和 RP 之間預先協商的訪問令牌,或者聲明提供方可以重新驗證最終用戶和/或重新授權RP。
- 由于不返回所請求的聲明不是錯誤條件,因此 RP 必須準備好處理 _claim_sources中列出的某些聲明未從聲明提供方返回的情況。他們應該將其視為與任何其他請求的聲明未返回時相同的處理方式。
- 子(主題)聲明不應從聲明提供方返回,除非其值是聲明提供方處最終用戶的標識符(而不是 OpenID 提供方或另一方);這通常意味著不應提供 子聲明。
iss (頒發者)聲明應該包含在聲明提供方發布的任何 JWT 中,以便可以檢索聲明提供方的密鑰以進行 JWT 的簽名驗證。聲明的值是聲明提供方的頒發者標識符 URL。
一般來說,何時適合使用聚合聲明和分布式聲明由 OP 決定。在某些情況下,有關何時使用哪些聲明類型的信息可能會在 RP 和 OP 之間進行帶外協商。
| 目錄 |
在此非規范示例中,來自聲明提供方 A 的聲明與 OpenID 提供方持有的其他聲明相結合,來自聲明提供方 A 的聲明作為聚合聲明返回。
在此示例中,有關 Jane Doe 的這些聲明是由聲明提供方 A 發布的。(該示例還包括聲明提供方的發布者標識符 URL。)
{
"iss": "https://a.example.com",
"address": {
"street_address": "1234 Hollywood Blvd.",
"locality": "Los Angeles",
"region": "CA",
"postal_code": "90210",
"country": "United States of America"},
"phone_number": "+1 (310) 123-4567"
}
聲明提供方 A 對 JSON 聲明進行簽名,以簽名的 JWT 形式表示它們:jwt_header.jwt_part2.jwt_part3. OpenID 提供方使用的就是這個 JWT。
在此示例中,包含來自聲明提供方 A 的 Jane Doe 聚合聲明的 JWT 與其他普通聲明組合在一起,并作為以下聲明集返回:
{
"sub": "248289761001",
"name": "Jane Doe",
"given_name": "Jane",
"family_name": "Doe",
"birthdate": "0000-03-22",
"eye_color": "blue",
"email": "janedoe@example.com",
"_claim_names": {
"address": "src1",
"phone_number": "src1"
},
"_claim_sources": {
"src1": {"JWT": "jwt_header.jwt_part2.jwt_part3"}
}
}
| 目錄 |
在這個非規范示例中,OpenID 提供方將其持有的普通聲明與兩個不同聲明提供方 B 和 C 持有的聲明的引用相結合,并將 B 和 C 持有的一些聲明的引用合并為分布式聲明。
在此示例中,有關 Jane Doe 的這些聲明由聲明提供方 B(Jane Doe 的銀行)持有。 (該示例還包括聲明提供方的頒發者標識符 URL。)
{
"iss": "https://bank.example.com",
"shipping_address": {
"street_address": "1234 Hollywood Blvd.",
"locality": "Los Angeles",
"region": "CA",
"postal_code": "90210",
"country": "United States of America"},
"payment_info": "Some_Card 1234 5678 9012 3456",
"phone_number": "+1 (310) 123-4567"
}
同樣在此示例中,有關 Jane Doe 的此聲明由聲明提供方 C(信用機構)持有。 (該示例還包括聲明提供方的頒發者標識符 URL。)
{
"iss": "https://creditagency.example.com",
"credit_score": 650
}
OpenID 提供方通過發送可檢索分布式聲明的位置的訪問令牌和 URL,返回 Jane Doe 的聲明以及對來自聲明提供方 B 和聲明提供方 C 的分布式聲明的引用:
{
"sub": "248289761001",
"name": "Jane Doe",
"given_name": "Jane",
"family_name": "Doe",
"email": "janedoe@example.com",
"birthdate": "0000-03-22",
"eye_color": "blue",
"_claim_names": {
"payment_info": "src1",
"shipping_address": "src1",
"credit_score": "src2"
},
"_claim_sources": {
"src1": {"endpoint":
"https://bank.example.com/claim_source"},
"src2": {"endpoint":
"https://creditagency.example.com/claims_here",
"access_token": "ksj3n283dke"}
}
}
請注意,不返回由聲明提供方 B 持有的 phone_number表明并非需要包括所使用的聲明提供方持有的所有聲明。
| 目錄 |
來自 ID 令牌的 sub (主題)和 iss(頒發者)聲明一起使用,是 RP 可以依賴作為最終用戶的穩定標識符的唯一聲明,因為sub 聲明必須是本地唯一的并且永遠不會重新分配頒發者內針對特定最終用戶的信息,如第 2 節 (ID Token)中所述。因此,唯一保證給定最終用戶的唯一標識符是iss Claim 和sub Claim 的組合。
所有其他聲明在不同頒發者之間的長期穩定性或用戶之間的唯一性方面不提供此類保證,并且允許頒發者應用當地限制和政策。例如,頒發者可以 在不同的時間點在不同的最終用戶之間 重復使用電子郵件聲明值,并且給定最終用戶的聲明電子郵件地址可能會隨著時間的推移而改變。因此,其他聲明(例如電子郵件、 電話號碼、 首選用戶名和名稱) 不得用作最終用戶的唯一標識符,無論是從 ID 令牌還是 UserInfo 端點獲取。
| 目錄 |
OpenID Connect 定義以下授權請求參數,以便對身份驗證請求進行簽名并可選擇加密:
- 要求
- 可選。此參數允許將 OpenID Connect 請求傳遞到單個自包含參數中,并可選擇進行簽名和/或加密。參數值是請求對象值,如第6.1 節 (Passing a Request Object by Value)中所述。它將請求表示為 JWT,其聲明是請求參數。
- 請求地址
- 可選。此參數使 OpenID Connect 請求能夠通過引用而不是通過值傳遞。request_uri值是引用包含請求對象值的資源的 URL,該值是包含請求參數的 JWT。該 URL 必須使用https方案,除非目標請求對象以 OP 可驗證的方式進行簽名。
使用這些參數的請求表示為 JWT,分別按值或按引用傳遞。通過引用傳遞請求的能力對于大型請求特別有用。如果使用這些參數之一,則不得在同一請求中使用另一個參數。
| 目錄 |
請求授權請求參數使 OpenID Connect 請求能夠在單個獨立參數中傳遞,并且可以選擇進行簽名和/或加密。它將請求表示為 JWT,其聲明是第 3.1.2 節 (Authorization Endpoint)中指定的請求參數。該 JWT 稱為請求對象。
對請求參數 的支持是可選的。 request_parameter_supported Discovery 結果指示OP是否支持該參數。如果 OP 不支持此參數而 RP 使用它,則 OP 必須返回request_not_supported 錯誤。
使用請求參數 時,JWT 中包含的 OpenID Connect 請求參數值將取代使用 OAuth 2.0 請求語法傳遞的參數值。但是,即使使用請求對象,也可以使用 OAuth 2.0 請求語法傳遞參數;這通常是為了啟用包含固定請求參數的緩存的、預簽名(并且可能預加密)的請求對象值,而可能隨每個請求而變化的參數(例如狀態和 隨機數)被傳遞為OAuth 2.0 參數。
因此,該請求是有效的 OAuth 2.0 授權請求,必須使用 OAuth 2.0 請求語法包含response_type和 client_id參數的值,因為 OAuth 2.0 需要它們。這些參數的值必須與請求對象中的值(如果存在)匹配。
即使請求對象值中存在范圍參數,也必須始終使用包含openid范圍值的 OAuth 2.0 請求語法來傳遞 范圍參數,以向底層 OAuth 2.0 邏輯表明這是一個 OpenID Connect 請求。
請求對象可以是簽名的或未簽名的(不安全的)。當它不安全時,這通過 在 JOSE 標頭中使用 無算法[JWA] (Jones, M., “JSON Web Algorithms (JWA),” May 2015.)來指示。如果簽名,請求對象應該包含聲明 iss(頒發者)和aud(受眾)作為成員。 iss值應該是 RP 的客戶端 ID,除非它是由與 RP 不同的一方簽名的。aud值應該是或包含 OP 的頒發者標識符 URL。
請求對象也可以使用JWE (Jones, M. and J. Hildebrand, “JSON Web Encryption (JWE),” May 2015.) [JWE] 進行加密,并且可以在不進行簽名的情況下進行加密。如果同時執行簽名和加密,則必須對其進行簽名然后加密,結果是嵌套 JWT,如[JWT] (Jones, M., Bradley, J., and N. Sakimura, “JSON Web Token (JWT),” May 2015.)中所定義。
request和 request_uri參數不得包含在請求對象中。
以下是在進行 base64url 編碼和簽名之前請求對象中的聲明的非規范示例:
{
"iss": "s6BhdRkqt3",
"aud": "https://server.example.com",
"response_type": "code id_token",
"client_id": "s6BhdRkqt3",
"redirect_uri": "https://client.example.org/cb",
"scope": "openid",
"state": "af0ifjsldkj",
"nonce": "n-0S6_WzA2Mj",
"max_age": 86400,
"claims":
{
"userinfo":
{
"given_name": {"essential": true},
"nickname": null,
"email": {"essential": true},
"email_verified": {"essential": true},
"picture": null
},
"id_token":
{
"gender": null,
"birthdate": {"essential": true},
"acr": {"values": ["urn:mace:incommon:iap:silver"]}
}
}
}
使用RS256算法 對其進行簽名會產生此請求對象值(值內換行僅用于顯示目的):
eyJhbGciOiJSUzI1NiIsImtpZCI6ImsyYmRjIn0.ew0KICJpc3MiOiAiczZCaGRSa3 F0MyIsDQogImF1ZCI6ICJodHRwczovL3NlcnZlci5leGFtcGxlLmNvbSIsDQogInJl c3BvbnNlX3R5cGUIOiAiY29kZSBpZF90b2tlbiIsDQogImNsaWVudF9pZCI6ICJzNk JoZFJrcXQzIiwNCiAicmVkaXJlY3RfdXJpIjogImh0dHBzOi8vY2xpZW50LmV4YW1w bGUub3JnL2NiIiwNCiAic2NvcGUIOiAib3BlbmlkIiwNCiAic3RhdGUIOiAiYWYwaW Zqc2xka2oiLA0KICJub25jZSI6ICJuLTBTNl9XekEyTWoiLA0KICJtYXhfYWdlIjog ODY0MDAsDQogImNSYWltcyI6IA0KICB7DQogICAidXNlcmluZm8iOiANCiAgICB7DQ ogICAgICJnaXZlbl9uYW1lIjogeyJlc3NlbnRpYWwiOiB0cnVlfSwNCiagICAgIm5p Y2tuYW1lIjogbnVsbCwNCiAgICAgImVtYWlsIjogeyJlc3NlbnRpYWwiOiB0cnVlfS WNCiAgICAgImVtYWlsX3ZlcmlmaWVkIjogeyJlc3NlbnRpYWwiOiB0cnVlfSwNCiAg ICAgInBpY3R1cmUiOiBudWxsDQogICAgfSwNCiagICJpZF90b2tlbiI6IA0KICAgIH SNCIAGICAgImdlbmRlciI6IG51bGwsDQogICAgICJiaXJ0aGRhdGUIOiB7ImVzc2Vu dGlhbCI6IHRydWV9LA0KICAgICAiYWNyIjogeyJ2YWx1ZXMiOiBbInVybjptYWNlOM LUY29tbW9uOmlhcDpzaWx2ZXIiXX0NCiAgICB9DQogIH0NCn0.nwwnNsk1-Zkbmnvs F6zTHm8CHERFMGQPhos-EJcaH4Hh-sMgk8ePrGhw_trPYs8KQxsn6R9Emo_wHwajyF KzuMXZFSZ3p6Mb8dkxtVyjoy2GIzvuJT_u7PkY2t8QU9hjBchs68PkgjDVTrG1uRTx 0GxFbuPbj96tVuj11pTnmFCUR6IEOXKYr7iGOCRB3btfJhM0_AKQUfqKnRlrRscc8K ol-cSLWoYE9l5QqholImzjT_cmMnNIznW9E7CDyWXTsO70xnB4SkG6pXfLSjLLlxmpG iyon_-Te111V8uE83IlzCYIb_NMXvtTIVc1jpspnTSD7xMbpL-2QgwUsAlMGzw
以下以 JWK 格式表示的 RSA 公鑰可用于驗證此請求對象示例和后續請求對象示例中的請求對象簽名(值內換行僅用于顯示目的):
{
"kty":"RSA",
"kid":"k2bdc",
"n":"y9Lqv4fCp6Ei-u2-ZCKq83YvbFEk6JMs_pSj76eMkddWRuWX2aBKGHAtKlE5P
7_vn__PCKZWePt3vGkB6ePgzAFu08NmKemwE5bQI0e6kIChtt_6KzT5OaaXDF
I6qCLJmk51Cc4VYFaxgqevMncYrzaW_50mZ1yGSFIQzLYP8bijAHGVjdEFgZa
ZEN9lsn_GdWLaJpHrB3ROlS50E45wxrlg9xMncVb8qDPuXZarvghLL0HzOuYR
adBJVoWZowDNTpKpk2RklZ7QaBO7XDv3uR7s_sf2g-bAjSYxYUGsqkNA9b3xV
W53am_UZZ3tZbFTIh557JICWKHlWj5uzeJXaw",
"e":"AQAB"
}
| 目錄 |
客戶端向授權端點發送授權請求。
以下是使用請求參數的授權請求的非規范示例( 值內換行僅用于顯示目的):
https://server.example.com/authorize?
response_type=code%20id_token
&client_id=s6BhdRkqt3
&redirect_uri=https%3A%2F%2Fclient.example.org%2Fcb
&scope=openid
&state=af0ifjsldkj
&nonce=n-0S6_WzA2Mj
&request=eyJhbGciOiJSUzI1NiIsImtpZCI6ImsyYmRjIn0.ew0KICJpc3MiOiA
iczZCaGRSa3F0MyIsDQogImF1ZCI6ICJodHRwczovL3NlcnZlci5leGFtcGxlLmN
vbSIsDQogInJlc3BvbnNlX3R5cGUiOiAiY29kZSBpZF90b2tlbiIsDQogImNsaWV
udF9pZCI6ICJzNkJoZFJrcXQzIiwNCiAicmVkaXJlY3RfdXJpIjogImh0dHBzOi8
vY2xpZW50LmV4YW1wbGUub3JnL2NiIiwNCiAic2NvcGUiOiAib3BlbmlkIiwNCiA
ic3RhdGUiOiAiYWYwaWZqc2xka2oiLA0KICJub25jZSI6ICJuLTBTNl9XekEyTWo
iLA0KICJtYXhfYWdlIjogODY0MDAsDQogImNsYWltcyI6IA0KICB7DQogICAidXN
lcmluZm8iOiANCiAgICB7DQogICAgICJnaXZlbl9uYW1lIjogeyJlc3NlbnRpYWw
iOiB0cnVlfSwNCiAgICAgIm5pY2tuYW1lIjogbnVsbCwNCiAgICAgImVtYWlsIjo
geyJlc3NlbnRpYWwiOiB0cnVlfSwNCiAgICAgImVtYWlsX3ZlcmlmaWVkIjogeyJ
lc3NlbnRpYWwiOiB0cnVlfSwNCiAgICAgInBpY3R1cmUiOiBudWxsDQogICAgfSw
NCiAgICJpZF90b2tlbiI6IA0KICAgIHsNCiAgICAgImdlbmRlciI6IG51bGwsDQo
gICAgICJiaXJ0aGRhdGUiOiB7ImVzc2VudGlhbCI6IHRydWV9LA0KICAgICAiYWN
yIjogeyJ2YWx1ZXMiOiBbInVybjptYWNlOmluY29tbW9uOmlhcDpzaWx2ZXIiXX0
NCiAgICB9DQogIH0NCn0.nwwnNsk1-ZkbmnvsF6zTHm8CHERFMGQPhos-EJcaH4H
h-sMgk8ePrGhw_trPYs8KQxsn6R9Emo_wHwajyFKzuMXZFSZ3p6Mb8dkxtVyjoy2
GIzvuJT_u7PkY2t8QU9hjBcHs68PkgjDVTrG1uRTx0GxFbuPbj96tVuj11pTnmFC
UR6IEOXKYr7iGOCRB3btfJhM0_AKQUfqKnRlrRscc8Kol-cSLWoYE9l5QqholImz
jT_cMnNIznW9E7CDyWXTsO70xnB4SkG6pXfLSjLLlxmPGiyon_-Te111V8uE83Il
zCYIb_NMXvtTIVc1jpspnTSD7xMbpL-2QgwUsAlMGzw
| 目錄 |
request_uri授權請求 參數允許 OpenID Connect 請求通過引用而不是通過值傳遞。此參數的使用方式與 請求參數相同,不同之處在于請求對象值是從指定 URL 的資源中檢索的,而不是按值傳遞的。
request_uri_parameter_supported Discovery 結果指示OP是否支持該參數。如果 OP 不支持此參數而 RP 使用它,則 OP 必須返回request_uri_not_supported 錯誤。
使用request_uri參數 時,引用的 JWT 中包含的 OpenID Connect 請求參數值將取代使用 OAuth 2.0 請求語法傳遞的參數值。但是,即使使用request_uri,參數也可以使用 OAuth 2.0 請求語法傳遞;這通常是為了啟用包含固定請求參數的緩存的、預簽名(并且可能預加密)的請求對象值,而可能隨每個請求而變化的參數(例如狀態和 隨機數)被傳遞為OAuth 2.0 參數。
因此,該請求是有效的 OAuth 2.0 授權請求,必須使用 OAuth 2.0 請求語法包含response_type和 client_id參數的值,因為 OAuth 2.0 需要它們。這些參數的值必須與請求對象中的值(如果存在)匹配。
即使引用的請求對象中存在范圍參數,也必須始終使用包含openid范圍值的 OAuth 2.0 請求語法來傳遞 范圍參數,以向底層 OAuth 2.0 邏輯指示這是一個 OpenID Connect 請求。
服務器可以緩存請求 URI 引用的資源的內容。如果引用資源的內容可能會更改,則 URI 應包含引用資源內容的 base64url 編碼的 SHA-256 哈希值作為 URI 的片段組件。如果用于 URI 的片段值發生更改,則會向服務器發出信號,表明該 URI 的任何具有舊片段值的緩存值都不再有效。
請注意,客戶端可以使用OpenID Connect 動態客戶端注冊 1.0 [OpenID.Registration] 規范第 2.1 節中定義的 request_uris參數來 預先注冊 request_uri值 。 OP 可以要求使用require_request_uri_registration發現參數預先注冊所使用的request_uri值 。 (Sakimura, N., Bradley, J., and M. Jones, “OpenID Connect Dynamic Client Registration 1.0,” December 2023.)
整個請求 URI 不應超過 512 個 ASCII 字符。
URL 引用的資源內容必須是請求對象。request_uri值中使用的方案 必須是https,除非目標請求對象以授權服務器可驗證的方式進行簽名。 request_uri值必須可以被授權服務器訪問,并且應該可以被客戶端訪問 。
以下是可由request_uri引用的請求對象資源內容的非規范示例 (值內換行僅用于顯示目的):
eyJhbGciOiJSUzI1NiIsImtpZCI6ImsyYmRjIn0.ew0KICJpc3MiOiAiczZCaGRSa3 F0MyIsDQogImF1ZCI6ICJodHRwczovL3NlcnZlci5leGFtcGxlLmNvbSIsDQogInJl c3BvbnNlX3R5cGUIOiAiY29kZSBpZF90b2tlbiIsDQogImNsaWVudF9pZCI6ICJzNk JoZFJrcXQzIiwNCiAicmVkaXJlY3RfdXJpIjogImh0dHBzOi8vY2xpZW50LmV4YW1w bGUub3JnL2NiIiwNCiAic2NvcGUIOiAib3BlbmlkIiwNCiAic3RhdGUIOiAiYWYwaW Zqc2xka2oiLA0KICJub25jZSI6ICJuLTBTNl9XekEyTWoiLA0KICJtYXhfYWdlIjog ODY0MDAsDQogImNSYWltcyI6IA0KICB7DQogICAidXNlcmluZm8iOiANCiAgICB7DQ ogICAgICJnaXZlbl9uYW1lIjogeyJlc3NlbnRpYWwiOiB0cnVlfSwNCiagICAgIm5p Y2tuYW1lIjogbnVsbCwNCiAgICAgImVtYWlsIjogeyJlc3NlbnRpYWwiOiB0cnVlfS WNCiAgICAgImVtYWlsX3ZlcmlmaWVkIjogeyJlc3NlbnRpYWwiOiB0cnVlfSwNCiAg ICAgInBpY3R1cmUiOiBudWxsDQogICAgfSwNCiagICJpZF90b2tlbiI6IA0KICAgIH SNCIAGICAgImdlbmRlciI6IG51bGwsDQogICAgICJiaXJ0aGRhdGUIOiB7ImVzc2Vu dGlhbCI6IHRydWV9LA0KICAgICAiYWNyIjogeyJ2YWx1ZXMiOiBbInVybjptYWNlOM LUY29tbW9uOmlhcDpzaWx2ZXIiXX0NCiAgICB9DQogIH0NCn0.nwwnNsk1-Zkbmnvs F6zTHm8CHERFMGQPhos-EJcaH4Hh-sMgk8ePrGhw_trPYs8KQxsn6R9Emo_wHwajyF KzuMXZFSZ3p6Mb8dkxtVyjoy2GIzvuJT_u7PkY2t8QU9hjBchs68PkgjDVTrG1uRTx 0GxFbuPbj96tVuj11pTnmFCUR6IEOXKYr7iGOCRB3btfJhM0_AKQUfqKnRlrRscc8K ol-cSLWoYE9l5QqholImzjT_cmMnNIznW9E7CDyWXTsO70xnB4SkG6pXfLSjLLlxmpG iyon_-Te111V8uE83IlzCYIb_NMXvtTIVc1jpspnTSD7xMbpL-2QgwUsAlMGzw
| 目錄 |
客戶端將請求對象資源存儲在本地或遠程到服務器可以訪問的 URL 處。此 URL 是請求 URI request_uri。
如果請求對象包含聲明請求的值,則不得將其透露給授權服務器以外的任何人。因此,request_uri在其生命周期內必須具有適當的熵。如果知道不會再次使用或在合理的超時后除非采取訪問控制措施,建議將其刪除。
以下是請求 URI 值的非規范示例(值內換行僅用于顯示目的):
https://client.example.org/request.jwt#
GkurKxf5T0Y-mnPFCHqWOMiZi4VS138cQO_V7PZHAdM
| 目錄 |
客戶端向授權端點發送授權請求。
以下是使用request_uri參數的授權請求的非規范示例(值內換行僅用于顯示目的):
https://server.example.com/authorize?
response_type=code%20id_token
&client_id=s6BhdRkqt3
&request_uri=https%3A%2F%2Fclient.example.org%2Frequest.jwt
%23GkurKxf5T0Y-mnPFCHqWOMiZi4VS138cQO_V7PZHAdM
&state=af0ifjsldkj&nonce=n-0S6_WzA2Mj
&scope=openid
| 目錄 |
收到請求后,授權服務器必須向request_uri發送 HTTP GET請求 以檢索引用的請求對象(除非它已被緩存),并解析它以重新創建授權請求參數。
請注意,RP 應使用不同參數為每個請求使用唯一的 URI,否則會阻止授權服務器緩存request_uri。
以下是此獲取過程的非規范示例:
GET /request.jwt HTTP/1.1 Host: client.example.org
| 目錄 |
選擇使用 request_uri參數的原因有多種:
| 目錄 |
當使用request或 request_uri授權請求參數時,除了第 3.1.2.2 (Authentication Request Validation)、 3.2.2.2 (Authentication Request Validation)或 3.3.2.2 (Authentication Request Validation)節中指定的步驟之外,還必須執行其他步驟來驗證身份驗證請求。這些步驟是驗證包含請求對象的 JWT 并驗證請求對象本身。
| 目錄 |
如果授權服務器在其發現文檔[OpenID.Discovery]的request_object_encryption_alg_values_supported和 request_object_encryption_enc_values_supported元素中公布了 JWE 加密算法,或者通過其他方式提供了加密算法,則客戶端將使用這些算法來加密 JWT。 (Sakimura, N., Bradley, J., Jones, M., and E. Jay, “OpenID Connect Discovery 1.0,” December 2023.)
授權服務器必須根據JSON Web 加密 (Jones, M. and J. Hildebrand, “JSON Web Encryption (JWE),” May 2015.)[JWE] 規范對 JWT 進行解密。結果可以是簽名或未簽名(不安全)的請求對象。在前一種情況下,必須按照第 6.3.2 節 (Signed Request Object)中的定義執行簽名驗證。
如果解密失敗,授權服務器必須返回錯誤。
| 目錄 |
要執行簽名驗證, JOSE 標頭中的alg標頭參數必須與客戶端注冊[OpenID.Registration]期間設置的request_object_signing_alg的值或通過其他方式預先注冊的值匹配。必須根據該client_id 和算法 的適當密鑰來驗證簽名。 (Sakimura, N., Bradley, J., and M. Jones, “OpenID Connect Dynamic Client Registration 1.0,” December 2023.)
如果簽名驗證失敗,授權服務器必須返回錯誤。
| 目錄 |
授權服務器必須從請求對象值和 OAuth 2.0 授權請求參數(減去request或 request_uri參數) 中組裝要使用的授權請求參數集。如果請求對象和OAuth授權請求參數中存在相同的參數,則使用請求對象中的參數。使用授權請求參數的組裝集,授權服務器然后以正在使用的流的正常方式驗證請求,如第3.1.2.2 (Authentication Request Validation)、 3.2.2.2 (Authentication Request Validation)或 3.3.2.2 (Authentication Request Validation)節中指定的。
| 目錄 |
OpenID Connect 支持自簽發 OpenID 提供方 - 頒發自簽發 ID 令牌的個人、自托管 OP。自簽發 OP 使用特殊的頒發者標識符 https://self-issued.me。
用于與自簽發 OP 通信的消息大部分與用于與其他 OP 通信的消息相同。本節定義了所使用的少數附加參數以及自簽發場景下某些參數值的規范。
| 目錄 |
如果發現過程的輸入標識符包含域 self-issued.me,則不執行動態發現。相反,使用以下靜態配置值:
{
"authorization_endpoint":
"openid:",
"issuer":
"https://self-issued.me",
"scopes_supported":
["openid", "profile", "email", "address", "phone"],
"response_types_supported":
["id_token"],
"subject_types_supported":
["pairwise"],
"id_token_signing_alg_values_supported":
["RS256"],
"request_object_signing_alg_values_supported":
["none", "RS256"]
}
注意:OpenID 基金會計劃托管 OpenID Provider 站點 https://self-issued.me/,包括其 WebFinger 服務,以便對其執行發現返回上述靜態發現信息,使 RP 不需要任何特殊處理發現自行發行的 OP。該網站將在實驗的基礎上進行托管。如果 OpenID 基金會隨后承諾以用于生產用途的方式托管該站點,則生產實施不應依賴它。
| 目錄 |
使用自行發行的 OP 時,無需注冊。客戶端無需注冊即可繼續操作,就像已在 OP 中注冊并獲得以下客戶端注冊響應一樣:
- 客戶ID
- 客戶端的 redirect_uri值。
- 客戶端秘密過期時間
- 0
注意:OpenID 基金會計劃托管(無狀態)端點 https://self-issued.me/registration/1.0/ ,該端點返回上述響應,使 RP 不需要任何特殊處理即可向自簽發 OP 進行注冊。該網站將在實驗的基礎上進行托管。如果 OpenID 基金會隨后承諾以用于生產用途的方式托管該站點,則生產實施不應依賴它。
| 目錄 |
OpenID Connect 定義了以下授權請求參數,以使客戶端能夠向自行頒發的 OpenID 提供方提供附加注冊信息:
- 登記
- 可選。客戶端使用此參數向自簽發 OP 提供有關其自身的信息,這些信息通常在動態客戶端注冊期間提供給 OP。該值是一個包含客戶端元數據值的 JSON 對象,如 OpenID Connect 動態客戶端注冊 1.0 (Sakimura, N., Bradley, J., and M. Jones, “OpenID Connect Dynamic Client Registration 1.0,” December 2023.) [OpenID.Registration] 規范的第 2.1 節中所定義。當 OP 不是自簽發 OP 時,不應使用 注冊參數。
自簽發 OP 不需要這些信息,因此該參數的使用是可選的。
注冊 參數值在 OAuth 2.0 請求中表示為 UTF-8 編碼的 JSON 對象(當作為 OAuth 參數傳遞時,最終會進行表單 urlencoded)。當在請求對象值中使用時,根據第 6.1 節 (Passing a Request Object by Value),JSON 對象用作 注冊成員的值。
通常在對自簽發 OP 的請求中使用的注冊參數是 policy_uri、 tos_uri和 logo_uri。如果客戶端使用多個重定向URI, 則將使用redirect_uris 參數來注冊它們。最后,如果客戶端請求加密響應,它通常會使用 jwks_uri、 id_token_encrypted_response_alg和 id_token_encrypted_response_enc參數。
| 目錄 |
自簽發 OP 的授權端點是 URI openid:。
客戶端將身份驗證請求發送到授權端點,其中包含以下參數:
- 范圍
- 必需。 范圍參數值,如第 3.1.2 節 (Authorization Endpoint)中指定。
- 響應類型
- 必需。常量字符串值id_token。
- 客戶ID
- 必需。客戶端的客戶端ID值,在本例中包含 客戶端的redirect_uri值。由于客戶端的 redirect_uri URI 值作為客戶端ID 進行通信,因此redirect_uri參數不需要也包含在請求中。
- id_token_hint
- 可選。 id_token_hint參數值,如第 3.1.2 節 (Authorization Endpoint)中指定。不支持將內容加密到自簽發 OP。
- 聲明
- 可選。 聲明參數值,如第 5.5 節 (Requesting Claims using the "claims" Request Parameter)中指定。
- 登記
- 可選。客戶端使用此參數向自簽發 OP 提供有關其自身的信息,這些信息通常在動態客戶端注冊期間提供給 OP,如第7.2.1 節 (Providing Information with the "registration" Request Parameter)中所指定。
- 要求
- 可選。請求對象值,如第 6.1 節 (Passing a Request Object by Value)中指定。不支持將內容加密到自簽發 OP。
可以發送其他參數。請注意,所有聲明都在 ID 令牌中返回。
整個 URL 不得超過 2048 個 ASCII 字符。
以下是客戶端的非規范示例 HTTP 302 重定向響應,它觸發用戶代理向自簽發 OpenID 提供方發出身份驗證請求(值內換行僅用于顯示目的):
HTTP/1.1 302 Found
Location: openid://?
response_type=id_token
&client_id=https%3A%2F%2Fclient.example.org%2Fcb
&scope=openid%20profile
&state=af0ifjsldkj
&nonce=n-0S6_WzA2Mj
®istration=%7B%22logo_uri%22%3A%22https%3A%2F%2F
client.example.org%2Flogo.png%22%7D
| 目錄 |
OpenID Connect 定義了以下聲明以在自簽發 OpenID 提供方響應中使用:
- 子_jwk
- 必需。用于檢查自行頒發的 OpenID 提供方頒發的 ID 令牌簽名的公鑰,如第 7 節 (Self-Issued OpenID Provider)中所指定。該密鑰是 JWK [JWK] (Jones, M., “JSON Web Key (JWK),” May 2015.)格式的裸密鑰(不是 X.509 證書值)。sub_jwk值是一個 JSON 對象。當 OP 不是自行頒發時,不建議 使用sub_jwk聲明。
自簽發 OpenID 提供方響應與正常隱式流響應相同,但有以下改進。由于它是隱式流響應,因此響應參數將在 URL 片段組件中返回,除非指定了不同的響應模式。
| 目錄 |
要驗證收到的 ID 令牌,客戶端必須執行以下操作:
以下是經過 base64url 解碼的自簽發 ID 令牌的非規范示例(值內換行僅用于顯示目的):
{
"iss": "https://self-issued.me",
"sub": "NzbLsXh8uDCcd-6MNwXF4W_7noWXFZAfHkxZsRGC9Xs",
"aud": "https://client.example.org/cb",
"nonce": "n-0S6_WzA2Mj",
"exp": 1311281970,
"iat": 1311280970,
"sub_jwk": {
"kty":"RSA",
"n": "0vx7agoebGcQSuuPiLJXZptN9nndrQmbXEps2aiAFbWhM78LhWx
4cbbfAAtVT86zwu1RK7aPFFxuhDR1L6tSoc_BJECPebWKRXjBZCiFV4n3oknjhMs
tn64tZ_2W-5JsGY4Hc5n9yBXArwl93lqt7_RN5w6Cf0h4QyQ5v-65YGjQR0_FDW2
QvzqY368QQMicAtaSqzs8KJZgnYb9c7d0zgdAZHzu6qMQvRL5hajrn1n91CbOpbI
SD08qNLyrdkt-bFTWhAI4vMQFh6WeZu0fM4lFd2NcRwr3XPksINHaQ-G_xBniIqb
w0Ls1jF44-csFCur-kEgU8awapJzKnqDKgw",
"e":"AQAB"
}
}
| 目錄 |
主體標識符是最終用戶在頒發者中本地唯一且永不重新分配的標識符,旨在由客戶端使用。本規范定義了兩種主題標識符類型:
- 民眾
- 這為所有客戶提供了相同的子(主題)價值。如果提供方 在其發現文檔中 沒有subject_types_supported元素,則這是默認值。
- 成對的
- 這為每個客戶提供了不同的子 值,以免客戶在未經許可的情況下關聯最終用戶的活動。
OpenID 提供方的發現文檔必須在 subject_types_supported元素中列出其支持的主題標識符類型。如果數組中列出了不止一種類型,客戶端可以選擇 在注冊期間 使用subject_type參數提供其首選標識符類型。
| 目錄 |
當使用成對主題標識符時,OpenID 提供方必須 為每個扇區標識符計算唯一的子(主題)值。主體標識符值不得被 OpenID 提供方以外的任何一方逆轉。
使用成對子值并支持 動態客戶端注冊 (Sakimura, N., Bradley, J., and M. Jones, “OpenID Connect Dynamic Client Registration 1.0,” December 2023.)[OpenID.Registration]的提供方應該使用sector_identifier_uri參數。它為共同管理控制下的一組網站提供了一種方法,使其具有 獨立于各個域名的一致的成對子值。它還為客戶端提供了一種更改 redirect_uri域的方法,而無需重新注冊所有用戶。
如果客戶端沒有 在動態客戶端注冊[OpenID.Registration]中 為sector_identifier_uri提供值,則用于成對標識符計算的扇區標識符是注冊的redirect_uri的主機組件。如果注冊的redirect_uris中有多個主機名 ,客戶端必須注冊一個 sector_identifier_uri。 (Sakimura, N., Bradley, J., and M. Jones, “OpenID Connect Dynamic Client Registration 1.0,” December 2023.)
當提供sector_identifier_uri時 ,該URL的主機部分將用作成對標識符計算的扇區標識符。ector_identifier_uri的值必須是使用https方案的 URL ,該 URL 指向包含redirect_uri值數組的 JSON 文件 。注冊的redirect_uris的值 必須包含在數組的元素中。
OpenID 提供方可以使用具有以下屬性的任何算法來計算成對主題標識符:
三個示例方法是:
| 目錄 |
本節定義了一組客戶端身份驗證方法,客戶端使用這些方法在使用令牌端點時向授權服務器進行身份驗證。在客戶端注冊期間,RP(客戶端)可以注冊客戶端身份驗證方法。如果沒有注冊方法,則默認方法是client_secret_basic。
這些客戶端身份驗證方法是:
- 客戶端秘密基本
- 從授權服務器收到client_secret值的客戶端根據OAuth 2.0 (Hardt, D., Ed., “The OAuth 2.0 Authorization Framework,” October 2012.) [RFC6749] 的第 2.3.1 節,使用 HTTP 基本身份驗證方案向授權服務器進行身份驗證。
- 客戶端秘密帖子
- 從授權服務器收到client_secret值的客戶端,根據OAuth 2.0 (Hardt, D., Ed., “The OAuth 2.0 Authorization Framework,” October 2012.) [RFC6749] 第 2.3.1 節,通過在請求正文中包含客戶端憑證來向授權服務器進行身份驗證。
- 客戶端秘密jwt
- 從授權服務器收到client_secret值的客戶端使用 HMAC SHA 算法(例如 HMAC SHA-256)創建 JWT。 HMAC(基于哈希的消息身份驗證代碼)是使用client_secret的 UTF-8 表示形式的八位字節作為共享密鑰來計算的。
- 客戶端根據 OAuth 2.0 客戶端身份驗證和授權許可的 JSON Web 令牌 (JWT) 配置文件 (Jones, M., Campbell, B., and C. Mortimore, “JSON Web Token (JWT) Profile for OAuth 2.0 Client Authentication and Authorization Grants,” May 2015.)[OAuth.JWT] 以及 OAuth 2.0 客戶端身份驗證和授權許可的斷言框架 (Campbell, B., Mortimore, C., Jones, M., and Y. Goland, “Assertion Framework for OAuth 2.0 Client Authentication and Authorization Grants,” May 2015.)[OAuth.Assertions] 進行身份驗證。 JWT 必須包含以下必需的聲明值,并且可以包含以下可選的聲明值:
- 國際空間站
- 必需。頒發者。這必須包含OAuth 客戶端的 client_id 。
- 子
- 必需。主題。這必須包含OAuth 客戶端的 client_id 。
- 音頻
- 必需。觀眾。 aud (觀眾)聲明。將授權服務器標識為目標受眾的值。授權服務器必須驗證它是否是令牌的預期受眾。受眾應該是授權服務器令牌端點的 URL。
- 吉蒂
- 必需。智威湯遜 ID。令牌的唯一標識符,可用于防止令牌重復使用。這些代幣只能使用一次,除非雙方協商了重復使用的條件;任何此類協商均超出了本規范的范圍。
- 經驗值
- 必需。到期時間或之后不得接受 JWT 進行處理。
- 我在
- 可選。 JWT 的發布時間。
- JWT 可能包含其他聲明。任何不被理解的聲明都必須被忽略。
- 身份驗證令牌必須作為[OAuth.Assertions] (Campbell, B., Mortimore, C., Jones, M., and Y. Goland, “Assertion Framework for OAuth 2.0 Client Authentication and Authorization Grants,” May 2015.) client_assertion參數的值發送 。
- 根據[OAuth.JWT],[OAuth.Assertions] (Campbell, B., Mortimore, C., Jones, M., and Y. Goland, “Assertion Framework for OAuth 2.0 Client Authentication and Authorization Grants,” May 2015.) client_assertion_type參數的值 必須為“urn:ietf:params:oauth:client-assertion-type:jwt-bearer” 。 (Jones, M., Campbell, B., and C. Mortimore, “JSON Web Token (JWT) Profile for OAuth 2.0 Client Authentication and Authorization Grants,” May 2015.)
- 私鑰_jwt
- 已注冊公鑰的客戶端使用該密鑰簽署 JWT。客戶端根據 OAuth 2.0 客戶端身份驗證和授權許可的 JSON Web 令牌 (JWT) 配置文件 (Jones, M., Campbell, B., and C. Mortimore, “JSON Web Token (JWT) Profile for OAuth 2.0 Client Authentication and Authorization Grants,” May 2015.)[OAuth.JWT] 以及 OAuth 2.0 客戶端身份驗證和授權許可的斷言框架 (Campbell, B., Mortimore, C., Jones, M., and Y. Goland, “Assertion Framework for OAuth 2.0 Client Authentication and Authorization Grants,” May 2015.)[OAuth.Assertions] 進行身份驗證。 JWT 必須包含以下必需的聲明值,并且可以包含以下可選的聲明值:
- 國際空間站
- 必需。頒發者。這必須包含OAuth 客戶端的 client_id 。
- 子
- 必需。主題。這必須包含OAuth 客戶端的 client_id 。
- 音頻
- 必需。觀眾。 aud (觀眾)聲明。將授權服務器標識為目標受眾的值。授權服務器必須驗證它是否是令牌的預期受眾。受眾應該是授權服務器令牌端點的 URL。
- 吉蒂
- 必需。智威湯遜 ID。令牌的唯一標識符,可用于防止令牌重復使用。這些代幣只能使用一次,除非雙方協商了重復使用的條件;任何此類協商均超出了本規范的范圍。
- 經驗值
- 必需。到期時間或之后不得接受 JWT 進行處理。
- 我在
- 可選。 JWT 的發布時間。
- JWT 可能包含其他聲明。任何不被理解的聲明都必須被忽略。
- 身份驗證令牌必須作為[OAuth.Assertions] (Campbell, B., Mortimore, C., Jones, M., and Y. Goland, “Assertion Framework for OAuth 2.0 Client Authentication and Authorization Grants,” May 2015.) client_assertion參數的值發送 。
- 根據[OAuth.JWT],[OAuth.Assertions] (Campbell, B., Mortimore, C., Jones, M., and Y. Goland, “Assertion Framework for OAuth 2.0 Client Authentication and Authorization Grants,” May 2015.) client_assertion_type參數的值 必須為“urn:ietf:params:oauth:client-assertion-type:jwt-bearer” 。 (Jones, M., Campbell, B., and C. Mortimore, “JSON Web Token (JWT) Profile for OAuth 2.0 Client Authentication and Authorization Grants,” May 2015.)
例如(值內換行僅用于顯示目的):
POST /token HTTP/1.1 Host: server.example.com Content-Type: application/x-www-form-urlencoded grant_type=authorization_code& code=i1WsRn1uB1& client_id=s6BhdRkqt3& client_assertion_type= urn%3Aietf%3Aparams%3Aoauth%3Aclient-assertion-type%3Ajwt-bearer& client_assertion=PHNhbWxwOl ... ZT- 沒有任何
- 客戶端不在令牌端點處對自身進行身份驗證,因為它僅使用隱式流(因此不使用令牌端點),或者因為它是沒有客戶端密鑰或其他身份驗證機制的公共客戶端。
| 目錄 |
根據發送消息所采用的傳輸方式,可能無法保證消息的完整性,并且可能無法驗證消息的發起者。為了減輕這些風險,ID 令牌、UserInfo 響應、請求對象和客戶端身份驗證 JWT 值可以利用 JSON Web 簽名 (JWS) (Jones, M., Bradley, J., and N. Sakimura, “JSON Web Signature (JWS),” May 2015.) [JWS] 對其內容進行簽名。為了實現消息機密性,這些值還可以使用 JSON Web Encryption (JWE) (Jones, M. and J. Hildebrand, “JSON Web Encryption (JWE),” May 2015.) [JWE] 來加密其內容。
當消息同時經過簽名和加密時,必須根據第 16.14 節 (Signing and Encryption Order)先對其進行簽名,然后進行加密,結果是嵌套 JWT,如[JWT] (Jones, M., Bradley, J., and N. Sakimura, “JSON Web Token (JWT),” May 2015.)中指定的。請注意,所有 JWE 加密方法都會執行完整性檢查。
OP 在其 Discovery 文檔中宣傳其支持的簽名和加密算法,或者可以通過其他方式提供此信息。 RP 在其動態注冊請求中聲明其所需的簽名和加密算法,或者可以通過其他方式傳達此信息。
OP 通過其 Discovery 文檔公布其公鑰,或者可以通過其他方式提供此信息。 RP 通過其動態注冊請求聲明其公鑰,或者可以通過其他方式傳達此信息。
| 目錄 |
簽名方必須根據接收方支持的算法選擇簽名算法。
- 不對稱簽名
- 當使用 RSA 或 ECDSA 簽名時, JOSE 標頭的alg標頭參數值必須設置為JSON Web 算法 (Jones, M., “JSON Web Algorithms (JWA),” May 2015.)[JWA] 中定義的適當算法。用于對內容進行簽名的私鑰必須與發送者在其 JWK Set 文檔中發布的用于簽名驗證的公鑰相關聯。如果引用的 JWK Set 文檔中有多個鍵,則 必須在 JOSE 標頭中提供kid值。各個密鑰的密鑰用法必須支持簽名。
- 對稱簽名
- 當使用基于 MAC 的簽名時, JOSE 標頭的alg標頭參數值必須設置為 MAC 算法,如JSON Web 算法 (Jones, M., “JSON Web Algorithms (JWA),” May 2015.)[JWA] 中定義。使用的 MAC 密鑰是client_secret值的 UTF-8 表示形式的八位字節。有關client_secret值的熵要求的討論,請參見第 16.19 節 (Symmetric Key Entropy)。公共(非機密)客戶端不得使用對稱簽名,因為它們無法保守秘密。
有關簽名請求需求的安全注意事項, 請參閱第 16.20 節。 (Need for Signed Requests)
| 目錄 |
簽名密鑰的輪換可以通過以下方法完成。簽名者在其jwks_uri位置的 JWK 集中發布其密鑰,并將簽名密鑰的孩子包含在每條消息的 JOSE 標頭中,以向驗證者指示哪個密鑰將用于驗證簽名。可以通過定期將新密鑰添加到jwks_uri位置的 JWK 集來滾動更新密鑰。簽名者可以自行決定開始使用新密鑰,并使用孩子值向驗證者發出更改信號。當驗證者看到不熟悉的孩子值時,知道要返回jwks_uri位置重新檢索密鑰 。jwks_uri中的 JWK Set 文檔 應該將最近停用的簽名密鑰保留一段合理的時間,以促進平穩過渡。
| 目錄 |
加密方必須根據接收方支持的算法選擇加密算法。
- 非對稱加密:RSA
- 內容加密的公鑰必須是接收者在其 JWK Set 文檔中發布的用于加密的公鑰。如果引用的 JWK Set 文檔中有多個鍵,則 必須在 JOSE 標頭中提供kid值。使用支持的 RSA 加密算法來加密隨機內容加密密鑰,以用于加密簽名的 JWT。各個密鑰的密鑰使用必須包括加密。
- 非對稱加密:橢圓曲線
- 為JOSE 標頭的epk元素 創建臨時橢圓曲線公鑰。用于密鑰協商計算的另一個公鑰必須是接收者在其 JWK Set 文檔中發布的公鑰。如果引用的 JWK Set 文檔中有多個鍵,則 必須在 JOSE 標頭中提供kid值。使用 ECDH-ES 算法就用于加密簽名 JWT 的內容加密密鑰達成一致。各個密鑰的密鑰使用必須支持加密。
- 對稱加密
- 對稱加密密鑰是 通過使用client_secret的 UTF-8 表示形式的八位字節的截斷 SHA-2 散列的最左邊位從client_secret值派生的。對于 256 位或更少位的密鑰,使用 SHA-256;對于257-384位的密鑰,使用SHA-384;對于 385-512 位的密鑰,使用 SHA-512.必須截斷哈希值,將最左邊的位保留為 AES 密鑰包裝或使用的直接加密算法的適當位長度,例如,將A128KW的 SHA-256 哈希截斷為 128 位。如果需要大于 512 位的對稱密鑰,則 必須通過擴展定義從client_secret派生密鑰的不同方法。公共(非機密)客戶端不得使用對稱加密,因為它們無法保守秘密。
有關加密請求需求的安全注意事項, 請參閱第 16.21 節。 (Need for Encrypted Requests)
| 目錄 |
輪換加密密鑰必然使用與簽名密鑰不同的過程,因為加密方啟動該過程,因此不能依賴kids的更改作為密鑰需要更改的信號。加密方仍然使用JWE中的kid標頭參數來告訴解密方使用哪個私鑰來解密,但是,加密方需要首先從接收者的jwks_uri位置的JWK集中提供的密鑰中選擇最合適的密鑰。
要輪換密鑰,解密方可以在其jwks_uri位置發布新密鑰,并從 JWK 集中刪除那些正在停用的密鑰。 jwks_uri應該 在響應中包含一個Cache-Control標頭,其中包含max-age指令,如RFC 7234 [RFC7234]中所定義,這使得加密方能夠安全地緩存 JWK 集,而不必重新檢索文檔每個加密事件。解密方應該從jwks_uri引用的 JWK 集中刪除停用的密鑰 ,但在內部保留它們一段合理的時間,與緩存持續時間相協調,以便通過允許加密方有時間獲取新密鑰來促進密鑰之間的平滑過渡。緩存持續時間還應該與新簽名密鑰的發布相協調,如第 10.1.1 節中所述。 (Fielding, R., Ed., Nottingham, M., Ed., and J. Reschke, Ed., “Hypertext Transfer Protocol (HTTP/1.1): Caching,” June 2014.) (Rotation of Asymmetric Signing Keys)
| 目錄 |
OpenID Connect 定義以下范圍值來請求離線訪問:
- 離線訪問
- 可選。此范圍值請求頒發 OAuth 2.0 刷新令牌,該令牌可用于獲取訪問令牌,即使最終用戶不存在(未登錄),該訪問令牌也會授予對最終用戶的 UserInfo 端點的訪問權限。
當請求離線訪問時,必須使用同意的提示 參數值,除非處理請求的其他條件允許離線訪問所請求的資源。 OP 必須始終獲得返回刷新令牌的同意,以允許離線訪問所請求的資源。先前保存的用戶同意并不總是足以授予離線訪問權限。
收到包含offline_access值 的范圍參數后 ,授權服務器:
刷新令牌的使用并不限于 offline_access用例。授權服務器可以在超出本規范范圍的其他上下文中授予刷新令牌。
| 目錄 |
對令牌端點的請求還可以通過使用grant_type值 刷新令牌來使用刷新令牌,如 OAuth 2.0 (Hardt, D., Ed., “The OAuth 2.0 Authorization Framework,” October 2012.) [RFC6749] 第 6 節中所述。本部分定義使用刷新令牌時 OpenID Connect 授權服務器的行為。
| 目錄 |
要刷新訪問令牌,客戶端必須使用為其client_id注冊的身份驗證方法對令牌端點進行身份驗證,如 第 9 節 (Client Authentication)中所述。根據第 13.2 節,客戶端使用表單序列化通過 HTTP POST將參數發送 到令牌端點。 (Form Serialization)
以下是刷新請求的非規范示例(值內換行僅用于顯示目的):
POST /token HTTP/1.1
Host: server.example.com
Content-Type: application/x-www-form-urlencoded
client_id=s6BhdRkqt3
&client_secret=some_secret12345
&grant_type=refresh_token
&refresh_token=8xLOxBtZp8
&scope=openid%20profile
授權服務器必須驗證刷新令牌,必須驗證它是否已頒發給客戶端,并且必須驗證客戶端是否已成功驗證其是否具有客戶端身份驗證方法。
| 目錄 |
成功驗證刷新令牌后,響應正文是第 3.1.3.3 節 (Successful Token Response)的令牌響應 ,但它可能不包含id_token。
如果令牌刷新請求返回 ID 令牌,則適用以下要求:
以下是刷新響應的非規范示例:
HTTP/1.1 200 OK
Content-Type: application/json
Cache-Control: no-store
{
"access_token": "TlBN45jURg",
"token_type": "Bearer",
"refresh_token": "9yNOxJtZa5",
"expires_in": 3600
}
| 目錄 |
如果刷新請求無效或未經授權,授權服務器將返回OAuth 2.0 (Hardt, D., Ed., “The OAuth 2.0 Authorization Framework,” October 2012.) [RFC6749] 第 5.2 節中定義的令牌錯誤響應。
| 目錄 |
使用以下方法之一序列化消息:
本節描述這些序列化方法的語法;其他部分描述了何時可以并且必須使用它們。請注意,并非所有方法都可用于所有消息。
| 目錄 |
為了使用查詢字符串序列化來序列化參數,客戶端通過使用[W3C.SPSD-定義的application/x-www-form-urlencoded格式] 將參數和值添加到 URL 的查詢組件來構造字符串。 html401-20180327] (, “HTML 4.01 Specification,” March 2018.)。查詢字符串序列化通常用在 HTTP GET請求中。向 URL 的片段組件添加參數時也使用相同的序列化方法。
以下是此序列化的非規范示例(值內換行僅用于顯示目的):
GET /authorize?
response_type=code
&scope=openid
&client_id=s6BhdRkqt3
&redirect_uri=https%3A%2F%2Fclient.example.org%2Fcb HTTP/1.1
Host: server.example.com
| 目錄 |
參數及其值通過使用[W3C.SPSD-html401-20180327]定義的application/x-www-form-urlencoded格式將參數名稱和值添加到 HTTP 請求的實體正文來進行表單序列化。表單序列化通常用在 HTTP POST請求中。 (, “HTML 4.01 Specification,” March 2018.)
以下是此序列化的非規范示例(值內換行僅用于顯示目的):
GET /authorize?
response_type=code
&scope=openid
&client_id=s6BhdRkqt3
&redirect_uri=https%3A%2F%2Fclient.example.org%2Fcb HTTP/1.1
Host: server.example.com
| 目錄 |
通過在最高結構級別添加每個參數,參數被序列化為 JSON 對象結構。參數名稱和字符串值表示為 JSON 字符串。數值表示為 JSON 數字。布爾值表示為 JSON 布爾值。除非另有說明,省略的參數和沒有值的參數應該從對象中省略,并且不使用 JSON null值表示。參數可以將 JSON 對象或 JSON 數組作為其值。
以下是此序列化的非規范示例:
{
"access_token": "SlAV32hkKG",
"token_type": "Bearer",
"expires_in": 3600,
"refresh_token": "8xLOxBtZp8"
}
| 目錄 |
處理某些 OpenID Connect 消息需要將消息中的值與已知值進行比較。例如,UserInfo 端點返回的聲明名稱可能會與特定的聲明名稱(例如sub )進行比較。然而,比較 Unicode [UNICODE] (The Unicode Consortium, “The Unicode Standard,” .)字符串具有重大的安全隱患。
因此,JSON 字符串和其他 Unicode 字符串之間的比較必須按如下指定進行:
在多個地方,本規范使用空格分隔的字符串列表。在所有此類情況下,必須使用單個 ASCII 空格字符 (0x20) 作為分隔符。
| 目錄 |
該規范定義了依賴方和 OpenID 提供方使用的功能。預計某些 OpenID 提供方將需要使用它們的 RP 進行靜態帶外配置,而其他提供方將支持 RP 的動態使用,而無需在它們之間預先建立關系。因此,OP 的強制實現功能分為兩組:第一組適用于所有 OP,第二組適用于“動態”OpenID 提供方。
| 目錄 |
所有 OpenID 提供方必須實現本規范中定義的以下功能。該列表補充了已在其他地方列出為“必需”或用“必須”描述的功能集,因此其本身并不是 OP 的一組全面的實現要求。
- 使用 RSA SHA-256 簽署 ID 令牌
- OP 必須支持使用 RSA SHA-256 算法(alg值為 RS256)簽名 ID 令牌,除非 OP 僅支持從令牌端點返回 ID 令牌(如授權碼流程的情況)并且僅允許客戶端注冊指定 none作為請求的 ID 令牌簽名算法。
- 提示參數
- OP 必須支持提示參數,如第 3.1.2 節 (Authorization Endpoint)中所定義,包括指定的用戶界面行為,例如none 和login。
- 顯示參數
- OP 必須支持顯示參數,如第 3.1.2 節 (Authorization Endpoint)中定義。 (請注意,此參數所需的最低支持級別只是其使用不得導致錯誤。)
- 首選區域設置
- OP 必須通過ui_locales和 Claims_locales請求參數 支持用戶界面和聲明的首選語言和腳本的請求 ,如第 3.1.2 節 (Authorization Endpoint)中所定義。 (請注意,這些參數所需的最低支持級別只是使其使用不會導致錯誤。)
- 認證時間
- OP 必須支持根據請求返回最終用戶通過auth_time聲明 進行身份驗證的時間,如第 2 節 (ID Token)中所定義。
- 最大認證年齡
- OP 必須支持通過max_age參數 強制執行最大身份驗證期限,如第 3.1.2 節 (Authorization Endpoint)中所定義。
- 身份驗證上下文類參考
- OP 必須通過acr_values參數 支持對特定身份驗證上下文類參考值的請求,如第 3.1.2 節 (Authorization Endpoint)中所定義。 (請注意,此參數所需的最低支持級別只是使其使用不會導致錯誤。)
| 目錄 |
除了上面列出的功能之外,支持與沒有預先配置關系的 RP 動態建立關系的 OpenID 提供方還必須實現本規范和相關規范中定義的以下功能。
- 響應類型
- 這些 OpenID 提供方必須支持 id_token響應類型,所有非自簽發 OP 也必須支持 代碼和 id_token 令牌響應類型。
- 發現
- 這些 OP 必須支持 Discovery,如 OpenID Connect Discovery 1.0 (Sakimura, N., Bradley, J., Jones, M., and E. Jay, “OpenID Connect Discovery 1.0,” December 2023.) [OpenID.Discovery] 中所定義。
- 動態注冊
- 這些 OP 必須支持動態客戶端注冊,如 OpenID Connect 動態客戶端注冊 1.0 (Sakimura, N., Bradley, J., and M. Jones, “OpenID Connect Dynamic Client Registration 1.0,” December 2023.) [OpenID.Registration] 中所定義。
- 用戶信息端點
- 所有發出訪問令牌的動態 OP 必須支持 UserInfo 端點,如第 5.3 節 (UserInfo Endpoint)中所定義。 (自行頒發的 OP 不頒發訪問令牌。)
- 公鑰作為裸密鑰發布
- 這些 OP 必須將其公鑰發布為裸 JWK 密鑰(也可能附有這些密鑰的 X.509 表示形式)。
- 請求URI
- 這些 OP 必須支持使用請求對象值發出的請求,該值是從請求 URI 中檢索的,該請求 URI 是通過request_uri參數提供的,如第 6.2 節 (Passing a Request Object by Reference)中所定義。
| 目錄 |
某些 OpenID Connect 安裝可以使用一組預先配置的 OpenID 提供方和/或依賴方。在這些情況下,可能不需要支持有關身份或服務的信息的動態發現或客戶端的動態注冊。
但是,如果安裝選擇支持依賴方和沒有預先配置關系的 OpenID 提供方之間的意外交互,則它們應該通過實施OpenID Connect Discovery 1.0 (Sakimura, N., Bradley, J., Jones, M., and E. Jay, “OpenID Connect Discovery 1.0,” December 2023.) [OpenID.Discovery] 和OpenID Connect 動態客戶端注冊中定義的設施來實現此目的1.0 (Sakimura, N., Bradley, J., and M. Jones, “OpenID Connect Dynamic Client Registration 1.0,” December 2023.) [OpenID.Registration] 規范。
| 目錄 |
一般來說,依賴方在與 OpenID 提供方交互時使用哪些功能取決于依賴方。但是,某些選擇取決于其 OAuth 客戶端的性質,例如是否是能夠保守秘密的機密客戶端(在這種情況下,授權碼流程可能是合適的),或者是否是公共客戶端,例如,基于用戶代理的應用程序或靜態注冊的本機應用程序,在這種情況下,隱式流可能是合適的。
使用 OpenID Connect 功能時,依賴方使用時,那些列為“必需”或用“必須”描述的功能是強制實施的。同樣,那些被描述為“可選”的功能不需要使用或支持,除非它們在特定的應用程序上下文中提供價值。最后,當與支持 Discovery 的 OpenID Provider 交互時,OP 的 Discovery 文檔可用于動態確定哪些 OP 功能可供 RP 使用。
| 目錄 |
| 目錄 |
使用授權碼或混合流時,令牌端點會返回 ID 令牌,以響應使用授權碼的令牌請求。某些實現可能會選擇對要在授權碼值中返回的 ID 令牌的狀態進行編碼。其他人可以使用授權碼值作為存儲該狀態的數據庫的索引。
| 目錄 |
nonce參數 值需要包含每個會話的狀態并且攻擊者無法猜測。 Web 服務器客戶端實現此目的的一種方法是將加密隨機值存儲為 HttpOnly 會話 cookie,并使用該值的加密哈希作為隨機數參數。在這種情況下,將返回的 ID 令牌中的隨機數與會話 cookie 的哈希值進行比較,以檢測第三方的 ID 令牌重放。適用于 JavaScript 客戶端和其他基于瀏覽器的客戶端的相關方法是將加密隨機值存儲在 HTML5 本地存儲中,并使用該值的加密哈希。
| 目錄 |
當重定向 URI 片段值中返回響應參數時,客戶端需要讓用戶代理解析片段編碼值并將它們傳遞給客戶端的處理邏輯以供使用。例如,可以直接訪問加密 API 的用戶代理可以是獨立的,所有客戶端代碼都用 JavaScript 編寫。
但是,如果客戶端不完全在用戶代理中運行,實現此目的的一種方法是將它們發布到 Web 服務器客戶端進行驗證。
以下是客戶端可能在其 redirect_uri托管的JavaScript 文件的示例。這是通過授權服務器的重定向加載的。片段組件被解析,然后通過POST發送到 URI,該 URI 將驗證并使用收到的信息。
以下是重定向 URI 響應的非規范示例:
GET /cb HTTP/1.1
Host: client.example.org
HTTP/1.1 200 OK
Content-Type: text/html
<script type="text/javascript">
// First, parse the query string
var params = {}, postBody = location.hash.substring(1),
regex = /([^&=]+)=([^&]*)/g, m;
while (m = regex.exec(postBody)) {
params[decodeURIComponent(m[1])] = decodeURIComponent(m[2]);
}
// And send the token over to the server
var req = new XMLHttpRequest();
// using POST so query isn't logged
req.open('POST', 'https://' + window.location.host +
'/catch_response', true);
req.setRequestHeader('Content-Type',
'application/x-www-form-urlencoded');
req.onreadystatechange = function (e) {
if (req.readyState == 4) {
if (req.status == 200) {
// If the response from the POST is 200 OK, perform a redirect
window.location = 'https://'
+ window.location.host + '/redirect_after_login'
}
// if the OAuth response is invalid, generate an error message
else if (req.status == 400) {
alert('There was an error processing the token')
} else {
alert('Something other than 200 was returned')
}
}
};
req.send(postBody);
| 目錄 |
注意:本規范原始版本中先前描述的潛在兼容性問題現已得到解決。
| 目錄 |
這些相關的可選規范可以與本規范結合使用以提供附加功能:
這些實施者指南旨在為基本網絡依賴方的實施者提供獨立的參考:
| 目錄 |
本規范引用了OAuth 2.0 (Hardt, D., Ed., “The OAuth 2.0 Authorization Framework,” October 2012.) [RFC6749] 第 10 節和OAuth 2.0 承載令牌使用 (Jones, M. and D. Hardt, “The OAuth 2.0 Authorization Framework: Bearer Token Usage,” October 2012.)[RFC6750]第 5 節 中定義的安全注意事項。此外,OAuth 2.0 威脅模型和安全注意事項 (Lodderstedt, T., Ed., McGloin, M., and P. Hunt, “OAuth 2.0 Threat Model and Security Considerations,” January 2013.)[RFC6819] 規范提供了適用于該規范的廣泛威脅和控制列表,因為它基于 OAuth 2.0. ISO/IEC 29115 (International Organization for Standardization, “ISO/IEC 29115:2013. Information technology - Security techniques - Entity authentication assurance framework,” April 2013.) [ISO29115] 還提供了實施者需要考慮的威脅和控制措施。強烈建議實施者詳細閱讀這些參考文獻并應用其中描述的對策。
此外,還考慮了以下攻擊向量和補救措施列表。
| 目錄 |
如果不采取適當的措施,請求可能會泄露給攻擊者,從而構成安全和隱私威脅。
除了[RFC6819]第5.1.1節中所述之外,該標準還提供了一種通過使用 (Lodderstedt, T., Ed., McGloin, M., and P. Hunt, “OAuth 2.0 Threat Model and Security Considerations,” January 2013.)request或request_uri參數來提供請求端到端機密性的方法,其中請求 的內容 是加密的JWT使用適當的密鑰和密碼。在間接請求的情況下,這甚至可以防止用戶代理受到損害。
| 目錄 |
惡意服務器可能會使用各種手段偽裝成合法服務器。為了檢測此類攻擊,客戶端需要對服務器進行身份驗證。
除了[RFC6819] (Lodderstedt, T., Ed., McGloin, M., and P. Hunt, “OAuth 2.0 Threat Model and Security Considerations,” January 2013.)第 5.1.2 節中所述的內容之外,該標準還提供了一種通過使用帶有適當密鑰和密碼的簽名或加密 JWT 來對服務器進行身份驗證的方法。
| 目錄 |
攻擊者可能會生成虛假令牌或修改現有可解析令牌的令牌內容(例如聲明值或簽名),從而導致 RP 向客戶端授予不適當的訪問權限。例如,攻擊者可能會修改可解析令牌以延長有效期;客戶端可能會修改可解析令牌以訪問他們不應查看的信息。
有兩種方法可以減輕這種攻擊:
| 目錄 |
訪問令牌是用于訪問受保護資源的憑證,如 OAuth 2.0 (Hardt, D., Ed., “The OAuth 2.0 Authorization Framework,” October 2012.) [RFC6749] 第 1.4 節中所定義。訪問令牌代表最終用戶的授權,不得暴露給未經授權的各方。
| 目錄 |
服務器響應可能包含身份驗證數據和包含敏感客戶端信息的聲明。泄露響應內容可能會使客戶端容易受到其他類型的攻擊。
可以通過以下兩種方式緩解服務器響應泄露:
| 目錄 |
如果沒有適當的機制,服務器可能會拒絕響應。例如,如果服務器不對響應進行數字簽名,則服務器可以聲明該響應不是通過服務器的服務生成的。
為了減輕這種威脅,服務器可以使用支持不可否認性的密鑰對響應進行數字簽名。客戶端應該驗證數字簽名,以驗證它是由合法服務器頒發的并且其完整性完好無損。
| 目錄 |
由于受損或惡意的客戶端可能會向錯誤的一方發送請求,因此僅使用不記名令牌進行身份驗證的客戶端可以拒絕任何交易。
為了減輕這種威脅,服務器可以要求客戶端使用支持不可否認性的密鑰對請求進行數字簽名。服務器應該驗證數字簽名,以驗證它是由合法客戶端頒發的并且其完整性完好無損。
| 目錄 |
攻擊者使用為一個資源生成的訪問令牌來獲取對第二個資源的訪問權限。
為了減輕這種威脅,訪問令牌應該受到受眾和范圍的限制。實現它的一種方法是包含為其生成該資源作為受眾的資源的標識符。資源驗證傳入令牌是否包含其標識符作為令牌的受眾。
| 目錄 |
攻擊者嘗試使用一次性使用令牌,例如已經在目標資源中使用過一次的授權碼。為了減輕這種威脅,令牌應該包含時間戳和較短的有效期。然后依賴方檢查時間戳和生命周期值以確保令牌當前有效。
或者,服務器可以記錄令牌的使用狀態并檢查每個請求的狀態。
| 目錄 |
除了[RFC6819] (Lodderstedt, T., Ed., McGloin, M., and P. Hunt, “OAuth 2.0 Threat Model and Security Considerations,” January 2013.)第 4.4.1.1 節中描述的攻擊模式之外,如果用戶代理被惡意軟件感染,則可以在用戶代理中捕獲授權碼,其中 TLS 會話將終止。但是,只要使用客戶端身份驗證或加密響應,捕獲它就沒有用。
| 目錄 |
令牌替換是一類攻擊,其中惡意用戶交換各種令牌,包括將合法用戶的授權碼與攻擊者擁有的另一個令牌交換。實現這一目標的一種方法是,攻擊者從一個會話中復制一個令牌,并在另一個會話的 HTTP 消息中使用它,當瀏覽器可以使用該令牌時,這很容易做到;這稱為“剪切和粘貼”攻擊。
OAuth 2.0 (Hardt, D., Ed., “The OAuth 2.0 Authorization Framework,” October 2012.) [RFC6749] 的隱式流程并不是為了減輕這種風險而設計的。在第 10.16 節中,它規范地要求任何使用授權過程作為委托給客戶端的最終用戶身份驗證的形式,不得使用隱式流程,而不采用額外的安全機制,使客戶端能夠確定 ID 令牌和訪問令牌是否已發行供其使用。
在 OpenID Connect 中,可以通過 ID 令牌提供的機制來緩解這種情況。 ID Token 是一個簽名的安全令牌,提供諸如 iss(頒發者)、 sub(主題)、 aud(受眾)、 at_hash(訪問令牌哈希)和 c_hash(代碼哈希)等聲明。使用 ID 令牌,客戶端能夠檢測令牌替換攻擊。
ID 令牌中的c_hash 使客戶端能夠防止授權碼替換。 ID 令牌中的 at_hash使客戶端能夠防止訪問令牌替換。
此外,惡意用戶可能會嘗試通過破壞授權端點和客戶端之間或令牌端點和客戶端之間的通信通道來冒充更高特權的用戶,例如通過交換授權碼或重新排序消息,以說服令牌端點:攻擊者的授權對應于代表更高權限的用戶發送的授權。
對于本規范定義的 HTTP 綁定,對令牌請求的響應按照 HTTP 中的消息順序綁定到相應的請求,因為包含令牌的響應和請求都受 TLS 保護,TLS 會檢測并防止數據包重新排序。
當設計此規范的另一個綁定到無法將令牌端點請求強綁定到響應的協議時,必須利用其他機制來解決此問題。一種這樣的機制可能是 在令牌請求和響應中 包含帶有c_hash聲明的 ID 令牌。
| 目錄 |
定時攻擊使攻擊者能夠通過成功和不成功的解密操作或成功和不成功的消息簽名驗證所采用的代碼路徑中經過的時間差來獲取不必要的大量信息。它可用于減少所用密碼的有效密鑰長度。
實現不應在發現錯誤時終止驗證過程,而應繼續運行,直到處理完所有八位字節以避免這種攻擊。
| 目錄 |
根據加密和簽名/完整性檢查所使用的方法,可能存在各種與加密相關的攻擊。實施者需要查閱JWT (Jones, M., Bradley, J., and N. Sakimura, “JSON Web Token (JWT),” May 2015.) [JWT] 規范及其引用的規范的安全注意事項,以避免這些規范中發現的漏洞。
| 目錄 |
在許多司法管轄區,加密文本簽名被視為無效。因此,為了完整性和不可否認性,本規范要求在執行簽名時對純文本 JSON 聲明進行簽名。如果同時需要簽名和加密,則在包含簽名聲明的 JWS 上執行簽名和加密,結果是嵌套 JWT,如[JWT] (Jones, M., Bradley, J., and N. Sakimura, “JSON Web Token (JWT),” May 2015.)中指定的。請注意,由于所有 JWE 加密算法都提供完整性保護,因此無需單獨對加密內容進行簽名。
| 目錄 |
OpenID Connect 支持每個主機和端口組合有多個頒發者。發現返回的頒發者必須與 ID 令牌中 iss的值完全匹配 。
OpenID Connect 將任何頒發者 URI 的路徑組件視為頒發者標識符的一部分。例如,頒發者標識符為“https://example.com”的主題“1234”不等同于頒發者標識符為“https://example.com/sales”的主題“1234”。
建議每個主機僅使用一個頒發者。但是,如果主機支持多個租戶,則該主機可能需要多個頒發者。
| 目錄 |
在隱式流程中,訪問令牌通過 HTTPS 在客戶端的redirect_uri的片段組件中返回,因此它在 OP 和用戶代理之間以及用戶代理和 RP 之間受到保護。唯一可以捕獲它的地方是 TLS 會話終止的用戶代理,如果用戶代理被惡意軟件感染或受到惡意方的控制,則可能會發生這種情況。
| 目錄 |
實現必須支持 TLS。應該實施哪個版本會隨著時間的推移而變化,并且取決于實施時的廣泛部署和已知的安全漏洞。實施應遵循 BCP 195 [RFC8996] (Moriarty, K. and S. Farrell, “Deprecating TLS 1.0 and TLS 1.1,” March 2021.) [RFC9325] (Sheffer, Y., Saint-Andre, P., and T. Fossati, “Recommendations for Secure Use of Transport Layer Security (TLS) and Datagram Transport Layer Security (DTLS),” November 2022.)中的指南,該指南提供了提高使用 TLS 的已部署服務的安全性的建議和要求。
為了防止信息泄露和篡改,必須使用 TLS 以及提供機密性和完整性保護的密碼套件來應用機密性保護。
每當使用 TLS 時,都必須根據RFC 6125 (Saint-Andre, P. and J. Hodges, “Representation and Verification of Domain-Based Application Service Identity within Internet Public Key Infrastructure Using X.509 (PKIX) Certificates in the Context of Transport Layer Security (TLS),” March 2011.) [RFC6125] 執行 TLS 服務器證書檢查。
| 目錄 |
授權服務器可能無法撤銷訪問令牌。因此,訪問令牌的生命周期應保持為一次性使用或非常短的生命周期。
如果需要持續訪問 UserInfo 端點或其他受保護資源,則可以使用刷新令牌。然后,客戶端可以在令牌端點將刷新令牌交換為可用于訪問資源的新的短期訪問令牌。
授權服務器應該在授權期間清楚地識別對用戶的長期授權。授權服務器應該為最終用戶提供一種機制來撤銷授予客戶端的訪問令牌和刷新令牌。
| 目錄 |
在第 10.1 節 (Signing)和第 10.2 節 (Encryption)中,密鑰是從client_secret值派生的。因此,當與對稱簽名或加密操作一起使用時, client_secret值必須包含足夠的熵來生成加密強密鑰。此外,client_secret值還必須至少包含所使用的特定算法的 MAC 密鑰所需的最小八位字節數。例如,對于HS256, client_secret值必須包含至少 32 個八位字節(并且幾乎肯定應該包含更多,因為client_secret值可能使用受限制的字母表)。
| 目錄 |
在某些情況下,客戶端可能需要使用簽名請求來確保所需的請求參數在不被篡改的情況下傳遞到 OP。例如,max_age 和acr_values可以更好地保證在簽名請求中傳遞時執行的身份驗證的性質。
| 目錄 |
在某些情況下,了解 OpenID Connect 請求的內容本身就可能泄露有關最終用戶的敏感信息。例如,知道客戶正在請求特定的聲明或請求使用特定的身份驗證方法可能會泄露有關最終用戶的敏感信息。 OpenID Connect 允許對 OpenID 提供方的請求進行加密,以防止此類潛在敏感信息被泄露。
| 目錄 |
HTTP 307 重定向將 POST 請求發送到被重定向到的一方,其中包含先前請求中的所有表單數據。這可能會將用于 OpenID 提供方的憑證泄露給依賴方。因此,重定向到重定向 URI 時不得使用 HTTP 307 重定向。同樣,雖然 HTTP 302 重定向通常以不執行此操作的方式實現,但最好使用 HTTP 303 重定向,因為它被定義為不執行此操作。
| 目錄 |
請注意,在 iOS 上,多個應用程序可以注冊為自定義 URI 方案的處理程序,因此無法確定調用應用程序是否會收到來自自簽發 OpenID 提供方的身份驗證回復。使用聲明的 URI 是使用openid:自定義 URI 方案的替代方法。
雖然可以將處理程序分配給自定義 URI 方案,并且操作系統可能可以幫助最終用戶選擇正確的處理程序,但無法保證給定自定義 URI 方案的處理程序不會被替換隨后安裝的本機應用程序。截至撰寫本文時,似乎還沒有針對此漏洞的萬無一失的緩解措施。
| 目錄 |
| 目錄 |
UserInfo 響應通常包含個人身份信息 (PII)。因此,為特定目的發布信息應根據相關規定在授權時間或之前獲得最終用戶的同意。使用目的通常與redirect_uris相關聯進行注冊。
僅必要的用戶信息數據應存儲在客戶端,并且客戶端應將接收到的數據與使用目的聲明相關聯。
| 目錄 |
資源服務器應該使最終用戶的用戶信息訪問日志可供他們使用,以便他們可以監視誰訪問了他們的數據。
| 目錄 |
為了保護最終用戶免受客戶端之間可能存在的關聯的影響,應考慮 使用成對假名標識符(PPID)作為 子(主題)。
| 目錄 |
離線訪問允許在用戶不在場時訪問聲明,這比用戶在場時的聲明傳輸帶來更大的隱私風險。因此,離線訪問資源時應謹慎獲取明確同意。本規范強制要求使用提示 參數來獲得同意,除非已知請求符合每個司法管轄區處理請求的條件。
當使用隱式流或混合流通過用戶代理返回訪問令牌時,它暴露給攻擊者的風險更大,攻擊者稍后可以使用它來訪問 UserInfo 端點。如果Access Token不支持離線訪問,并且服務器可以區分Client請求是離線還是在線,那么風險將大大降低。因此,本規范要求在通過用戶代理傳輸訪問令牌時忽略離線訪問請求。請注意,區分服務器的在線和離線訪問可能很困難,尤其是對于本機客戶端而言。服務器很可能不得不依賴啟發式方法。此外,對于代碼令牌和 令牌的響應類型,通過用戶代理傳遞的訪問令牌的暴露風險 是相同的。因此,實現應該準備好檢測訪問令牌是通過用戶代理還是直接從令牌端點頒發,如果令牌是通過用戶代理頒發,則拒絕離線訪問。
請注意,盡管這些規定要求通過提示參數 進行明確的同意對話,但僅用戶按下“接受”按鈕等事實可能并不構成有效的同意。開發人員應該意識到,為了使同意行為有效,通常,最終用戶必須理解條款的影響,同意必須是自由給出的,而不是強迫的(即必須有其他選項) ,并且條款必須公平公正。一般來說,建議服務遵循每個司法管轄區所需的隱私原則,并依靠其他條件來處理請求,而不僅僅是簡單的明確同意,因為在線自助服務的“明確同意”在某些情況下通常不構成有效同意。司法管轄區。
| 目錄 |
| 目錄 |
本規范在[JWT] 建立的IANA“JSON Web 令牌聲明”注冊表[IANA.JWT.Claims] (IANA, “JSON Web Token Claims,” .) 中注冊了以下聲明。 (Jones, M., Bradley, J., and N. Sakimura, “JSON Web Token (JWT),” May 2015.)
| 目錄 |
| 目錄 |
本規范在RFC 6749 [RFC6749] 建立的IANA“OAuth 參數”注冊表[IANA.OAuth.Parameters] (IANA, “OAuth Parameters,” .) 中注冊了以下參數。 (Hardt, D., Ed., “The OAuth 2.0 Authorization Framework,” October 2012.)
| 目錄 |
| 目錄 |
本規范在RFC 6749 [RFC6749] 建立的IANA“OAuth 擴展錯誤”注冊表[IANA.OAuth.Parameters] (IANA, “OAuth Parameters,” .) 中注冊了以下錯誤。 (Hardt, D., Ed., “The OAuth 2.0 Authorization Framework,” October 2012.)
| 目錄 |
| 目錄 |
本規范在RFC 7595 [RFC7595] 建立的IANA“統一資源標識符 (URI) 方案”注冊表[IANA.URISchemes] (IANA, “Uniform Resource Identifier (URI) Schemes,” .) 中注冊以下 URI 方案。 (Thaler, D., Ed., Hansen, T., and T. Hardie, “Guidelines and Registration Procedures for URI Schemes,” June 2015.)
| 目錄 |
| 目錄 |
| 目錄 |
| [CORS] | Opera Software ASA,“跨源資源共享”,2010 年 7 月。 |
| [E.164] | 國際電信聯盟,“ E.164:國際公共電信編號計劃”,2010 年。 |
| [IANA.AMR] | IANA,“身份驗證方法參考值”。 |
| [IANA.JWT.聲明] | IANA,“ JSON Web 令牌聲明”。 |
| [IANA.語言] | IANA,“語言子標簽注冊表”。 |
| [IANA.OAuth.參數] | IANA,“ OAuth 參數”。 |
| [IANA.URI 方案] | IANA,“統一資源標識符 (URI) 方案。” |
| [IANA.時區] | IANA,“時區數據庫”。 |
| [ISO29115] | 國際標準化組織,“ ISO/IEC 29115:2013.信息技術 - 安全技術 - 實體認證保證框架”,ISO/IEC 29115:2013,2013 年 4 月。 |
| [ISO3166-1] | 國際標準化組織,“ ISO 3166-1:2020.國家及其分區名稱的表示代碼 - 第 1 部分:國家/地區代碼,”2020 年 8 月。 |
| [ISO639] | 國際標準化組織,“ ISO 639:2023.個別語言和語言組的代碼”,2023 年 11 月。 |
| [ISO8601-1] | 國際標準化組織,“ ISO 8601-1:2019/Amd 1:2022.日期和時間 - 信息交換的表示 - 第 1 部分:基本規則”,2022 年 10 月。 |
| [JWA] | Jones, M.,“ JSON Web 算法 (JWA) ”,RFC 7518,DOI 10.17487/RFC7518,2015 年 5 月。 |
| [JWE] | Jones, M. 和 J. Hildebrand,“ JSON Web 加密 (JWE) ”,RFC 7516,DOI 10.17487/RFC7516,2015 年 5 月。 |
| [JWK] | Jones, M.,“ JSON Web 密鑰 (JWK) ”,RFC 7517,DOI 10.17487/RFC7517,2015 年 5 月。 |
| [JWS] | Jones, M.、Bradley, J. 和 N. Sakimura,“ JSON Web 簽名 (JWS) ”,RFC 7515,DOI 10.17487/RFC7515,2015 年 5 月。 |
| [智威湯遜] | Jones, M.、Bradley, J. 和 N. Sakimura,“ JSON Web 令牌 (JWT) ”,RFC 7519,DOI 10.17487/RFC7519,2015 年 5 月。 |
| [OAuth.斷言] | Campbell, B.、Mortimore, C.、Jones, M. 和 Y. Goland,“ OAuth 2.0 客戶端身份驗證和授權的斷言框架”,RFC 7521,DOI 10.17487/RFC7521,2015 年 5 月。 |
| [OAuth.JWT] | Jones, M.、Campbell, B. 和 C. Mortimore,“ OAuth 2.0 客戶端身份驗證和授權許可的 JSON Web 令牌 (JWT) 配置文件”,RFC 7523,DOI 10.17487/RFC7523,2015 年 5 月。 |
| [OAuth.響應] | de Medeiros, B., Ed.、Scurtescu, M.、Tarjan, P. 和 M. Jones,“ OAuth 2.0 多重響應類型編碼實踐”,2014 年 2 月。 |
| [OpenID.發現] | Sakimura, N.、Bradley, J.、Jones, M. 和 E. Jay,“ OpenID Connect Discovery 1.0 ”,2023 年 12 月。 |
| [OpenID.注冊] | Sakimura, N.、Bradley, J. 和 M. Jones,“ OpenID Connect 動態客戶端注冊 1.0 ”,2023 年 12 月。 |
| [RFC20] | Cerf, V.,“網絡交換的 ASCII 格式”,STD 80,RFC 20,DOI 10.17487/RFC0020,1969 年 10 月。 |
| [RFC2119] | Bradner, S.,“ RFC 中用于指示需求級別的關鍵字”,BCP 14,RFC 2119,DOI 10.17487/RFC2119,1997 年 3 月。 |
| [RFC3339] | Klyne, G. 和 C. Newman,“互聯網上的日期和時間:時間戳”,RFC 3339,DOI 10.17487/RFC3339,2002 年 7 月。 |
| [RFC3629] | Yergeau, F.,“ UTF-8,ISO 10646 的轉換格式”,STD 63,RFC 3629,DOI 10.17487/RFC3629,2003 年 11 月。 |
| [RFC3966] | Schulzrinne, H.,“電話號碼的 tel URI ”,RFC 3966,DOI 10.17487/RFC3966,2004 年 12 月。 |
| [RFC3986] | Berners-Lee, T.、Fielding, R. 和 L. Masinter,“統一資源標識符 (URI):通用語法”,STD 66,RFC 3986,DOI 10.17487/RFC3986,2005 年 1 月。 |
| [RFC5322] | Resnick, P., Ed.,“互聯網消息格式”,RFC 5322,DOI 10.17487/RFC5322,2008 年 10 月。 |
| [RFC5646] | 菲利普斯,A.,埃德。和 M. Davis,Ed.,“用于識別語言的標簽”,BCP 47,RFC 5646,DOI 10.17487/RFC5646,2009 年 9 月。 |
| [RFC6125] | Saint-Andre, P. 和 J. Hodges,“在傳輸層安全 (TLS) 環境中使用 X.509 (PKIX) 證書表示和驗證互聯網公鑰基礎設施中基于域的應用程序服務身份”,RFC 6125, DOI 10.17487/RFC6125,2011 年 3 月。 |
| [RFC6711] | Johansson, L.,“ IANA 保證級別 (LoA) 配置文件注冊機構”,RFC 6711,DOI 10.17487/RFC6711,2012 年 8 月。 |
| [RFC6749] | Hardt, D., Ed.,“ OAuth 2.0 授權框架”,RFC 6749,DOI 10.17487/RFC6749,2012 年 10 月。 |
| [RFC6750] | Jones, M. 和 D. Hardt,“ OAuth 2.0 授權框架:不記名令牌使用”,RFC 6750,DOI 10.17487/RFC6750,2012 年 10 月。 |
| [RFC6819] | Lodderstedt, T., Ed.、McGloin, M. 和 P. Hunt,“ OAuth 2.0 威脅模型和安全注意事項”,RFC 6819,DOI 10.17487/RFC6819,2013 年 1 月。 |
| [RFC7230] | Fielding, R., Ed. 和 J. Reschke, Ed.,“超文本傳輸協議 (HTTP/1.1):消息語法和路由”,RFC 7230,DOI 10.17487/RFC7230,2014 年 6 月。 |
| [RFC7231] | 菲爾丁,R.,埃德。和 J. Reschke,Ed.,“超文本傳輸協議 (HTTP/1.1):語義和內容”,RFC 7231,DOI 10.17487/RFC7231,2014 年 6 月。 |
| [RFC7234] | Fielding, R., Ed.、Nottingham, M., 和 J. Reschke, Ed.,“超文本傳輸協議 (HTTP/1.1):緩存”,RFC 7234,DOI 10.17487/RFC7234,2014 年 6 月。 |
| [RFC8176] | Jones, M.、Hunt, P. 和 A. Nadalin,“身份驗證方法參考值”,RFC 8176,DOI 10.17487/RFC8176,2017 年 6 月。 |
| [RFC8259] | Bray, T., Ed.,“ JavaScript 對象表示法 (JSON) 數據交換格式”,STD 90、RFC 8259、DOI 10.17487/RFC8259,2017 年 12 月。 |
| [RFC8996] | Moriarty, K. 和 S. Farrell,“棄用 TLS 1.0 和 TLS 1.1 ”,BCP 195、RFC 8996、DOI 10.17487/RFC8996,2021 年 3 月。 |
| [RFC9325] | Sheffer, Y.、Saint-Andre, P. 和 T. Fossati,“安全使用傳輸層安全 (TLS) 和數據報傳輸層安全 (DTLS) 的建議”,BCP 195、RFC 9325、DOI 10.17487/RFC9325, 2022 年 11 月。 |
| [統一碼] | Unicode 聯盟,“ Unicode 標準”。 |
| [美國15] | Whistler, K.,“ Unicode 規范化形式”,Unicode 標準附件 15,2023 年 8 月。 |
| [W3C.SPSD-html401-20180327] | “ HTML 4.01 規范”,W3C REC SPSD-html401-20180327,W3C SPSD-html401-20180327,2018 年 3 月。 |
| 目錄 |
| [JWK.指紋] | Jones, M. 和 N. Sakimura,“ JSON Web 密鑰 (JWK) 指紋”,RFC 7638,DOI 10.17487/RFC7638,2015 年 9 月。 |
| [OAuth.Post] | Jones, M. 和 B. Campbell,“ OAuth 2.0 表單后響應模式”,2015 年 4 月。 |
| [OpenID.2.0] | OpenID 基金會,“ OpenID 身份驗證 2.0 ”,2007 年 12 月。 |
| [OpenID.BackChannel] | Jones, M. 和 J. Bradley,“ OpenID Connect 后端通道注?銷 1.0 ”,2023 年 12 月。 |
| [OpenID.基本] | Sakimura, N.、Bradley, J.、Jones, M.、de Medeiros, B. 和 C. Mortimore,“ OpenID Connect 基本客戶端實施者指南 1.0 ”,2023 年 12 月。 |
| [OpenID.Core.勘誤1] | Sakimura, N.、Bradley, J.、Jones, M.、de Medeiros, B. 和 C. Mortimore,“ OpenID Connect Core 1.0 包含勘誤集 1 ”,2014 年 11 月。 |
| [OpenID.Core.Final] | Sakimura, N.、Bradley, J.、Jones, M.、de Medeiros, B. 和 C. Mortimore,“ OpenID Connect Core 1.0(最終版) ”,2014 年 2 月。 |
| [OpenID.FrontChannel] | Jones, M.,“ OpenID Connect 前端注銷 1.0 ”,2022 年 9 月。 |
| [OpenID.隱式] | Sakimura, N.、Bradley, J.、Jones, M.、de Medeiros, B. 和 C. Mortimore,“ OpenID Connect 隱式客戶端實施者指南 1.0 ”,2023 年 12 月。 |
| [OpenID.PAPE] | Recordon, D.、Jones, M.、Bufu, J.、Ed.、Daugherty, J.、Ed. 和 N. Sakimura,“ OpenID 提供方身份驗證策略擴展 1.0 ”,2008 年 12 月。 |
| [OpenID.RP發起] | Jones, M.、de Medeiros, B.、Agarwal, N.、Sakimura, N. 和 J. Bradley,“ OpenID Connect RP 發起的注銷 1.0 ”,2022 年 9 月。 |
| [OpenID.會話] | de Medeiros, B.、Agarwal, N.、Sakimura, N.、Bradley, J. 和 M. Jones,“ OpenID Connect 會話管理 1.0 ”,2022 年 9 月。 |
| [RFC4949] | Shirey, R.,“互聯網安全術語表,版本 2 ”,FYI 36,RFC 4949,DOI 10.17487/RFC4949,2007 年 8 月。 |
| [RFC7595] | Thaler, D., Ed.、Hansen, T. 和 T. Hardie,“ URI 方案指南和注冊程序”,BCP 35,RFC 7595,DOI 10.17487/RFC7595,2015 年 6 月。 |
| [RFC9101] | Sakimura, N.、Bradley, J. 和 M. Jones,“ OAuth 2.0 授權框架:JWT 安全授權請求 (JAR) ”,RFC 9101,DOI 10.17487/RFC9101,2021 年 8 月。 |
| [X.1252] | 國際電信聯盟,“ ITU-T 建議 X.1252 - 網絡空間安全 - 身份管理 - 基線身份管理術語和定義”,ITU-T X.1252,2010 年 4 月。 |
| 目錄 |
以下是具有不同response_type值及其響應的授權請求的非規范示例(值內換行僅用于顯示目的):
| 目錄 |
GET /authorize?
response_type=code
&client_id=s6BhdRkqt3
&redirect_uri=https%3A%2F%2Fclient.example.org%2Fcb
&scope=openid%20profile%20email
&nonce=n-0S6_WzA2Mj
&state=af0ifjsldkj HTTP/1.1
Host: server.example.com
HTTP/1.1 302 Found
Location: https://client.example.org/cb?
code=Qcb0Orv1zh30vL1MPRsbm-diHiMwcLyZvn1arpZv-Jxf_11jnpEX3Tgfvk
&state=af0ifjsldkj
| 目錄 |
GET /authorize?
response_type=id_token
&client_id=s6BhdRkqt3
&redirect_uri=https%3A%2F%2Fclient.example.org%2Fcb
&scope=openid%20profile%20email
&nonce=n-0S6_WzA2Mj
&state=af0ifjsldkj HTTP/1.1
Host: server.example.com
HTTP/1.1 302 Found
Location: https://client.example.org/cb#
id_token=eyJraWQiOiIxZTlnZGs3IiwiYWxnIjoiUlMyNTYifQ.
ewogImlzcyI6ICJodHRwczovL3NlcnZlci5leGFtcGxlLmNvbSIsCiAic3ViIjog
IjI0ODI4OTc2MTAwMSIsCiAiYXVkIjogInM2QmhkUmtxdDMiLAogIm5vbmNlIjog
Im4tMFM2X1d6QTJNaiIsCiAiZXhwIjogMTMxMTI4MTk3MCwKICJpYXQiOiAxMzEx
MjgwOTcwLAogIm5hbWUiOiAiSmFuZSBEb2UiLAogImdpdmVuX25hbWUiOiAiSmFu
ZSIsCiAiZmFtaWx5X25hbWUiOiAiRG9lIiwKICJnZW5kZXIiOiAiZmVtYWxlIiwK
ICJiaXJ0aGRhdGUiOiAiMDAwMC0xMC0zMSIsCiAiZW1haWwiOiAiamFuZWRvZUBl
eGFtcGxlLmNvbSIsCiAicGljdHVyZSI6ICJodHRwOi8vZXhhbXBsZS5jb20vamFu
ZWRvZS9tZS5qcGciCn0.
NTibBYW_ZoNHGm4ZrWCqYA9oJaxr1AVrJCze6FEcac4t_EOQiJFbD2nVEPkUXPuM
shKjjTn7ESLIFUnfHq8UKTGibIC8uqrBgQAcUQFMeWeg-PkLvDTHk43Dn4_aNrxh
mWwMNQfkjqx3wd2Fvta9j8yG2Qn790Gwb5psGcmBhqMJUUnFrGpyxQDhFIzzodmP
okM7tnUxBNj-JuES_4CE-BvZICH4jKLp0TMu-WQsVst0ss-vY2RPdU1MzL59mq_e
Kk8Rv9XhxIr3WteA2ZlrgVyT0cwH3hlCnRUsLfHtIEb8k1Y_WaqKUu3DaKPxqRi6
u0rN7RO2uZYPzC454xe-mg
&state=af0ifjsldkj
id_token參數 的值是 ID Token,它是一個簽名的 JWT,包含三個以句點(“.”)字符分隔的 base64url 編碼的段。第一段代表 JOSE 標頭。 Base64url 解碼將產生以下一組標頭參數:
{"kid":"1e9gdk7","alg":"RS256"}
alg值表示用于簽署 JWT 的算法,在本例中 為RS256 ,表示使用 SHA-256的RSASSA-PKCS1-v1_5. Kid值是用于標識要用于驗證簽名的密鑰的密鑰標識符。如果RP不知道kid值,則需要再次檢索OP的JWK集的內容以獲得OP當前的密鑰集。
第二段代表 ID 令牌中的聲明。驗證和解碼 ID Token 將產生以下聲明:
{
"iss": "https://server.example.com",
"sub": "248289761001",
"aud": "s6BhdRkqt3",
"nonce": "n-0S6_WzA2Mj",
"exp": 1311281970,
"iat": 1311280970,
"name": "Jane Doe",
"given_name": "Jane",
"family_name": "Doe",
"gender": "female",
"birthdate": "0000-10-31",
"email": "janedoe@example.com",
"picture": "http://example.com/janedoe/me.jpg"
}
第三段表示 ID Token 簽名,其驗證方式如[JWS] (Jones, M., Bradley, J., and N. Sakimura, “JSON Web Signature (JWS),” May 2015.)中所述。
| 目錄 |
GET /authorize?
response_type=id_token%20token
&client_id=s6BhdRkqt3
&redirect_uri=https%3A%2F%2Fclient.example.org%2Fcb
&scope=openid%20profile%20email
&nonce=n-0S6_WzA2Mj
&state=af0ifjsldkj HTTP/1.1
Host: server.example.com
HTTP/1.1 302 Found
Location: https://client.example.org/cb#
access_token=jHkWEdUXMU1BwAsC4vtUsZwnNvTIxEl0z9K3vx5KF0Y
&token_type=Bearer
&id_token=eyJraWQiOiIxZTlnZGs3IiwiYWxnIjoiUlMyNTYifQ.
ewogImlzcyI6ICJodHRwczovL3NlcnZlci5leGFtcGxlLmNvbSIsCiAic3ViIjog
IjI0ODI4OTc2MTAwMSIsCiAiYXVkIjogInM2QmhkUmtxdDMiLAogIm5vbmNlIjog
Im4tMFM2X1d6QTJNaiIsCiAiZXhwIjogMTMxMTI4MTk3MCwKICJpYXQiOiAxMzEx
MjgwOTcwLAogImF0X2hhc2giOiAiNzdRbVVQdGpQZnpXdEYyQW5wSzlSUSIKfQ.
kdqTmftlaXg5WBYBr1wkxhkqCGZPc0k8vTiV5g2jj67jQ7XkrDamYx2bOkZLdZrp
MPIzkdYB1nZI_G8vQGQuamRhJcEIt21kblGPZ-yhEhdkAiZIZLu38rChalDS2Mh0
glE_rke5XXRhmqqoEFFdziFdnO3p61-7y51co84OEAZvARSINQaOWIzvioRfs4zw
IFOaT33Vpxfqr8HDyh31zo9eBW2dSQuCa071z0ENWChWoPliK1JCo_Bk9eDg2uwo
2ZwhsvHzj6TMQ0lYOTzufSlSmXIKfjlOsb3nftQeR697_hA-nMZyAdL8_NRfaC37
XnAbW8WB9wCfECp7cuNuOg
&state=af0ifjsldkj
驗證和解碼 ID Token 將產生以下聲明:
{
"iss": "https://server.example.com",
"sub": "248289761001",
"aud": "s6BhdRkqt3",
"nonce": "n-0S6_WzA2Mj",
"exp": 1311281970,
"iat": 1311280970,
"at_hash": "77QmUPtjPfzWtF2AnpK9RQ"
}
| 目錄 |
GET /authorize?
response_type=code%20id_token
&client_id=s6BhdRkqt3
&redirect_uri=https%3A%2F%2Fclient.example.org%2Fcb
&scope=openid%20profile%20email
&nonce=n-0S6_WzA2Mj
&state=af0ifjsldkj HTTP/1.1
Host: server.example.com
HTTP/1.1 302 Found
Location: https://client.example.org/cb#
code=Qcb0Orv1zh30vL1MPRsbm-diHiMwcLyZvn1arpZv-Jxf_11jnpEX3Tgfvk
&id_token=eyJraWQiOiIxZTlnZGs3IiwiYWxnIjoiUlMyNTYifQ.
ewogImlzcyI6ICJodHRwczovL3NlcnZlci5leGFtcGxlLmNvbSIsCiAic3ViIjog
IjI0ODI4OTc2MTAwMSIsCiAiYXVkIjogInM2QmhkUmtxdDMiLAogIm5vbmNlIjog
Im4tMFM2X1d6QTJNaiIsCiAiZXhwIjogMTMxMTI4MTk3MCwKICJpYXQiOiAxMzEx
MjgwOTcwLAogImNfaGFzaCI6ICJMRGt0S2RvUWFrM1BrMGNuWHhDbHRBIgp9.
MRPihYtNIcwKTZ_mcMSPfreVytGR4jfl1Tzbv4tH5Jr4WqONs2lUWrIEpZ2joKbZ
fAGlouAqwqSYpfR3FQYKYvdgnZ3kjIJ_5M4fAARXHVSciGyhfqB-OhDUMXSHzFHi
GKNY9TKSgRfiXf_314WRujpqaDtj2uoXbppobYXvAZIxWtsOein0-t91LDS39EW4
frNWAopKTBBi_XJPlpLVynWTDvNleEBP6UxIMgYJBKlqsP7RGfHTGk3ReXDacR7R
GZlIVGa-0qRyDzvNqD7xfu9aYufUP0oBGqdBGgFVNmwJ7rmB0gdPtC2eJsXq9svC
gBBfhRQZxhx1iLJjNc9nSw
&state=af0ifjsldkj
驗證和解碼 ID Token 將產生以下聲明:
{
"iss": "https://server.example.com",
"sub": "248289761001",
"aud": "s6BhdRkqt3",
"nonce": "n-0S6_WzA2Mj",
"exp": 1311281970,
"iat": 1311280970,
"c_hash": "LDktKdoQak3Pk0cnXxCltA"
}
| 目錄 |
{
"iss": "https://server.example.com",
"sub": "248289761001",
"aud": "s6BhdRkqt3",
"nonce": "n-0S6_WzA2Mj",
"exp": 1311281970,
"iat": 1311280970,
"c_hash": "LDktKdoQak3Pk0cnXxCltA"
}
| 目錄 |
GET /authorize?
response_type=code%20id_token%20token
&client_id=s6BhdRkqt3
&redirect_uri=https%3A%2F%2Fclient.example.org%2Fcb
&scope=openid%20profile%20email
&nonce=n-0S6_WzA2Mj
&state=af0ifjsldkj HTTP/1.1
Host: server.example.com
HTTP/1.1 302 Found
Location: https://client.example.org/cb#
code=Qcb0Orv1zh30vL1MPRsbm-diHiMwcLyZvn1arpZv-Jxf_11jnpEX3Tgfvk
&access_token=jHkWEdUXMU1BwAsC4vtUsZwnNvTIxEl0z9K3vx5KF0Y
&token_type=Bearer
&id_token=eyJraWQiOiIxZTlnZGs3IiwiYWxnIjoiUlMyNTYifQ.
ewogImlzcyI6ICJodHRwczovL3NlcnZlci5leGFtcGxlLmNvbSIsCiAic3ViIjog
IjI0ODI4OTc2MTAwMSIsCiAiYXVkIjogInM2QmhkUmtxdDMiLAogIm5vbmNlIjog
Im4tMFM2X1d6QTJNaiIsCiAiZXhwIjogMTMxMTI4MTk3MCwKICJpYXQiOiAxMzEx
MjgwOTcwLAogImF0X2hhc2giOiAiNzdRbVVQdGpQZnpXdEYyQW5wSzlSUSIsCiAi
Y19oYXNoIjogIkxEa3RLZG9RYWszUGswY25YeENsdEEiCn0.
A2OhhJzbUNaCbNLqNaqetGLJoxB3ujVbq_HLYSOWgWCJ3-B__YxlqIg8gpeL0Vhv
rWX0mwz7w_pGTRN4JdgsI0xAlT5fob1ZPnrazgonSyzaXcg2bgD896SsBSlG_8JX
6JKaztXifn8k2gy65Me-sMyQrRF8xv_q1CeC871sZpMjJzy5nx65BTI17vcXjntZ
HADv6o2CrHrEdHp8xSlnTLiiIqgDOmKlpkeqqOBK6dqa4rXZlSqMAUm1LYZmtb2D
8sHvQsxTbWlBkX7VZaTSqMJ487s4ZIEea8Bw4KGVOntQue4VhBjBnQ4bQKhB_47D
xlWpSyOWdy3cer_zxKrfvw
&state=af0ifjsldkj
驗證和解碼 ID Token 將產生以下聲明:
{
"iss": "https://server.example.com",
"sub": "248289761001",
"aud": "s6BhdRkqt3",
"nonce": "n-0S6_WzA2Mj",
"exp": 1311281970,
"iat": 1311280970,
"at_hash": "77QmUPtjPfzWtF2AnpK9RQ",
"c_hash": "LDktKdoQak3Pk0cnXxCltA"
}
| 目錄 |
以下以 JWK 格式表示的 RSA 公鑰可用于驗證上述示例中的 ID 令牌簽名(值內換行僅用于顯示目的):
{
"kty":"RSA",
"kid":"1e9gdk7",
"n":"w7Zdfmece8iaB0kiTY8pCtiBtzbptJmP28nSWwtdjRu0f2GFpajvWE4VhfJA
jEsOcwYzay7XGN0b-X84BfC8hmCTOj2b2eHT7NsZegFPKRUQzJ9wW8ipn_aD
JWMGDuB1XyqT1E7DYqjUCEOD1b4FLpy_xPn6oV_TYOfQ9fZdbE5HGxJUzeku
GcOKqOQ8M7wfYHhHHLxGpQVgL0apWuP2gDDOdTtpuld4D2LK1MZK99s9gaSj
RHE8JDb1Z4IGhEcEyzkxswVdPndUWzfvWBBWXWxtSUvQGBRkuy1BHOa4sP6F
KjWEeeF7gm7UMs2Nm2QUgNZw6xvEDGaLk4KASdIxRQ",
"e":"AQAB"
}
| 目錄 |
作為 OpenID 的后續版本,該規范在很大程度上依賴于OpenID Authentication 2.0 (OpenID Foundation, “OpenID Authentication 2.0,” December 2007.) [OpenID.2.0] 中探索的思想。請參閱 OpenID Authentication 2.0 的附錄 C,了解該規范貢獻者的完整列表。
此外,OpenID 社區還要感謝以下人員對此規范做出的貢獻:
Naveen Agarwal (Naveen.Agarwal@microsoft.com),微軟(曾在 Google)
阿曼達·安加內斯 (aanganes@mitre.org),MITRE
卡斯帕·比林 (cb@peercraft.com),Peercraft
John Bradley (ve7jtb@ve7jtb.com)、Yubico(曾在 Ping Identity)
Tim Bray (tbray@textuality.com),獨立人士(曾在 Google)
Johnny Bufu (johnny.bufu@gmail.com),獨立人士(曾在 Janrain)
Brian Campbell (bcampbell@pingidentity.com),Ping Identity
布萊恩·庫克 (romeda@gmail.com),獨立人士
布雷諾·德·梅代羅斯 (breno@google.com),Google
Pamela Dingle (Pamela.Dingle@microsoft.com),微軟(曾在 Ping Identity)
Vladimir Dzhuvinov (vladimir@connect2id.com),Connect2id(曾在 Nimbus Directory Services)
George Fletcher (gffletch@aol.com),第一資本(曾在 AOL)
Roland Hedberg (roland@catalogix.se),獨立人士(曾于于默奧大學)
伊藤亮 (ryo.ito@mixi.co.jp),mixi, Inc.
埃德蒙·杰伊 (ejay@mgi1.com),伊魯米拉
Michael B. Jones (michael_b_jones@hotmail.com),自助咨詢(曾在 Microsoft)
Torsten Lodderstedt (torsten@lodderstedt.net),獨立人士(曾供職于德國電信)
詹姆斯·曼格 (James.H.Manger@team.telstra.com),澳大利亞電信
Nov Matake (nov@matake.jp),獨立
Chuck Mortimore (charliemortimore@gmail.com),迪士尼(曾在 Salesforce)
Anthony Nadalin (nadalin@prodigy.net),獨立人士(曾供職于 Microsoft)
Hideki Nara (hdknr@ic-tact.co.jp),Tact Communications
Axel Nennker (axel.nennker@telekom.de),德國電信
David Recordon (recordond@gmail.com),獨立人士(曾供職于 Facebook)
Justin Richer (justin@bspk.io),定制工程(曾在 MITRE)
Nat Sakimura (nat@nat.consulting),NAT.Consulting(曾在 NRI)
盧克·謝潑德 (luke@lukeshepard.com),Facebook
Andreas Åkre Solberg (Andreas.Solberg@sikt.no),Sikt(曾在 UNINET)
保羅·塔里揚 (paul@paultarjan.com),Facebook
| 目錄 |
版權所有 (c) 2023 OpenID 基金會。
OpenID 基金會 (OIDF) 向任何貢獻者、開發者、實施者或其他相關方授予非排他性、免版稅、全球版權許可,以復制、分發、執行和展示本實施者草案或最終規范、準備衍生作品、分發、執行和展示僅用于 (i) 制定規范,以及 (ii) 根據此類文件實施實施者草案和最終規范,前提是注明材料來源為 OIDF,但此類來源并不表示認可由 OIDF 制定。
本規范中描述的技術來自各種來源的貢獻,包括 OpenID 基金會的成員和其他人。盡管 OpenID 基金會已采取措施幫助確保該技術可供分發,但它對可能聲稱與實施或使用該技術相關的任何知識產權或其他權利的有效性或范圍不持任何立場。本規范或此類權利下的任何許可可能或可能不可用的范圍;它也不代表它已做出任何獨立努力來確定任何此類權利。 OpenID 基金會和本規范的貢獻者不做出(并特此明確否認任何)與本規范相關的保證(明示、暗示或其他方式),包括適銷性、不侵權、特定用途的適用性或所有權的暗示保證。規范,并且實施該規范的全部風險由實施者承擔。 OpenID 知識產權政策要求貢獻者提供專利承諾,不會針對其他貢獻者和實施者提出某些專利主張。 OpenID 基金會邀請任何感興趣的各方提請其注意可能涵蓋實踐本規范所需的技術的任何版權、專利、專利申請或其他專有權利。
| 目錄 |
| 納特·薩基穆拉 | |
| NAT咨詢 | |
| 電子郵件: | nat@nat.consulting |
| 約翰·布拉德利 | |
| 尤比科 | |
| 電子郵件: | ve7jtb@ve7jtb.com |
| 邁克爾·瓊斯 | |
| 自發行咨詢 | |
| 電子郵件: | michael_b_jones@hotmail.com |
| 布雷諾·德·梅代羅斯 | |
| 谷歌 | |
| 電子郵件: | breno@google.com |
| 查克·莫蒂摩爾 | |
| 迪士尼 | |
| 電子郵件: | charliemortimore@gmail.com |