我应该如何在我的案例中使用 OAuth 2.0 授权授权(React 前端,Spring Boot 后端)
How should I use the OAuth 2.0 Authorization grant in my case (React front-end, Spring Boot back-end)
对于如何为我的网络应用程序使用 OAuth 2.0 授权,我有点困惑。
我了解 SPA 的隐式授权现已停用,我应该使用授权授权。
但是我读过的文章和文档,以及我看过的视频仍然存在一些歧义。
如果我有一个 React JS 前端和一个 Spring 引导后端,我会看到三种可以进行令牌交换的方法。因此,当用户点击登录时,我可以:
1) 让我的 React 前端在没有客户端密码的情况下执行授权授予,并按照 SPA 的 OAuth 2.0 文档的建议获取令牌
2) 让我的 React 前端执行一半的授权授予,即获取授权码。然后将其传递到我的后端以与客户端密钥交换授权码以取回令牌,然后将此令牌传递到我的前端。
(这是这里推荐的方法:what's the alternative to password grant now that it is deprecated? OAUTH 2.0)。
老实说,我不明白这是怎么回事,因为前端和后端的客户端 ID 肯定会不同吗?
3) 让我的 React 前端将授权流程委托给我的后端服务器,后者可以使用客户端密码执行授权授予。
我是不是误解了什么,或者所有这些方法都可行吗?这里推荐的方法是什么?
这些都是可行的,只是风险不同。可能最重要的区别是在身份验证期间哪个组件可以访问什么。考虑到这些组件中的每一个都可能受到损害,攻击者会获得什么。
让我们从上面的#3 开始。作为此应用程序的用户,我必须在 SPA 中输入我的凭据,然后 SPA 会将其传递给您的后端。凭证会同时向 SPA 和后端显示,如果其中任何一个遭到破坏,攻击者将直接获得对用户名和密码对的访问权限。如果没有必要,您可能不想承担这种风险。此外,如果身份提供者是 public 一个(不特定于您的应用程序),这将不起作用,即。我不想在您的应用中输入我的 Facebook 密码。
从这个角度来看上面的#1 更好,因为您的后端永远无法访问实际的用户凭据(他们的密码)。根据实施情况,如果您将用户重定向到身份提供者以输入他们的密码,SPA 也不需要访问权限,但这是一种 UX 权衡。在这种情况下,SPA 和您的后端都有访问令牌,这很容易受到潜在的 XSS 攻击。如果其中任何一个遭到破坏,攻击者可能会获得对访问令牌的访问权并在其有效时使用它。
#2 通过 SPA 永远无法访问访问令牌,只能访问授权代码,进一步改进了这一点。在这种情况下,SPA 可能会与您的后端进行常规会话(会话令牌可能在 httponly cookie 中),这对 XSS 是安全的,并且后端可以使用交换的访问令牌查询它可以访问的任何资源。你可能会争辩说 SPA 有授权码,攻击者也可以用它来交换访问令牌,但一方面,授权码应该是一次性令牌,而且 SPA 不需要存储授权码,它只需要将其传递给后端一次。
之所以所有这些都存在并且可行,是因为有时您出于安全之外的原因无法做到其中之一。选择对应用程序中最少的组件公开最少的东西,同时仍能满足功能、用户体验和其他要求,并始终了解您隐含接受的风险。
对于如何为我的网络应用程序使用 OAuth 2.0 授权,我有点困惑。
我了解 SPA 的隐式授权现已停用,我应该使用授权授权。
但是我读过的文章和文档,以及我看过的视频仍然存在一些歧义。
如果我有一个 React JS 前端和一个 Spring 引导后端,我会看到三种可以进行令牌交换的方法。因此,当用户点击登录时,我可以:
1) 让我的 React 前端在没有客户端密码的情况下执行授权授予,并按照 SPA 的 OAuth 2.0 文档的建议获取令牌
2) 让我的 React 前端执行一半的授权授予,即获取授权码。然后将其传递到我的后端以与客户端密钥交换授权码以取回令牌,然后将此令牌传递到我的前端。
(这是这里推荐的方法:what's the alternative to password grant now that it is deprecated? OAUTH 2.0)。
老实说,我不明白这是怎么回事,因为前端和后端的客户端 ID 肯定会不同吗?
3) 让我的 React 前端将授权流程委托给我的后端服务器,后者可以使用客户端密码执行授权授予。
我是不是误解了什么,或者所有这些方法都可行吗?这里推荐的方法是什么?
这些都是可行的,只是风险不同。可能最重要的区别是在身份验证期间哪个组件可以访问什么。考虑到这些组件中的每一个都可能受到损害,攻击者会获得什么。
让我们从上面的#3 开始。作为此应用程序的用户,我必须在 SPA 中输入我的凭据,然后 SPA 会将其传递给您的后端。凭证会同时向 SPA 和后端显示,如果其中任何一个遭到破坏,攻击者将直接获得对用户名和密码对的访问权限。如果没有必要,您可能不想承担这种风险。此外,如果身份提供者是 public 一个(不特定于您的应用程序),这将不起作用,即。我不想在您的应用中输入我的 Facebook 密码。
从这个角度来看上面的#1 更好,因为您的后端永远无法访问实际的用户凭据(他们的密码)。根据实施情况,如果您将用户重定向到身份提供者以输入他们的密码,SPA 也不需要访问权限,但这是一种 UX 权衡。在这种情况下,SPA 和您的后端都有访问令牌,这很容易受到潜在的 XSS 攻击。如果其中任何一个遭到破坏,攻击者可能会获得对访问令牌的访问权并在其有效时使用它。
#2 通过 SPA 永远无法访问访问令牌,只能访问授权代码,进一步改进了这一点。在这种情况下,SPA 可能会与您的后端进行常规会话(会话令牌可能在 httponly cookie 中),这对 XSS 是安全的,并且后端可以使用交换的访问令牌查询它可以访问的任何资源。你可能会争辩说 SPA 有授权码,攻击者也可以用它来交换访问令牌,但一方面,授权码应该是一次性令牌,而且 SPA 不需要存储授权码,它只需要将其传递给后端一次。
之所以所有这些都存在并且可行,是因为有时您出于安全之外的原因无法做到其中之一。选择对应用程序中最少的组件公开最少的东西,同时仍能满足功能、用户体验和其他要求,并始终了解您隐含接受的风险。