OpenID Connect
What is OpenID Connect
OpenID Connect ,下面简称OIDC,是一种基于OAuth 2.0的规范框架(IETF RFC 6749 和 6750)的可互操作的身份验证协议,它简化了基于授权服务器执行的身份验证的方式以及可互操作和类似REST的方式获取用户配置文件信息的方式
简单的说,OIDC就是一种验证身份的安全机制,它能够让一个应用以一种安全的方式连接到身份提供者(OP),再从IDP上获取到相关用户信息,OIDC允许客户端应用通过授权服务执行认证,来验证终端用户的身份。
对应用程序和网站开发人员来说,OIDC能够启动登录流,通过Web、mobile和JS 的客户端接受用户的验证信息,并且可以扩展支持身份数据的加密和OP的发现和会话注销,它的便捷性和扩展性让它成为了主流的身份验证协议。
OIDC Structure
这张图表示OIDC提供的整体身份验证和管理系统
Core:是核心功能,“Minimal”代表OIDC实现必须的协议
Discovery:用于动态发现身份提供者的信息。
Dynamic Client Registration:允许客户端自动注册到身份提供者
Form Post Response Mode:通过HTML表单提交的响应模式
Session Management:与会话管理相关的功能。
Dynamic:动态包含了一些扩展功能
Complete:表示一个完整OIDC套件的结构
Underpinning:表示基础技术,也就是OIDC的底层技术,它包含了OAuth 2.0的各个部分,如核心、承载、断言、JWT配置和响应。还有JWT、JWS、JWE等。
在OIDC中,有个额外的令牌 ,它被称为 ID Token,是发布给客户端的。与Oauth 2.0授权过程不同的是它有一个额外的步骤,授权给客户端获取用户信息。客户端在进行授权吗请求是参数scope将会包含openid,然后IDP 认证这个请求会返回两个JWT,一个是access_token ,来自OAuth 2.0,一个是id_token, 来自OIDC。
ID Token
OIDC 的核心令牌,用于证明终端用户(End-User)的身份认证结果。
格式:符合 JWT (RFC 7519) 标准,由三部分组成:
-
Header:算法(如RS256)和令牌类型(“typ”: “JWT”)。
-
Payload:用户身份声明(Claims)。
-
Signature:OP 的签名,确保令牌真实性。
ID Token Payload 字段详解
下面是一个字段例子和详解
{
"iss": "http://test.nanlv.com",
"sub": "248289761231",
"aud": "s6BhdRkqt3",
"nonce": "n-0S6_WzA2Mj",
"exp": 1311281970,
"iat": 1311280970,
"name": "KanChaiGong",
"given_name": "一名砍柴工",
"family_name": "Kan",
"gender": "female",
"birthdate": "0000-10-31",
"email": "Kan@nanlv.com",
"picture": "http://example.com/nanlv/me.jpg"
}
字段 | 必选 | 类型/格式 | 说明 | 示例值或备注 |
---|---|---|---|---|
标准声明 | ||||
iss | ✅ | URL | 签发者标识(OP 的 URL),RP 需验证是否与预期一致。 | "http://test.nanlv.com" |
sub | ✅ | String | 用户唯一标识(在 OP 范围内唯一)。 | "248289761231" |
aud | ✅ | String/Array | 受众(RP 的 client_id ),需验证是否匹配自身。 | "s6BhdRkqt3" 或 ["client1", "client2"] |
exp | ✅ | Unix 时间戳 | 过期时间,RP 需检查是否过期。 | 1311281970 (对应 2011-07-21 18:59:30 UTC) |
iat | ✅ | Unix 时间戳 | 签发时间,用于计算有效期。 | 1311280970 (比 exp 早 1000 秒,约 16 分钟) |
nonce | ❌ | String | 防重放攻击的随机值(需与请求中的 nonce 一致)。 | "n-0S6_WzA2Mj" |
用户信息声明 | ||||
name | ❌ | String | 用户全名。 | "KanChaiGong" |
given_name | ❌ | String | 用户名字(可能包含本地化字符)。 | "一名砍柴工" |
family_name | ❌ | String | 用户姓氏。 | "Kan" |
gender | ❌ | String | 性别(规范值:female 、male 、other )。 | "female" |
birthdate | ❌ | YYYY-MM-DD | 出生日期。 | "0000-10-31" (年份为 0000 表示隐藏) |
email | ❌ | String | 用户邮箱(需验证有效性)。 | "Kan@nanlv.com" |
picture | ❌ | URL | 用户头像 URL。 | "http://example.com/nanlv/me.jpg" |
ID Token 和 Access Token 的区别
特性 | ID Token | Access Token |
---|---|---|
用途 | 身份认证(证明用户是谁)。 | 资源访问授权(访问 API 数据)。 |
格式 | JWT(结构化,可解析)。 | 通常不透明(或 JWT)。 |
内容 | 包含用户身份声明(Claims)。 | 无固定格式,仅用于授权。 |
验证方 | RP 直接验证签名和声明。 | 资源服务器验证(通过 Introspection 或 JWKS)。 |
PS:
- ID Token 断言用户身份
- Access Token 可选择的,存储认证后的用户信息
OIDC Flow
OIDC中主要包含三个主体:
- End—User (终端用户):需要证明自己身份的自然人(例如网站或App的访问者)。
- Relay Party (RP)(依赖方):依赖OP验证用户身份的应用程序或服务(例如某电商网站),从OP上请求End—User 授权和请求。
- Openid Provider (OP)(OpenID提供商)(Oauth 2.0认证服务):负责认证用户并颁发身份令牌的服务(例如Google、Azure AD),也能够对RP响应关于授权和End—User的请求。
以下是OIDC的授权流程
- 用户(End-User)通过浏览器导航到web或web_app
- 用户点击登录并填写账号、密码
- 客户端(Relying Party,RP)向身份提供者(OpenID Provider)发送请求
- OP对用户进行身份验证并授权
- OP使用身份令牌(Identity Token)和访问令牌(Access Token),也就是两种Token
- RP对用户设备发送带有访问令牌(Access Token)的请求
- UsertInfo Endpoint (标准API端点)返回关于终端用户的说明
OIDC的三种授权方式
1.授权码模式
- 前端获取授权码
- 后端用码换令牌
- 令牌不暴露给浏览器
PS:若没有PKCE进行防御会有安全风险
2.隐式模式
- 令牌直接返回给前端(潜在安全风险)。
- 现在已很少使用
3.混合模式
-
结合授权码和隐式的优点:快速获取身份信息 + 安全交换令牌。
-
常见组合:
-
- code id_token:立即验证用户身份,再换access_token。
-
- code token:立即获取API访问权限,再换id_token。
OIDC和OAuth 2.0的对比
术语 | OIDC (OpenID Connect) | OAuth 2.0 | 功能描述 |
---|---|---|---|
用户角色 | End-User (EU) | Resource Owner | 实际拥有资源(如账户数据)的自然人。 |
客户端角色 | Relying Party (RP) | Client | 依赖身份认证/授权的应用(如网站、移动App)。 |
服务提供方角色 | OpenID Provider (OP) / Identity Provider (IDP) | Authorization Server | 负责认证用户身份(OIDC)或授权资源访问(OAuth 2.0)的服务器(如Google)。 |
核心令牌 | ID Token (JWT) | Access Token (通常不透明) | - ID Token:含用户身份信息(如sub ),用于认证。- Access Token:用于访问受保护资源。 |
用户信息端点 | /userinfo | 无直接对应 | 通过Access Token从此端点获取用户详细信息(需openid scope)。 |
认证端点 | /authorize | /authorize | 用户登录和授权的入口(触发认证流程)。 |
令牌端点 | /token | /token | 用授权码(Authorization Code)交换ID Token和Access Token。 |
主要目的 | 认证(Authentication) | 授权(Authorization) | OIDC扩展自OAuth 2.0,添加了身份认证层。 |