首页 > 解决方案 > SPA 的 OAuth 2.0 密码授权

问题描述

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

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

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

标签: spring-securityoauth-2.0spring-oauth2

解决方案


你这里有两个问题。

一个是如何在不泄露 client_secret 的情况下对 SPA 进行身份验证,另一个是在解决第一个问题后如何将访问令牌安全地存储在前端。

我会推荐这种方法

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

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

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

这将带来另一个您需要注意的问题。CSRF - 您可以生成一个 CSRF 令牌,通过普通 cookie 将其发送给客户端,该XSRF-TOKENcookie 将由您的 http 客户端(如 axies)自动选取并通过X-XSRF-TOKEN标头返回给服务器。

在代理中收到 csrf 令牌后,您可以与 cookie 上的令牌或会话中的令牌进行比较,然后再允许请求继续。

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


推荐阅读