如果我有服务器端代理,我可以将 Oauth2 授权代码流用于 SPA(React 应用程序)吗?

Can I use Oauth2 Authorization Code flow for a SPA (React app), if I have a server-side proxy?

在观看了大量关于 OAuth2 的教程之后,有一个每个人都反复提到的最佳实践——如果你有一个 React 应用程序(或 Angular,或 Ember)——你 必须使用隐式流

我知道将客户端凭据存储在公开可见的 javascript 中是行不通的。但是,我的情况有点不同:

  1. 我仅将 Oauth2 用于微服务的单点登录和令牌生成。我选择它而不是简单地生成令牌,因为得到良好支持的第三方库是围绕 Oauth2 思想构建的。
  2. 我的想法是拥有一个 React 应用程序和一个 ASP.NET MVC 应用程序,它服务于 javascript 并充当 API 请求的代理。用户对服务器端应用程序进行身份验证(通过使用 Oauth2 授权代码流)。
  3. 然后,如果我需要从 API 检索数据,我会从 React 调用我的 ASP.NET MVC 应用程序(通过发送一个简单的 cookie)。 MVC 应用程序持有令牌,但从未将其暴露给用户的浏览器。
  4. 显然,在调用时,我的 MVC 应用程序会将请求重定向到必要的 API,提供承载令牌。

为了更好地理解为什么这是我提出的,这里是我收到的一些可能不寻常的要求:

  1. 我真的不想共享访问令牌 - 即使它的存在时间相对较短。
  2. 我还希望能够将每个用户帐户限制为 3 个并发用户会话。使用 cookie 和服务器端会话很容易做到。

我无法理解为什么这个想法会那么糟糕。是否有任何技术问题可能会阻止此工作?或者可能存在安全风险?

The authorization code flow returns an authorization code (like it says on the tin) that can then be exchanged for an ID token and access token. This requires client authentication using a client id and secret to retrieve the tokens from the back end and has the benefit of not exposing tokens to the User Agent.

This flow allows for long lived access (through the use of refresh tokens). Clients using this flow must be able to maintain a secret.

根据您的描述,您有服务到服务的授权流程,并且由于您的服务没有公开客户端密钥,因此完全可以使用代码流程。此外,您应该使用它来允许长期存在的令牌。