Spring security SPA的OAuth 2.0密码授予

Spring security SPA的OAuth 2.0密码授予,spring-security,oauth-2.0,spring-oauth2,Spring Security,Oauth 2.0,Spring Oauth2,我正在创建一个新的应用程序,其中包含一组微服务和使用React的前端。我使用Oauth拥有自己的身份验证服务器。理想情况下,我希望在React应用程序中保留用户登录和注册过程,因为我拥有auth服务器和客户端应用程序 我想使用密码授权,但由于是一个单页应用程序,我无法保护这个秘密。我可以使用隐式授权,但不想将用户重定向到另一个页面进行登录或注册。这对于未来的第三方集成来说是可以的,但由于我拥有前端,我希望尽可能使其无缝(如Facebook) 作为替代方案,我是否可以创建一个用户微服务(在这里我可

我正在创建一个新的应用程序,其中包含一组微服务和使用React的前端。我使用Oauth拥有自己的身份验证服务器。理想情况下,我希望在React应用程序中保留用户登录和注册过程,因为我拥有auth服务器和客户端应用程序

我想使用密码授权,但由于是一个单页应用程序,我无法保护这个秘密。我可以使用隐式授权,但不想将用户重定向到另一个页面进行登录或注册。这对于未来的第三方集成来说是可以的,但由于我拥有前端,我希望尽可能使其无缝(如Facebook)


作为替代方案,我是否可以创建一个用户微服务(在这里我可以保护机密),它提供用于登录和注册的API,然后使用密码授权调用身份验证服务

我相信你想要的是“”。在这个OAuth2流中,最终用户(资源所有者)信任客户机,向客户机提供其凭据。客户端使用这些凭据从授权服务器交换令牌。前端不应存储凭据。但和往常一样,它需要存储代币


一旦前端获得令牌,它就可以与您拥有的服务器通信。而且它们必须由令牌保护,您可以通过授权服务器验证令牌。

我猜您所说的秘密是指客户机密?
因为React是javascript,所以您不能保护客户机机密,也不想使用隐式授权,所以将服务/微服务作为UI后端是一种很好的方法。UI后端可以保护客户端机密并使用OAuth服务器创建令牌。然后UI前端将调用UI后端API。UI后端可以使用
密码
授权类型在用户登录时创建令牌。

这里有两个问题

一个是如何在不泄露客户机密的情况下验证SPA,另一个是如何在解决第一个问题后将访问令牌安全地存储在前端

我建议采用这种方法

创建一个与SPA在同一域名上运行的后端代理-这仍然可以是您的身份验证后端

然后,您可以将SPA中的凭据发布到此代理后端,以便使用密码授权对您的用户进行身份验证

身份验证后,您可以通过安全http cookie将access_令牌(或基于正常会话的身份验证)返回到客户端,该cookie将使您的SPA API请求通过cookie进行身份验证

这将引入另一个您需要处理的问题。CSRF-您可以生成一个CSRF令牌,通过正常的
XSRF-token
cookie将其发送到客户端,该cookie将由http客户端(如axies)自动拾取,并通过
X-XSRF-token
头返回到服务器

在代理中接收到csrf令牌后,您可以在允许请求继续之前,将其与cookie上的令牌或会话中的令牌进行比较


其他需要注意的事项将是保护CORS头,确保服务器只接受来自SPA域名的请求。

我相信这就是创建的原因。CSRF攻击可以通过动态发出质询来防止,而无需使用密码

PKCE(RFC 7636)是授权代码流的扩展,用于防止多次攻击,并能够从公共客户端安全地执行OAuth交换

它最初是为了保护移动应用程序而设计的,但它防止授权代码注入的能力使它对每个OAuth客户端都很有用,甚至对使用客户端机密的web应用程序也是如此


另请参见

问题在于我无法保护这个秘密,因为前端是一个使用React构建的单页应用程序。@swardfish你在说什么秘密?如果它是资源所有者凭据,则不必保护它。它应该类似于一个简单的登录屏幕,它将触发获取令牌的流程。我认为他的意思是客户机密。要使用,您需要提供客户端凭据。是的,这是客户端机密。我将尝试创建这个“代理”微服务,它将提供登录和注册API,并在内部调用auth服务。我是否需要使用此方法实现任何其他安全注意事项?