以下情况:
您已将敏感且受保护的用户信息(名称,邮件地址,电话号码,地址)安全地保存在授权服务器(例如IdentityServer4)中。
您有一个API从另一个存储您自己的数据(而不是敏感用户数据)的数据库中加载数据。该数据以某种方式链接到用户(假设我们存储文档,而文档A属于具有auth-id“ XYZ”的用户)。
问题:
现在,单页应用程序将获取文档列表,并希望显示拥有该文档的用户的姓名和电子邮件地址。
到目前为止,我了解OpenID Connect UserInfo端点仅返回当前登录用户的用户信息,而不返回其他用户的用户信息。因此,需要获取其他地方其他用户的信息。
解决方案1:将用户信息复制到第二个数据库中。这会将敏感数据泄漏到安全的授权化服务器之外,从而需要保持数据同步(如果在auth服务器上进行了更改),从而将auth服务器连接到第二个数据库,或者将auth服务器连接到API端点。
解决方案2:让API访问身份验证数据库并从那里获取数据。可能,但是将DB连接引入到授权DB是什么(我个人认为不好)。
解决方案3:在授权服务器上引入一个端点(如UserInfo端点),该端点允许单页应用程序通过auth id请求用户信息。似乎最可行,但似乎未指定?
是否有官方指定/推荐的方式来解决此问题?也许有一个规范可以使用UserInfo终结点来完成我迄今为止错过的工作?
只需my.domain.com/userinfo/XYZ即可返回具有auth-id XYZ的用户的信息?
答案 0 :(得分:1)
以下内容摘自OpenID Connect规范的user info endpoint section,
UserInfo端点是受OAuth 2.0保护的资源,它返回有关经过身份验证的最终用户的声明。
正如突出显示的部分所述,它公开了有关原始身份验证用户的信息。除非您具有为其他用户认证的OAuth 2.0访问令牌,否则无法获取有关其他用户的信息。
此外,不建议将端点嵌入授权服务器。它带来了维护负担以及隐私问题。另外,这将防止您更改授权服务器(例如:-您出售此应用程序且该客户使用Azure AD)。因此,请勿执行此类非标准方式。
建议的解决方案是在用户创建此文档时获取用户名和电子邮件。在创建时,我相信应用程序已经对内容创建用户进行了身份验证的访问令牌。因此,您可以从用户信息端点获取声明,并将其与文档一起存储。当其他用户获得文档时,您可以显示用户名和电子邮件(可选)。可能是您从不泄露电子邮件,而是可以向所有者发送邮件,该邮件将在后端处理。