我应该为PWA +服务器端应用程序使用哪种OAuth2身份验证流程

时间:2018-09-24 12:35:02

标签: security authentication oauth oauth-2.0

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

  • Fontend是仅可通过HTTPS访问的Progressiwe Web应用程序。这是在Angular单页应用程序中完成的。
  • 外部自动防盗服务器
  • 可通过REST调用访问后端

目前,我正在使用授权码授予流程。

我尝试了什么:

  • 我已经检查了official site。列出了可能的流程(授权代码,隐式,密码,客户端凭据,设备代码...), 但没有明确说明如何在它们之间进行选择。
  • 然后我在Auth0.com上找到了this excellent article。不幸的是,他们的方案中没有PWA +服务器端beckend。

能否请您告诉我哪种Oauth2流适合我的情况以及原因?

1 个答案:

答案 0 :(得分:5)

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

  • 您拥有并开发前端(Angular应用程序)和后端(服务器端REST API)。
  • 您要将身份验证外包给第三方身份提供者。
  • 您希望Angular应用(客户端)持有令牌并能够在后端(资源服务器)上进行身份验证,并使用在第三方(授权服务器/身份提供者( IdP))。

首先,是旁白。对于此用例,OpenId Connect(OIDC)更适合,因为它支持身份元素。 OAuth2的重点是授权您的应用在第3方上执行操作。您想要的是在第三方的帮助下建立用户的身份,这就是OpenId Connect的作用。

好,那是哪个流(OIDC仍基于OAuth2)。

第一个问题是客户端是否可以信任在资源服务器上执行任何操作,以及它是否可以安全地存储秘密。显然不是这种情况,客户端应用程序不受信任,并且无法保存机密。在客户端凭证流中,客户端使用机密在IdP上进行身份验证以接收资源服务器的令牌。这意味着您的Angular应用程序存储了一个密码,该密码用于获取后端令牌,而不是您想要的令牌。

当信任客户端以处理用户凭据时,将使用资源所有者密码凭据流。在您的用例中,这是不好的,因为实际上这意味着您的Angular应用程序将获得用户密码以将其转发到IdP,以换取令牌。您的客户不应访问该用户密码,该密码不受信任。

现在出现了更有趣的部分。

问题是您的客户端是否具有服务器端来安全保存机密。如果是这样,那么授权码授予就很好了,因为它允许您的用户在IdP上进行身份验证,并使用授权码重定向回去,然后服务器端可以将其交换为要在资源服务器上使用的访问令牌。但是,据我所知API 是资源服务器,在这种情况下,您的客户端没有服务器端。因此,这对您不利,因为它需要客户端密码,并且无法将其存储在Angular应用中。

这几乎使您具有隐式流程,您不需要隐式流程,但另一方面,很难执行诸如刷新令牌之类的事情。在您链接到的流程图中,最后一个问题是您的客户端是否是SPA-在您的情况下是SPA,因此默认情况下应采用隐式流程。

对于您来说,这可能是最安全的模型,因为即使在客户端受到损害的情况下,您的用户凭据仍然是安全的(Angular应用程序永远无法访问)。

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

据我了解,您同时拥有客户端和资源服务器,并且资源所有者正在使用客户端,您只想卸载身份验证,同时仍管理第三方服务中的用户。

以此方式查看,可以信任您的客户端访问用户凭据,并且使用它的用户是资源所有者。因此,您可以使用“资源所有者密码流”,其中用户将其凭据直接输入到Angular应用中,该应用转到IdP,获得令牌,而Angular只是使用它来访问API(资源服务器)上的内容。

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