IM_*_*_AG 7 authentication api oauth oauth-2.0 single-page-application
好吧,我花了几天时间寻找一个合适的解决方案,以便在使用SPA时如何正确地验证用户身份.
目标:我需要通过提供用户名和密码来获取access_token.
我查看了OAuth2 Implicit Grant,但它要求用户在成功验证后批准/拒绝应用程序.它在我的情况下不起作用,因为我拥有应用程序和API.
我查看了OAuth2密码授予,这是不完美的,因为我需要公开client_id/client_secret.
我正在考虑OAuth2的原因是因为API最终会公开.
有这样做的标准方法吗?我目前的选择:
您是对的,隐式授权类型看起来不合适。但是我认为您不赞成它的原因是不正确的,因为批准步骤不是强制性的,并且在 Spring OAuth 2 实现中(我不知道您使用的是哪个实现),您可以将授权服务器配置为自动批准授权请求,以便跳过批准步骤。
我认为“隐式流”不合适的原因是
如果授权服务器和资源服务器相同,我认为这是一种快速启动和运行的方法。第 4.3.2 节中的RFC 6749说:
如果客户端类型是机密的,或者客户端获得了客户端凭据(或分配了其他身份验证要求),则客户端必须按照第 3.2.1 节中的描述向授权服务器进行身份验证。
这意味着此处不强制使用客户端密钥进行客户端身份验证。现在,对于授权代码授予类型,我们需要客户端机密,因为用户直接向授权服务器提供他/她的凭据,然后当客户端请求访问令牌时,除了客户端机密之外,它没有其他任何东西向授权服务器证明这是一个真实的请求。
但是在资源所有者密码凭据授予类型的情况下,用户已将其凭据提供给客户端本身,然后客户端将发送这些相同的用户凭据以请求访问令牌。因此,访问令牌请求只能使用用户凭据进行身份验证,如果我们不在这里提供客户端机密,我认为我们在安全性方面没有任何损失。
因此,您绝对可以在 SPA 中使用密码凭据授予类型。
我认为这应该是首选选项,前提是客户端机密未存储在浏览器中。在用户身份验证(以及可选的用户批准)之后,授权服务器可以使用 URL 中的授权代码将浏览器重定向到服务器端端点。服务器端端点将使用授权码、客户端 ID 和客户端密码(仅存储在服务器端)来请求访问令牌。一旦访问令牌可用,服务器端端点就可以将用户重定向(HTTP 响应代码 302)到带有用于 CSRF 保护和访问令牌的适当 cookie 的 SPA URL。因此,我们不会在浏览器中存储客户端机密。
通过使用授权代码授予类型,您基本上可以使解决方案更加安全和通用。将来,如果您想使用不同的 SPA 进行单点登录,您可以通过重用与身份验证数据库(最好是 LDAP 服务器)集成的相同授权服务器轻松实现。
有关更多详细信息,请在此处参考我的StackOverflow 回答。