gpt4 book ai didi

security - 我应该将哪个 OAuth2 身份验证流程用于 PWA + 服务器端应用程序

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

我正在尝试为应用程序选择正确的身份验证流程:

  • Fontend 是一个只能通过 HTTPS 访问的渐进式 Web 应用程序。它是在 Angular 单页应用程序中完成的。
  • 外部授权服务器
  • 可通过 REST 调用访问后端

  • 现在我正在使用授权代码授予流程。

    我试过什么:
  • 我查过 official site .有一个可能的流程列表(授权代码、隐式、密码、客户端凭据、设备代码等),
    但没有明确的指示如何在它们之间进行选择。
  • 然后我找到了this excellent article在 Auth0.com 上。不幸的是,他们的方案中不存在 PWA + 服务器端 beckend。

  • 你能告诉我什么 OAuth2 流程适合我的上下文吗?为什么?

    最佳答案

    假设(我理解问题的方式):

  • 您拥有并开发前端(Angular 应用程序)和后端(服务器端 REST API)。
  • 您想将身份验证外包给第 3 方身份提供商。
  • 您希望 Angular 应用程序(客户端)持有 token 并能够在后端(资源服务器)上进行身份验证,并在第 3 方(授权服务器/身份提供者(IdP))上建立您的用户(资源所有者)的身份.

  • 第一,侧切。对于这个用例,OpenId Connect (OIDC) 会更合适,因为它支持身份元素。 OAuth2 的重点是授权您的应用程序在第 3 方执行某些操作。您想要的是在第 3 方的帮助下建立您的用户的身份,这就是 OpenId Connect 所做的。

    好的,那么哪个流程(OIDC 仍然基于 OAuth2)。

    第一个问题是客户端是否被信任可以在资源服务器上做任何事情,以及它是否可以安全地存储 secret 。显然情况并非如此,客户端应用程序不受信任,也无法保密。在客户端凭据流中,客户端使用 secret 在 IdP 上进行身份验证以接收资源服务器的 token 。这意味着您的 Angular 应用程序存储了一个密码,用于为您的后端获取 token ,这显然不是您想要的。

    当客户端被信任来处理用户凭证时,使用资源所有者密码凭证流。在您的用例中,这并不好,因为实际上这意味着您的 Angular 应用程序将获取用户密码以将其转发给 IdP 以换取 token 。您的客户不应访问用户密码,因为它不受信任。

    现在是更有趣的部分。

    问题是您的客户端是否有服务器端来安全地保存 secret 。如果是,则授权代码授予很好,因为它允许您的用户在 IdP 上进行身份验证,使用授权代码重定向回来,然后服务器端可以将其交换为要在资源服务器上使用的访问 token 。但是,你这个场景下的Client没有服务器端,据我了解API就是资源服务器。所以这对你不利,因为它需要一个客户端 secret ,而你不能将它存储在你的 Angular 应用程序中。

    这几乎为您留下了隐式流程,您不需要客户端 secret ,但另一方面,很难执行刷新 token 之类的操作。在您链接到的流程图中,最后一个问题是您的客户是否是 SPA - 在您的情况下是,因此默认情况下您应该选择隐式流程。

    这对您来说可能是最安全的模型,因为即使您的客户端遭到入侵,您的用户凭据仍然是安全的(Angular 应用程序永远无法访问)。

    但是,您可以对整个事物进行不同的建模,这会大大简化它。

    据我所知,您同时拥有客户端和资源服务器,而资源所有者正在使用客户端,您只想在仍然管理 3rd 方服务中的用户的同时卸载身份验证。

    从这个角度来看,您的客户端被信任可以访问用户凭据,而使用它的用户就是资源所有者。因此,您可以使用资源所有者密码流,用户将其凭据直接输入到 Angular 应用程序中,然后转到 IdP,获取 token ,Angular 只需使用它来访问 API(资源服务器)上的内容。

    与隐式流相比的风险在于,如果 Angular 应用程序受到威胁,用户凭据将被披露给攻击者。您是否愿意接受这种风险完全取决于您。请注意,如果 IdP 是众所周知的服务(例如社交网站),这显然不起作用,因为作为您的用户,我不想将我的社交网站密码提供给您的应用程序。但只要你无论如何管理用户,信任客户端是可以接受的。

    关于security - 我应该将哪个 OAuth2 身份验证流程用于 PWA + 服务器端应用程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52479555/

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