spring-security - SPA 的 OAuth 2.0 密码授权
问题描述
我正在使用 React 创建一个带有一组微服务和前端的新应用程序。我有自己的使用 Oauth 的身份验证服务器。理想情况下,我希望在 React 应用程序中保留用户登录和注册过程,因为我同时拥有身份验证服务器和客户端应用程序。
我想使用密码授权,但由于 React 是单页应用程序,我无法保护机密。我可以使用隐式授权,但不想将用户重定向到另一个页面以登录或注册。这对于未来的第三方集成来说是可以的,但由于我拥有前端,我希望尽可能使其无缝(例如 Facebook)。
作为替代方案,我是否可以创建一个用户微服务(我可以在其中保护机密),它提供用于登录和注册的 API,然后使用密码授予调用身份验证服务?
解决方案
你这里有两个问题。
一个是如何在不泄露 client_secret 的情况下对 SPA 进行身份验证,另一个是在解决第一个问题后如何将访问令牌安全地存储在前端。
我会推荐这种方法
创建一个在与您的 SPA 相同的域名上运行的后端代理 - 这仍然可以是您的身份验证后端。
然后,您可以将 SPA 中的凭据发布到此代理后端,以使用密码授予对您的用户进行身份验证。
身份验证后,您可以通过安全的 http cookie 将 access_token(或基于正常会话的身份验证)返回给客户端,这将使您的 SPA API 请求通过 cookie 进行身份验证。
这将带来另一个您需要注意的问题。CSRF - 您可以生成一个 CSRF 令牌,通过普通 cookie 将其发送给客户端,该XSRF-TOKEN
cookie 将由您的 http 客户端(如 axies)自动选取并通过X-XSRF-TOKEN
标头返回给服务器。
在代理中收到 csrf 令牌后,您可以与 cookie 上的令牌或会话中的令牌进行比较,然后再允许请求继续。
其他需要注意的事情是保护 CORS 标头并确保您的服务器只接受来自您的 SPA 域名的请求。
推荐阅读
- android - 背景可绘制不适用于按钮
- html - CSS:最大宽度不是最大宽度
- java - 调用对应的 set 方法时获取对象值
- javascript - 如何在 JavaScript 中隐藏 html 标签内容?
- qemu - libvirt:如何防止“accel=kvm”
- postgresql - 如何从spark通过jdbc将双精度浮点数写入postgres
- c# - 批处理文件启动应用程序并传递多个参数将空格切换为á
- c# - 如何在控制器操作中访问 JwtBearer 身份验证处理程序配置?
- excel - Excel powerquery:如何创建一个包含其他列值总和的列?
- json - 我想更新 json 数据类型列中的整个 json