OpenID提供程序如何验证最终用户?

时间:2019-11-20 08:38:09

标签: oauth-2.0 openid-connect openid-provider

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

3.1.2.3规范的OpenID Connect 1.0部分介绍了验证最终用户的过程。但是,它明确指出

  

授权服务器用于验证最终用户的方法(例如,用户名和密码,会话cookie等)不在本规范的范围内。

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

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

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

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

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

假设我要编写自己的OpenId Connect实现。您会给我什么建议来验证最终用户?

我试图遍历node-oidc-provider库的代码库,但是该库不对用户进行身份验证,因此跳过了这一部分。如果有人可以提供任何指示,那将有很大的帮助。最佳做法应该是什么?其他OpenID提供程序正在使用什么方法?

1 个答案:

答案 0 :(得分:1)

正如您从有用的图像中看到的那样,有关OpenId/OAuth 2.0 architecture from article by Takahiko Kawasaki @ Medium的文章

Oid/oauth2.0 auth

有一个原因明确表明认证机制超出了范围,因为认证及其要求是通过完全独立的方式实现的。可以完全通过您选择的任何一种身份验证机制来完成,唯一的要求是身份验证对OpenID / OAuth请求实施正确的响应。

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

早在OpenID早期,LiveJournal等网站就首次允许任意OpenID提供程序进行身份验证,为了测试这一想法,我在自己的业余Web服务器上制作了一个模拟的OpenID页面,该页面仅具有足够的OpenID支持以对单个ID进行身份验证。用户使用我在那里手动指定的密码。一切正常,但可能是一个极端的例子。如今,使用Google OpenID Connect或类似工具进行集中式个人资料管理变得更加容易。

将授权信息存储在何处的问题还是很模糊的,但是一般来说,将其存储在使用的身份验证机制附近是有意义的,因为您正在使用此身份验证机制进行授权,因此保持跟踪是有意义的您使用此特定身份验证授权的内容。

请注意,OAuth允许经过身份验证的用户坐在驾驶员席上,公共Web应用程序通常是这种情况。

在使用非公共资源的情况下,经常会出现这样的情况:资源持有者只会订阅OpenID或其他联合身份提供,但自己会根据用户来自何处以及自己来决定用户可以访问哪些资源。 /或他在特定身份计划中的身份。

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