如何使用 PKCE 为 React 单页应用程序实现 OAuth2 授权代码授权?

How to implement the OAuth2 Authorization code grant with PKCE for a React single page application?

在我们的组织中,我们使用自己的自定义 Oauth2 提供程序(它没有“.well-known/OpenID-configuration”发现端点,因为它不是 OIDC 提供程序)。我们有一个 React 单页应用程序 (SPA) 作为 Oauth2 客户端,这个 SPA 使用 OAuth2自定义 OAuth2 提供程序的端点(授权、令牌和撤销)以授权最终用户。

对于 React SPA,是否有任何 library/SDK 可用于为自定义 OAuth2 提供程序实施 OAuth2 授权代码授予(使用 PKCE)

我们可以为 Google、Facebook、Auth0 等知名提供商找到 React OAuth 库。但是我们找不到任何用于自定义 OAuth Provider 的通用 React OAuth 库。 Auth0 反应脚本:https://auth0.com/docs/libraries/auth0-spa-js Google: https://www.npmjs.com/package/react-google-login 脸书:https://www.npmjs.com/package/react-facebook-login

我可以为 SPA 使用本机(应用程序)React 库吗?。我可以使用这个原生反应库 https://github.com/FormidableLabs/react-native-app-auth 吗?。它同时支持 OAuth2 和 OIDC 提供商。我们的自定义 OAuth 提供程序没有“.well-known/OpenID-configuration”发现端点。所以我们将在配置中指定我们的 OAuth 端点

const config = {
  clientId: '<your-client-id>',
  clientSecret: '<your-client-secret>',
  redirectUrl: ‘redirectURL', 
  scopes: ['email:accounts:read'], /
  serviceConfiguration: {
    authorizationEndpoint: 'https://OAuthProvider/oauth/authorize',
    tokenEndpoint: 'https://OAuthProvider/oauth/token',
    revocationEndpoint: 'https://OAuthProvider/oauth/revoke',
  },
}

我尝试使用以下库,但它仅适用于 OIDC 提供程序,因为它使用 OIDC 发现“.well-known/OpenID-configuration”来查找 OIDC 端点。但是我们的自定义 OAuth 提供程序没有发现渠道。

https://github.com/googlesamples/appauth-js-electron-sample

最初,我们想到了使用隐式流,但不推荐。 https://developer.okta.com/blog/2019/05/01/is-the-oauth-implicit-flow-dead

一般来说,我推荐这个库——这可能是最受推崇的选择: https://github.com/IdentityModel/oidc-client-js

如果您没有发现端点,则可以根据需要明确设置端点。但是,这在一定程度上取决于您的 OAuth2 提供程序功能。

另请参阅此示例: https://github.com/skoruba/react-oidc-client-js

2021 年更新

最近有 2 个变化影响了我之前的回答,这意味着以上选项不再是最佳选择:

  • 更新的浏览器 cookie (SameSite=strict) 被认为更强
  • 浏览器在 SPA 流程的某些部分删除第 3 方 cookie,例如,当通过隐藏的 iframe 更新令牌时

如今,首选的解决方案是让 API 参与 OAuth 工作,以解决这些问题。理解起来有点棘手,但这些资源展示了如何在不影响 SPA 架构的其他部分的情况下: