gpt4 book ai didi

oauth-2.0 - 如何在微服务架构中使用 3rd 方 IDP 实现 OpenID Connect 身份验证

转载 作者:行者123 更新时间:2023-12-03 08:15:58 25 4
gpt4 key购买 nike

在过去的 10 多天里,我阅读了所有我能找到的关于理解 OAuth2 和 OpenID Connect 的内容,结果发现很多人对实现持不同意见,这让我很困惑。

据我了解,我发现的所有文章和示例都假设您希望访问例如。谷歌日历、个人资料信息或电子邮件,如果你例如。使用谷歌登录,但我不需要访问除我自己的 API 之外的其他 API - 我只想使用谷歌、Facebook 等登录,并获得一个可以链接到我自己数据库中的用户的 ID - 仅此而已.

我将尝试说明我的用例并将其用作示例。

enter image description here

图表上的一个注释:身份验证服务可能会内置到 API 网关中——我对这个例子并不重要,因为这不是关于“在哪里做”,而是“如何以最好的方式去做”,对于像我这样的架构,它用于我自己的 API/微服务,而不是访问 Google、Facebook 等外部 API

如果你能理解我想用上面这张图来说明什么,请告诉我我是否误解了这一点。

您在此处看到的此架构的最基本要求是:

  • 用户可以通过谷歌、 Facebook 等方式登录
  • 所有微服务将使用同一个登录
  • OpenId 用户将在数据库中拥有一个链接帐户
  • 用户访问在我自己的数据库中定义,基于组、角色和权限

  • 我不打算在用户通过身份验证并登录后使用外部 API。不需要访问用户日历、电子邮件等。所以我真的只需要身份验证部分而不是其他任何东西(成功登录的证明)。所有用户访问都在我自己的数据库中定义。

    因此,我想到了一些基本问题。
  • 首先,OpenID Connect 是否是仅用于身份验证工作的正确工具(我将没有使用授权,因为除了从身份验证中获取 ID 之外,我不需要对 google/facebook API 的读/写访问权限)?
  • 人们通常不同意是使用 ID 还是访问 token 来访问您自己的 API。据我了解,ID token 仅用于客户端(用户代理),而访问 token 用于例如。访问谷歌日历、电子邮件等...... OpenID Provider 的外部 API ......但由于我只会访问我自己的 API,我是否需要访问 token 或 ID token - 保护的正确方法是什么你自己的API?

  • 如果 ID token 真的只用于客户端,那么它可以显示例如。当前登录的用户,没有去数据库,我有 0 使用它,因为我可能会从数据库查询用户并将其存储在 redux 中以用于我的 react 前端应用程序。

    困境:是否在 JWT 中存储用户详细信息、组、角色和权限以进行 API 授权?
  • 通过仅在 token 中存储用户标识符,这意味着我始终允许具有有效 token 的经过身份验证的用户在授权之前调用端点,然后首先根据 db 查询结果和我自己数据库中的权限确定访问权限。
  • 通过在 JWT 中存储更多关于用户的数据,这意味着在某些情况下,我可以在访问 API 之前进行授权/访问(组、角色、权限)检查——只有用户信息、组、角色和权限存储在登录时发出的 JWT 中。在某些情况下,由于例如,这是不可能的。 CMS 内容访问权限在每个节点级别。但这仍然意味着更好的性能。

  • 正如您在图中看到的,我通过网关发送所有 API 请求,网关将(本身或通过身份验证服务)将不透明的访问 token 转换为带有标识符的 JWT,因此我可以在图中识别用户数据库 - 然后验证用户是否具有所需的组、角色和权限 - 不是来自外部 API,而是来自我自己的数据库,就像您在图表中看到的那样。

    这似乎对每个请求都有很多工作,即使服务可以共享 JWT,以防多个服务需要相互调用。

    始终查找用户及其在 db 中的权限的优势在于,当用户访问级别发生变化时,他会立即被拒绝/授予访问权限,并且始终保持同步。如果我将用户详细信息、组、角色和权限存储在 JWT 中并将其保存在客户端本地存储中,我想这可能会造成安全问题,并且更新用户信息、组、角色和权限将非常困难在那个 JWT 里面?

    在 JWT 中存储用户访问级别和信息的一大优势当然是,在许多情况下,我可以阻止用户调用某些 API,而不必在查找数据库后确定访问权限。

    所以整个 token 转换意味着以性能为代价增加安全性,但通常被推荐并且值得吗?或者在 JWT 中存储用户信息和组、角色、权限是否足够安全?

    如果是,我是否将我自己的数据库中的所有信息存储在 ID token 、访问 token 或第三个 token 中 - 将什么 token 发送到 API 并根据用户的权限确定是否应授予用户访问给定资源的权限数据库?如果我不需要与 ID 提供者 API 交互,我真的需要访问 token 吗?或者我是否在 OpenID 连接发布的 ID token (对我来说似乎不干净)中存储和附加我的​​所有组、角色、权限,并调用 API 并使用它授权我自己的 API 端点,即使有人说你永远不应该使用 ID token 来访问 API?或者我是否创建一个新的 JWT 来存储从我的数据库中获取的所有信息,用于决定用户是否可以访问给定的资源/API 端点?

    请不要只链接到一般规范或一般信息,因为我已经阅读了所有内容 - 我只是不明白如何将所有这些信息应用于我的实际用例(上图)。请尽量做到具体。

    再次尝试尝试简化流程:

    enter image description here

    最佳答案

    以下答案仅适用于具有 3rd 方 IDP(如 Google)的 OpenID Connect 身份验证流程。 它不适用于您托管自己的 IDP 的架构。

    (有一些 API 网关(例如 Tyk 或 Kong)支持开箱即用的 OpenID Connect。)

    您可以使用 JWT(ID token )来保护您的 API .然而,这有一个缺点。 JWT 不能轻易撤销。

    我不会推荐这个。 相反,您应该实现一个 OAuth2 授权服务器,它为您的 API 颁发访问 token 。 (在这种情况下,您有两个 OAuth2 流。一个用于身份验证,一个用于授权。来自 IDP 的 ID 和访问 token 仅用于身份验证。)

    下图显示了一个设置,其中 API 网关和身份验证/授权服务器是两个独立的服务。 (如上所述,认证/授权也可以通过API网关来完成。)

    身份验证流程(授权代码授予)调用标记为蓝色。授权流(隐式授权)调用被标记为绿色。

    OpenID Connect Authentication Flow

    1:您的网络应用程序是从应用程序服务器加载的。

    2a:用户单击您的登录按钮,您的 Web 应用程序构建授权 URL 并打开它。 (见:Authorization Request)

    2b:因为用户没有通过身份验证并且没有与您的授权服务器的有效 session ,他想要访问的 URL 被存储,您的授权服务器响应重定向到其登录页面。

    3:登录页面从您的授权服务器加载。

    4a:用户点击“Login with ...”。

    4b:您的授权服务器构建 IDP 授权 URL 并响应重定向到它。 (见:Authentication Request)

    5a:IDP授权URL打开。

    5b:因为用户没有通过身份验证并且没有与 IDP 的有效 session ,他想要访问的 URL 被存储,IDP 响应重定向到其登录页面。

    6:登录页面从IDP加载。

    7a:用户填写其凭据并单击登录按钮。

    7b:IDP 检查凭据,创建一个新 session 并重定向到存储的 URL 进行响应。

    8a:再次打开IDP授权URL。

    (为简单起见,此处忽略了批准步骤。)

    8b:IDP 创建一个授权并响应重定向到您的授权服务器的回调 URL。 (见:Authentication Response)

    9a:回调网址打开。

    9b:您的授权服务器从回调 URL 中提取授权码。

    10a:您的授权服务器调用 IDP 的 token 端点,获取 ID 和访问 token 并验证 ID token 中的数据。 (见:Token Request)

    (10b:如果某些需要的声明在 ID token 中不可用,您的授权服务器将调用 IDP 的用户信息端点。)

    11a/b:您的授权服务器在您的服务/数据库中查询/创建用户,创建一个新 session 并响应重定向到存储的 URL。

    12a:再次打开授权网址。

    (为简单起见,此处忽略了批准步骤。)

    12b/+13a/b:您的授权服务器创建/获取授权(创建访问 token )并响应重定向到您的 Web 应用程序的回调 URL。 (见:Access Token Response)

    14a:回调URL打开。

    14b:您的 Web 应用程序从回调 URL 中提取访问 token 。

    15:您的网络应用程序进行 API 调用。

    2018 年 17 月 16 日:API 网关检查访问 token ,将访问 token 与 JWT(包含用户信息等)交换并转发调用。

    授权服务器调用 API 网关的设置也是可能的。 在这种情况下,授权完成后,授权服务器将访问 token 和 JWT 传递给 API 网关。然而,在这里,每次用户信息更改时,授权服务器都必须“通知”API 网关。

    关于oauth-2.0 - 如何在微服务架构中使用 3rd 方 IDP 实现 OpenID Connect 身份验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51227737/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com