一、OIDC概述
OpenID Connect(OIDC)是一个基于OAuth 2.0协议的身份认证协议,它允许开发者验证跨网站和应用的用户身份,而无需拥有和管理密码文件。OIDC使用简单的REST/JSON消息流来实现,并且可以轻松集成。它允许所有类型的客户端,包括基于浏览器的JavaScript和本机移动应用程序,启动登录流程并接收对登录用户身份的可验证断言。OIDC是在OAuth2的基础上做了一个身份认证层,在客户端获取access_token的同时一并提供了一个用户的身份认证信息Id Token,广泛用于微服务、开放平台、SSO、三方登录授权等场景。OIDC的核心是OAuth 2.0协议的扩展,它不仅关注授权,即允许应用程序访问用户在其他服务上的资源,更强调身份验证。OIDC引入了id_token的概念,这是一种包含用户身份信息的JWT(JSON Web Token),使得应用可以确定访问者的身份。
二、OIDC的组件
- 身份提供商(Identity Provider, IdP):负责验证用户的身份,并颁发身份令牌的实体。
- 第三方应用(Relying Party, RP):需要验证用户身份的应用或服务。
- 用户代理(User Agent, UA):用户的浏览器或其他客户端软件,用于与 IdP 和 RP 交互。
- 授权码(Authorization Code):在 OAuth 2.0 流程中,IdP 向 RP 发送的一个临时代码,RP 使用该代码交换访问令牌。
- ID令牌(ID Token):OIDC 特有的概念,是一个 JWT(JSON Web Token),包含了用户的基本信息,用于直接验证用户身份。
三、OIDC的步骤流程
-
初始化认证请求:
- 用户请求访问依赖方(Relying Party,RP)的受保护资源。
- RP识别出用户未认证或未授权,然后将用户重定向到身份提供商(Identity Provider,IdP)的认证端点。
-
用户认证:
- 用户到达IdP后,IdP会要求用户进行身份验证,这可能包括输入用户名和密码、手机验证码或其他多因素认证方式。
-
授权:
- 用户通过身份验证后,IdP会展示授权页面,请求用户授权RP访问其资源或个人信息。
- 用户同意授权后,IdP会发放一个授权码(Authorization Code)给RP。
-
授权码交换:
- RP使用上一步获得的授权码,向IdP的令牌端点(Token Endpoint)请求令牌。
- RP需要提供自己的客户端标识(client_id)和客户端密钥(client_secret)以及之前用于重定向的URI(redirect_uri)。
-
发放令牌:
- IdP验证授权码和RP的凭据后,会发放一个访问令牌(Access Token)和一个ID令牌(ID Token)给RP。
- ID Token是一个JWT,包含了用户的身份信息和一些标准声明(Claims)。
-
验证ID令牌:
- RP接收到ID Token后,会对其进行验证,确保其有效性(例如检查签名、过期时间等)。
-
访问资源:
- RP使用Access Token请求用户信息或其他受保护的资源。
- 如果需要,RP还可以使用Refresh Token来获取新的Access Token,当原Access Token过期时。
-
获取用户信息(可选):
- RP可以使用Access Token调用IdP的用户信息端点(UserInfo Endpoint),以获取更完整的用户信息。
ID Token是OIDC的核心,它是一个JWT,包含了用户的基本信息,用于直接验证用户身份。ID Token中包含的Claims(声明)是关于用户的信息和其他元数据。OIDC规范定义了一组标准的权利要求,这组标准声明包括姓名、电子邮件、性别、出生日期等。
OIDC的优势在于其安全性、便捷性、标准化和扩展性。它通过HTTPS传输数据,使用JWT进行加密,确保了通信的安全性。用户只需在一个地方(IdP)登录,即可访问多个应用或服务,提高了用户体验。作为开放标准,OIDC兼容多种平台和服务,便于开发者集成和维护。此外,OIDC支持额外的认证信息和声明,满足不同场景下的需求。
OIDC适用于多种场景,包括企业应用的单点登录(SSO)、社交媒体登录、云服务与API访问以及物联网与移动应用中的安全用户认证