我正在尝试为应用程序选择正确的身份验证流程:
目前,我正在使用授权码授予流程。
我尝试了什么:
能否请您告诉我哪种Oauth2流适合我的情况以及原因?
答案 0 :(得分:5)
假设(我理解问题的方式)
首先,是旁白。对于此用例,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是众所周知的服务(例如,例如社交网站),则这显然不起作用,因为作为您的用户,我不想将我的社交网站密码提供给您的应用程序。但是,无论如何,只要您管理用户,就可以信任客户端。