Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/security/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Security 我应该为PWA和x2B使用哪种OAuth2身份验证流;服务器端应用程序_Security_Authentication_Oauth_Oauth 2.0 - Fatal编程技术网

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

Security 我应该为PWA和x2B使用哪种OAuth2身份验证流;服务器端应用程序,security,authentication,oauth,oauth-2.0,Security,Authentication,Oauth,Oauth 2.0,我正在尝试为应用程序选择正确的身份验证流: Fontend是一款只能通过HTTPS访问的渐进式Web应用程序。它是在有角度的单页应用程序中完成的 外部授权服务器 可通过REST调用访问后端 目前,我正在使用授权代码授权流 我试过什么: 我查过了。有一个可能的流列表(授权代码、隐式、密码、客户端凭据、设备代码等), 但没有明确指示如何在两者之间进行选择 然后我在Auth0.com上找到了。不幸的是,他们的方案中不存在PWA+服务器端beckend 您能告诉我什么OAuth2流程适合我的环境

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

  • Fontend是一款只能通过HTTPS访问的渐进式Web应用程序。它是在有角度的单页应用程序中完成的
  • 外部授权服务器
  • 可通过REST调用访问后端
目前,我正在使用授权代码授权流

我试过什么:

  • 我查过了。有一个可能的流列表(授权代码、隐式、密码、客户端凭据、设备代码等), 但没有明确指示如何在两者之间进行选择
  • 然后我在Auth0.com上找到了。不幸的是,他们的方案中不存在PWA+服务器端beckend
您能告诉我什么OAuth2流程适合我的环境吗?为什么?假设(我理解问题的方式):

  • 您拥有并开发前端(Angular应用程序)和后端(服务器端REST API)
  • 您希望将身份验证外包给第三方身份提供商
  • 您希望Angular应用程序(客户端)持有令牌,并能够在后端(资源服务器)上进行身份验证,并在第三方(授权服务器/身份提供商(IdP))上建立您的用户(资源所有者)的身份
首先,是一个旁道。对于这个用例,OpenIDConnect(OIDC)更适合,因为它支持identity元素。OAuth2中的要点是授权您的应用程序在第三方上进行操作。您需要的是在第三方的帮助下建立用户的身份,而OpenId Connect就是这样做的

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

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

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

现在是更有趣的部分

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

这就给您留下了隐式流,对于隐式流,您不需要客户端机密,但另一方面,很难执行刷新令牌之类的操作。在您链接到的流程图中,最后一个问题是您的客户是否是SPA,在您的情况下,它是SPA,因此默认情况下,您应该选择隐式流程

这可能是对你来说最安全的模式,因为即使你的客户端遭到破坏,你的用户凭证仍然是安全的(Angular应用程序永远无法访问)

但是,您可以对整个过程进行不同的建模,这将简化它

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

从这个角度来看,您的客户机被信任可以访问用户凭据,而使用它的用户就是资源所有者。因此,您可以使用资源所有者密码流,用户直接将其凭证输入Angular应用程序,该应用程序进入IdP,获取令牌,Angular仅使用该令牌访问API(资源服务器)上的内容


与隐式流相比的风险是,如果Angular应用程序被破坏,用户凭据将被泄露给攻击者。你是否愿意接受这种风险完全取决于你自己。请注意,如果IdP是一项知名服务(例如社交网站),这显然不起作用,因为作为您的用户,我不想为您的应用程序提供我的社交网站密码。但是,只要您管理用户,信任客户机是可以接受的。

“问题是您的客户机是否有一个服务器端来安全地保存秘密”。什么是“服务器端”?当你有一个API,你也可以让它存储在服务器上的秘密,或不?因此,我并不完全明白其中的区别…@musicformellons好吧,这是一个很好的观点,当我写上面的答案时,我认为这个客户端和API是两个独立的东西。如果两者之间没有太多的耦合,那么以这种方式耦合它们并让API为客户端保守秘密可能是没有意义的。如果它们是非常耦合的(它是“一个应用程序”,前端代码在SPA中,后端代码在API中),那么您可能会认为它实际上是有意义的,是的。谢谢你指出这一点!