🧩 1. OpenID Connect 1.0 简介
OpenID Connect 1.0 是一个简单的身份层,建立在 OAuth 2.0 协议(RFC6749) 之上。
它允许客户端在授权服务器执行身份验证后,验证最终用户的身份,并以可互操作的 REST 方式获取有关最终用户的基本概要信息。
🧠 核心功能
OpenID Connect Core 1.0 规范定义了核心功能:
- ✅ 基于 OAuth 2.0 的身份验证机制
- ✅ 使用 声明(Claims) 传递有关最终用户的信息
该规范还描述了使用 OpenID Connect 时的 安全 与 隐私注意事项。
🏗 背景
OAuth 2.0 授权框架 (RFC6749) 和
OAuth 2.0 授权令牌使用规范 (RFC6750) 提供了一个通用的框架,
供第三方应用程序获取和使用对 HTTP 资源的有限访问权限。
然而:
🔸 OAuth 2.0 只定义了获取和使用访问令牌的机制,
并未定义提供身份信息的标准方法。
因此如果不扩展 OAuth 2.0,就无法提供最终用户的身份验证信息。
在阅读本规范之前,用户应熟悉上述 OAuth 2.0 相关规范。
⚙️ OpenID Connect 的工作原理
OpenID Connect 通过扩展 OAuth 2.0 授权过程来实现身份验证。
客户端在授权请求中包含 openid 作用域值,以启用该扩展。
有关身份验证的信息将以 ID Token 的形式返回:
这是一个 JSON Web Token (JWT)。
📌 术语映射
| 名称 | 含义 |
|---|---|
| OpenID Provider (OP) | 实现 OpenID Connect 的 OAuth 2.0 授权服务器 |
| Relying Party (RP) | 使用 OpenID Connect 的 OAuth 2.0 客户端 |
| ID Token | 含身份声明的 JWT 令牌 |
🔍 前提条件
本规范假设:
- RP(依赖方)已经从 OP(OpenID 提供商)获取配置信息,
包括授权端点与令牌端点的位置。
通常通过 Discovery(发现机制) 获取(参见 OpenID Discovery 1.0 )。 - RP 已获取足够的身份信息以及调用 OP 所需信息。
通常通过 Dynamic Registration(动态注册) 获取。
📚 前序版本
📖 1.1. 需求表示法和约定
本文件中的以下关键词需按照 RFC 2119 的描述进行解释:
MUST, MUST NOT, REQUIRED, SHALL, SHALL NOT, SHOULD, SHOULD NOT,
RECOMMENDED, NOT RECOMMENDED, MAY, OPTIONAL
- 在
.txt版本中,用引号括起的值表示字面值。 - 在协议消息中使用这些值时,引号 MUST NOT 作为值的一部分被包含。
- 在 HTML 版本中,按字面意思使用的值用固定宽度字体表示。
本规范中所有对 JWS / JWE 数据结构的使用均采用:
- JWS Compact Serialization
- JWE Compact Serialization
不使用 JSON 序列化格式。
📘 1.2. 术语(Terminology)
📗 来源术语
OAuth 2.0 [RFC6749]
Access Token、Authorization Code、Authorization Endpoint、Authorization Grant、Authorization Server、Client、Client Authentication、Client Identifier、Client Secret、Grant Type、Protected Resource、Redirection URI、Refresh Token、Resource Server、Response Type、Token Endpoint。
JSON Web Token (JWT) [JWT]
Claim Name、Claim Value、JWT Claims Set、Nested JWT。
JSON Web Signature (JWS) [JWS]
Base64url Encoding、Header Parameter、JOSE Header。
RFC 7230 [RFC7230]
User Agent。
OAuth 2.0 Multiple Response Type [OAuth.Responses]
Response Mode。
📘 定义的新术语
| 术语 | 定义 |
|---|---|
| Authentication | 用于在实体与其所呈现身份之间建立足够信任的过程。 |
| Authentication Request | 使用 OpenID Connect 扩展参数和作用域的 OAuth 2.0 授权请求,要求授权服务器(OP)对终端用户进行身份验证并返回给客户端(RP)。 |
| Authentication Context | RP 在授权决策前可以要求的身份验证信息(例如认证方法或保证级别)。 |
| Authentication Context Class | 在特定上下文中被认为等价的一组身份验证方法。 |
| Authentication Context Class Reference | 身份验证上下文类的标识符。 |
| Authorization Code Flow | 一种 OAuth 2.0 流程,其中授权码从授权端点返回,令牌从令牌端点返回。 |
| Authorization Request | [RFC6749] 中定义的 OAuth 2.0 授权请求。 |
| Claim | 关于实体的一段声明信息。 |
| Claim Type | 表示声明值的语法。本规范定义了普通、聚合和分布式声明类型。 |
| Claims Provider | 可返回实体声明信息的服务器。 |
🧠 本章节中的术语定义具有规范性,对实现方具有约束力。
所有以大写开头的术语(如 “Issuer Identifier”)均引用这些定义。
📚 背景参考
- Internet Security Glossary, Version 2 [RFC4949]
- ISO/IEC 29115 实体身份验证保证 [ISO29115]
- ITU-T X.1252 [X.1252]
🔄 1.3. 概述(Overview)
OpenID Connect 协议的抽象过程如下:
- RP(客户端) 向 OP(提供商) 发送请求。
- OP 对终端用户进行身份验证并获得授权。
- OP 返回一个 ID Token,通常还包括一个 Access Token。
- RP 使用 Access Token 调用 UserInfo 端点。
- UserInfo 端点 返回关于用户的声明(Claims)。
🧭 流程图示
+--------+ +--------+
| | | |
| |---------(1) AuthN Request-------->| |
| | | |
| | +--------+ | |
| | | | | |
| | | End- |<--(2) AuthN & AuthZ-->| |
| | | User | | |
| RP | | | | OP |
| | +--------+ | |
| | | |
| |<--------(3) AuthN Response--------| |
| | | |
| |---------(4) UserInfo Request----->| |
| | | |
| |<--------(5) UserInfo Response-----| |
| | | |
+--------+ +--------+⚙️ 流程说明
-
身份验证请求 (AuthN Request) RP 向 OP 发送请求,包含所需的作用域(Scopes)、重定向 URI 等参数。
-
身份验证与授权 (AuthN & AuthZ) OP 验证终端用户身份,并在获得同意后授予权限。
-
身份验证响应 (AuthN Response) OP 将 ID Token 与(可选)Access Token 返回给 RP,用于身份验证和访问。
-
UserInfo 请求 (UserInfo Request) RP 使用 Access Token 向 UserInfo 端点请求用户信息。
-
UserInfo 响应 (UserInfo Response) UserInfo 端点返回用户的声明信息(如姓名、邮箱)。
💬 总结: OpenID Connect 通过在 OAuth 2.0 框架之上添加身份层, 使客户端不仅能获取访问令牌,还能获取验证用户身份的 ID Token, 从而实现统一的身份认证机制。