我正在尝试向我的 REST API 添加一些需要跨用户交互的业务逻辑。我们已经分离了我们的资源服务器和认证服务器。
如果在资源服务器 的同一“组”中,通过例如搜索其他用户的姓名、电子邮件++ 进行跨用户交互的正确方法是什么。到目前为止,这是有问题的,因为没有用户信息(或应该?)存储在资源服务器中。仅由 OpenID Connect 提供商提供的标识符。
现在通过 userinfo
端点获取经过身份验证的(我自己的)用户信息当然没有问题了。但是,关于其他用户(不是我)没有什么可告诉我的。此外,我认为在身份验证服务器上创建一个“通过 id 获取 userinfo
”端点是不明智的。
处理此类问题的最佳方法是什么?是否为此制定了一套最佳实践规则?我真的需要将每个用户的信息保存两次吗?一次在身份验证服务器,一次在资源服务器?如果是这样,那么同步这两个用户模型的正确方法是什么,因为除了唯一标识符之外它们是完全分离的。
最佳答案
有两种情况。
资源服务器和授权服务器都连接到一个包含所有用户信息的数据源。
资源服务器和授权服务器连接到两个不同的数据源,连接到授权服务器的数据源包含用户信息。
使用哪种情况取决于您的应用要求。但是对于这两种情况,跨用户交互的场景将有所不同。
正如您所提到的,它清楚地表明您的应用在某种程度上有查看其他用户信息的需求(就像我们在 facebook 上看到的那样)。
如果您选择案例 1:您可以向已登录用户公开所有用户信息(当然,您将向已登录用户公开用户配置文件,而不是帐户信息)并且登录用户只需要他/她自己的凭据即可登录和查看其他用户(就像在图书馆管理系统中查看书籍一样)
另一方面
如果您选择案例 2:您可以使用另一个(比如 user rest API)rest API 连接到包含您的用户的数据源它会将用户暴露给您的资源服务器。此 API 将受到您的授权服务器的保护。
然后您的资源服务器也将通过client_credential 流程成为您的授权服务器的客户端。 user rest API 只会将用户暴露给您的资源服务器,资源服务器之外的任何人都无法从user rest API 获取用户。
您的资源服务器将为您的用户休息 API 获取访问 token ,并使用该访问 token 获取所需的用户信息。您的用户 rest API 会将所有用户端点公开给您的资源服务器(例如“/AllUsers”、“/SearchUser”等)。
我的建议:
如果您没有任何特定要求将Resource Server 和Authorization Server 的数据库分开,我建议您使用案例1。这就是方法我想采用一种非常简单直接的方法。
但是,如果您有一些特定的要求将Resource Server 和Authorization Server 的数据库分开,那么在情况 2 中有适合您的解决方案。
关于openid-connect - 解耦资源和身份验证服务器中的跨用户交互,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49340807/