OpenID 提供商如何对最终用户进行身份验证?

How does an OpenID Provider authenticates an end-user?

OpenID Connect 1.0 使客户端能够根据授权服务器执行的身份验证来验证最终用户的身份,并提供声明以换取访问令牌。访问令牌提供给 /user_info/me 端点以获取 return 中请求的声明。

3.1.2.3 of OpenID Connect 1.0 规范部分解释了对最终用户进行身份验证的过程。但是,它明确指出

The methods used by the Authorization Server to Authenticate the End-User (e.g. username and password, session cookies, etc.) are beyond the scope of this specification.

这些方法的实现正是我的疑问。另外,OAuth2.0 规范也没有提供任何关于实现的信息。

我的疑问是我们如何验证最终用户的身份?我能想到的可能情况是:

  1. 我们在授权服务器上保留一些用户数据,例如其个人资料信息、用户名、密码以及资源服务器上的其他用户相关信息。
  2. 我们将所有内容都保存在资源服务器上,并通过将 POST 请求连同用户凭据发送到资源服务器上的内部休息 API 来验证用户凭据。
  3. 授权和资源服务器共享同一个数据库实例,因此没有 API 个调用。

我知道一个 OpenID 提供者的实现会与其他提供者不同,但我想知道这些是否是任何 OpenID 提供者都遵循的方法?

在某些情况下,授权服务器和资源服务器可以相同,在这种情况下共享数据库实例将变得容易。但是如果服务器是两台不同的机器会发生什么。

假设我正在尝试编写自己的 OpenId Connect 实现。你会给我什么建议来验证最终用户?

我试图浏览 node-oidc-provider 库的代码库,但该库不对用户进行身份验证并跳过该部分。如果有人能就此提供任何指示,那将很有帮助。最佳做法应该是什么?其他 OpenID 提供商使用的是什么方法?

正如您从有用的图像中看到的那样,来自文章中关于 OpenId/OAuth 2.0 架构的文章 川崎贵彦@Medium

身份验证机制被明确声明超出范围是有原因的,因为身份验证及其要求是通过完全独立的方式实现的。它可以通过您选择的任何类型的身份验证机制来完成,唯一的要求是身份验证能够对 OpenID/OAuth 请求做出正确的响应。

假设您想让一个页面根据您的 Active Directory 进行身份验证。您所要做的就是使用适当的 OAuth 和 OpenID 插件(假设有这样的插件)扩展现有的 Active Directory 系统,配置它们,在这些协议可用于身份验证和授权之后,您可以将您的 AD 指定为 OpenID/OAuth 提供商给准备接受它们的人。

在早期的 OpenID 时代,LiveJournal 等网站第一次允许任意 OpenID 提供者进行身份验证,为了测试这个想法,我在我的爱好网络服务器上制作了一个模拟 OpenID 页面,它有足够的 OpenID 支持来进行身份验证单个用户反对我在那里手动指定的密码。工作正常,但可能是一个非常极端的例子。现在使用 Google OpenID connect 或类似工具更容易集中配置文件管理。

在何处存储授权信息的问题再次变得模糊不清,但通常将其存储在所使用的身份验证机制附近的某处是有意义的,因为您正在使用此身份验证机制来授予授权,因此您跟踪您使用此特定身份验证授权的内容。

请注意,OAuth 让经过身份验证的用户处于主导地位,这通常是 public 网络应用程序的情况。

在非public资源的情况下,资源持有者可能只订阅 OpenID 或其他联合身份提供,但他们自己决定用户可以访问哪些资源,基于关于他来自哪里 and/or 他在特定身份方案中是谁。

一个例子是大学 A 的图书馆系统,它可能允许大学 B 的学生基于 B 的联合身份验证服务器登录,但不授予他们对 A 图书馆的相同权利,因为大学 A 对自己的学生进行身份验证认证系统。