Mak*_*das 4 security authentication oauth oauth-2.0
我正在尝试为应用程序选择正确的身份验证流程:
目前,我正在使用授权码授予流程。
我尝试了什么:
您能否告诉我什么Oauth2流适合我的情况,为什么?
假设(我理解问题的方式):
首先是旁白。对于此用例,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是众所周知的服务(例如,例如社交网站),这显然将不起作用,因为作为您的用户,我不想将我的社交网站密码提供给您的应用。但是,无论如何,只要您管理用户,就可以信任客户端。
| 归档时间: |
|
| 查看次数: |
773 次 |
| 最近记录: |