reactjs - 我应该如何在我的案例中使用 OAuth 2.0 授权授权(React 前端,Spring Boot 后端)

标签 reactjs spring-boot oauth-2.0 authorization spring-security-oauth2

对于如何为我的网络应用程序使用 OAuth 2.0 授权,我有点困惑。

我了解 SPA 的隐式赠款现已停用,我应该使用授权赠款。

然而,我阅读的文章和文档,以及我观看的视频仍然存在一些歧义。

如果我有一个 React JS 前端和一个 Spring Boot 后端,我会看到三种可以进行 token 交换的方法。因此,当用户点击登录时,我可以:

1) 让我的 React 前端在没有客户端密码的情况下执行授权授予,并按照 SPA 的 OAuth 2.0 文档的建议获取 token

2) 让我的 React 前端执行一半的授权授予,即获取授权代码。然后将其传递到我的后端以与客户端 key 交换授权码以取回 token ,然后将此 token 传递到我的前端。

(这是此处推荐的方法:what's the alternative to password grant now that it is deprecated? OAUTH 2.0)。

老实说,我不明白这是如何工作的,因为前端和后端的客户端 ID 肯定会不同吗?

3) 让我的 React 前端将授权流程委托(delegate)给我的后端服务器,后者可以使用客户端密码执行授权授予。

我是不是误解了什么,或者所有这些方法都可行吗?这里推荐的方法是什么?

最佳答案

这些都是可行的,只是风险不同。可能最重要的区别是在身份验证期间哪个组件可以访问什么。考虑到这些组件中的每一个都可能受到损害,攻击者会获得什么。

让我们从上面的#3 开始。作为此应用程序的用户,我必须在 SPA 中输入我的凭据,然后 SPA 会将其传递给您的后端。凭证会同时向 SPA 和后端显示,如果其中任何一个遭到破坏,攻击者将直接获得对用户名和密码对的访问权限。如果没有必要,您可能不想承担这种风险。此外,如果身份提供者是公共(public)身份提供者(不特定于您的应用程序),这将不起作用,即。我不想在您的应用中输入我的 Facebook 密码。

从这个角度来看上面的#1 更好,因为您的后端永远无法访问实际的用户凭据(他们的密码)。根据实现情况,如果您将用户重定向到身份提供者以输入他们的密码,SPA 也不需要访问权限,但这是一种 UX 权衡。在这种情况下,SPA 和您的后端都有访问 token ,这很容易受到潜在的 XSS 攻击。如果其中任何一个遭到破坏,攻击者可能会获得对访问 token 的访问权并在其有效时使用它。

#2 通过 SPA 永远无法访问访问 token ,只能访问授权代码进一步改进了这一点。在这种情况下,SPA 可能会与您的后端进行常规 session ( session token 可能在 httponly cookie 中),这对 XSS 是安全的,并且后端可以使用交换的访问 token 查询它可以访问的任何资源。你可能会争辩说 SPA 有授权码,攻击者也可以用它来交换访问 token ,但一方面,授权码应该是一次性 token ,而且 SPA 不需要存储授权码,它只需要将其传递给后端一次。

之所以所有这些都存在并且可行,是因为有时您出于安全之外的原因无法做到其中之一。选择一种在您的应用程序中向最少的组件公开最少内容的方法,同时仍能满足功能、用户体验和其他要求,并始终了解您隐含接受的风险。

关于reactjs - 我应该如何在我的案例中使用 OAuth 2.0 授权授权(React 前端,Spring Boot 后端),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66145696/

相关文章:

reactjs - VS Code 在智能感知中看不到 css 文件

reactjs - React-Redux 连接 : Use mapStatetoProps to inject only component part of store

javascript - 在每个页面上 react 路由器加载路由

javascript - 如何在 React Table 中更改 TD Click 上的 TR 样式

google-api - 确定通过 Oauth2 登录的 Google Apps 用户的角色、群组或组织单位

java - 如何使用 @DynamoDbTable 注释动态传递 aws dynamodb 表名称

rest - 使用 Spring Boot 和 Java 8 的非阻塞 REST

java - PUT 在 Spring Data Rest 中的 ManyToMany 关联上

spring - oauth2 中的授权端点未附带刷新 token

azure - 我如何知道哪些用户正在访问 Azure AD OAuth 2.0 中托管的 API,以便他们只能访问自己的私有(private)数据?