OpenID Connect (OIDC,下文讲解中都使用这个简称) 是基于 OAuth 2.0 授权协议构建的一种身份验证协议,为第三方应用程序提供了一种获取、验证和利用用户身份信息的方法,旨在简化和标准化用户身份验证的过程。与传统的身份验证方法相比,OIDC 提供了一种更加安全、灵活且易于集成的解决方案。在深入讲解之前,先看下身份验证和授权这两个概念。
身份验证 vs 授权
- 身份验证(Authentication):验证用户的身份,确保用户是他们声称的人。例如,用户输入用户名和密码登录系统。
- 授权(Authorization):确定用户是否有权限访问特定的资源或执行特定的操作。例如,管理员可以删除用户账户,普通用户则不能。
再简单回顾下 OAuth 2.0 的相关知识,OAuth 2.0 是一种授权协议,主要解决的是授权问题,而不是身份验证问题。通过 OAuth 2.0,用户可以授权第三方应用访问其在某个服务上的数据,而无需向该应用提供自己的凭证,例如用户名和密码。
OpenID Connect 是什么?
OpenID Connect 是一种基于 OAuth 2.0 的身份验证层,通过引入一些新的概念和组件,使客户端能够验证用户的身份并获取用户的基本信息。OpenID Connect 的核心目标是提供一种简单、安全且标准化的方式,让客户端能够确认用户的身份。
OIDC 参与方
参与方和 OAuth 2.0 是一样的,有如下几个:
- Resource Owner(资源所有者):资源的拥有者,通常是终端用户。资源可以是用户数据、照片、视频等。
- Client(客户端,还有另外一种叫法是 Relying party):请求访问受保护资源的第三方应用。客户端可以是 Web 应用、移动应用或桌面应用。
- Authorization Server(授权服务器):负责验证资源所有者的身份并颁发 ID Token 和 Access Token 给客户端的服务器。
- Resource Server(资源服务器):存储受保护资源的服务器,可以接收并响应使用 Access Token 访问的请求。很多企业和组织在实现的时候,会把 Resource Server 和 Authorization Server 做在一个服务里面。
OIDC 中的核心概念
相比 OAuth 2.0 多了一个 ID Token:
- Authorization(授权):OAuth 2.0 主要关注的是如何让一个应用获得对用户在另一个应用中的资源的访问权限。这与身份验证(Authentication,即确认你是谁的过程)不同,尽管两者经常被一起使用。
- Access Token(访问令牌):应用程序用来请求特定资源的凭证(一般是一个字符串),有效期通常会比较短,并且只能用来访问被授权的资源。
- Refresh Token(刷新令牌):当 Access Token 过期后,客户端可以使用 Refresh Token 来重新获取。Refresh Token 的有效期比 Access Token 的更长,需要被妥善保管以防止泄露。
- ID Token:一个 JWT(JSON Web Token)格式的 Token,包含用户的身份信息,如用户标识符、用户名、电子邮件地址等。
典型的 OIDC 认证流程
- 客户端向授权服务器请求授权:客户端重定向用户到授权服务器并请求授权。包括客户端标识、请求的范围(Scope)等信息。
- 用户授权:资源所有者登录并授权客户端访问其受保护资源。
- 授权服务器颁发授权码:如果资源所有者同意授权,授权服务器将重定向用户到客户端并附带一个授权码。
- 客户端通过授权码获取 ID Token 和 Access Token:客户端使用授权码向授权服务器请求 ID Token 和 Access Token,授权服务器验证授权码,并颁发ID Token 和 Access Token 给客户端,(通过云对云的 API 调用来完成)。
- 客户端验证 ID Token:客户端验证 ID Token并确认用户身份。
- 客户端使用 Access Token 访问资源服务器:客户端使用 Access Token 向资源服务器请求访问受保护资源(通过云对云的 API 调用来完成)。
OIDC 定义的其他流程将会再单独写一篇文章来进行详细讲解。
应用场景
- 单点登录(Single Sign-On, SSO),OpenID Connect 常用于实现单点登录。用户在一个应用中登录后,其他关联的应用可以使用相同的认证信息,避免用户重复输入凭证。
- 第三方应用授权,OpenID Connect 可以用于第三方应用授权,允许用户授权第三方应用访问其在某个服务上的数据,而无需提供用户名和密码。
- 用户信息获取,通过 OpenID Connect,客户端可以获取用户的详细信息,如姓名、电子邮件地址、头像等,而无需用户手动填写表单。
使用 OIDC 需要注意的安全问题
- 签名验证,客户端必须验证 ID Token 的签名,以确保未被篡改。签名算法通常使用 RSA 或 HMAC。
- 防止重放攻击,通过使用 nonce 参数,可以防止攻击者重放已获取的 ID Token。
- 安全传输,所有通信应使用 HTTPS 协议,确保数据传输的安全性。
小结
OpenID Connect 是一种基于 OAuth 2.0 的身份验证协议,通过引入 ID Token 实现了对用户身份的验证。OIDC 提供了一种简单、安全且标准化的解决方案,被广泛应用于单点登录、第三方应用授权和用户信息获取等场景。理解和应用 OpenID Connect,可以帮助开发者构建更加安全、灵活的认证系统。