OAuth 设计用于应用程序 X 需要访问由应用程序 Y 控制并属于用户 A 的资源(例如,“我的照片”或“我的电子邮件地址”或“我的日历”)的情况——用户 A 可能希望授予对这些资源的访问权限应用程序 Y 上的资源,但他不想向应用程序 X 提供他的实际用户名/密码凭据。因此,访问令牌用作应用程序 Y 上资源的替代凭证。访问令牌可以独立于用户名/密码凭证而被撤销,并且理想情况下,其范围很窄,只允许访问特定资源。
使用 OAuth 2 进行身份验证会以可能存在风险的方式重载该模型。查看上面的示例,并想象它被用于身份验证。如果应用程序 X 使用该访问令牌进行身份验证,那么它会获取一个授予对应用程序 Y 上资源的访问权限的令牌,并使用它来授予对自己资源的访问权限。也许这有点让人费解,因为重要的是我们知道通过 OAuth 2 授予访问令牌的行为意味着用户已成功通过身份验证。问题是访问令牌没有说明最终用户验证了哪个应用程序. 那么,如果应用程序 Z 也有用户 A 在应用程序 Y 上的资源的访问令牌,会发生什么情况呢?如果应用程序 Z 可以让应用程序 X 使用此访问令牌,则它可以访问用户 A在应用程序 X 上的资源。那很糟。用户 A 可能信任应用程序 Z 访问他在应用程序 Y 上的资源,但用户 A 肯定从未同意应用程序 Z 访问他在应用程序 X 上的资源。
OpenID 和 OpenID Connect 专为身份验证而设计。OpenID Connect 构建在 OAuth 2 之上,因此它可以利用现有的交互和流程,但它添加了一个称为 ID 令牌的实体,它是一个包含一组关于身份验证事件的声明的对象。这些声明包括执行身份验证的用户的标识符、处理身份验证的服务器的标识符以及身份验证的受众的标识符。这为应用程序提供了验证用户是否代表其进行身份验证所需的信息。