# OIDC OpenID Connect(OIDC)是一个基于OAuth 2.0协议的身份认证协议,它允许客户端应用程序通过第三方身份提供者(Identity Provider, IdP)验证用户身份并获取用户的基本信息。OpenID Connect建立在OAuth 2.0的授权框架之上,但它专注于身份认证,而OAuth 2.0主要用于授权。 ## OpenID Connect的核心概念 1. **身份提供者(Identity Provider, IdP)**:负责验证用户身份的服务。常见的IdP有Google、Facebook、GitHub等。 2. **客户端(Client)**:想要验证用户身份的应用程序,通常是Web应用、移动应用或桌面应用。 3. **授权服务器(Authorization Server)**:通常与身份提供者相同,负责验证用户身份、颁发令牌(Token)等。 4. **资源所有者(Resource Owner)**:通常是应用程序的用户,身份验证过程的参与者。 5. **令牌(Token)**: - **ID Token**:身份令牌,包含用户身份信息,客户端通过它来确认用户的身份。它是JWT(JSON Web Token)格式。 - **Access Token**:授权令牌,用于访问受保护资源(通常是API)。虽然它可以携带用户信息,但它的主要作用是授权。 - **Refresh Token**:刷新令牌,用于获取新的Access Token和ID Token。 6. **端点(Endpoints)**: - **Authorization Endpoint**:用于启动认证过程,用户通过该端点进行登录。 - **Token Endpoint**:用于获取Access Token、ID Token和Refresh Token。 - **UserInfo Endpoint**:用于获取用户的基本信息。 ## OpenID Connect的认证流程 1. **用户访问客户端应用**: - 用户访问客户端应用程序,它会重定向用户到身份提供者的授权端点(Authorization Endpoint)。 2. **用户登录**: - 用户在身份提供者的页面上输入用户名和密码进行登录。 3. **授权码交换**: - 身份提供者验证用户身份后,将用户重定向回客户端,并在URL中附加一个授权码(Authorization Code)。 - 客户端应用使用这个授权码向身份提供者的令牌端点(Token Endpoint)发送请求,以获取Access Token和ID Token。 4. **获取令牌**: - 客户端从令牌端点获取Access Token、ID Token和可能的Refresh Token。 - ID Token是JWT格式的,它包含了用户的身份信息(如用户名、电子邮件等)。 5. **访问用户信息**: - 客户端可以通过UserInfo Endpoint使用Access Token来获取用户的更多信息。 6. **刷新令牌**(可选): - 如果Access Token过期,客户端可以使用Refresh Token来请求新的Access Token和ID Token。 ## OpenID Connect的安全性 - **JWT**:OpenID Connect使用JWT格式的ID Token,这是一种自包含的令牌格式,它通过数字签名确保数据的完整性和来源的可靠性。 - **PKCE(Proof Key for Code Exchange)**:为了防止授权码拦截攻击,OpenID Connect使用PKCE。它要求客户端在发送授权请求时生成一个“code verifier”,并将其与“code challenge”一起发送到授权服务器。授权服务器在授权码交换时验证该代码,确保请求来自合法客户端。 - **Scopes**:OIDC通过使用“scope”参数来指定客户端希望请求的权限。例如,`openid`是一个基本的scope,用于指示这是一个身份验证请求,而`profile`和`email`则表示客户端希望访问用户的个人资料和电子邮件信息。 ## OpenID Connect与OAuth 2.0的关系 OpenID Connect是OAuth 2.0的扩展,OAuth 2.0主要解决授权问题,而OpenID Connect在此基础上加入了身份认证的功能。OAuth 2.0提供了一个框架来获取令牌,而OpenID Connect则定义了如何用这些令牌来认证用户身份。 总结来说,OpenID Connect为Web应用和移动应用提供了一种安全的方式来认证用户身份,同时也通过JWT等机制确保数据的安全性和可靠性。