如何在不向客户端公开 ClientId 和 ClientSecret 的情况下使用 Auth0 保护 Web API?

How to secure Web API with Auth0 without exposing ClientId & ClientSecret to client?

我正在创建一个新的 .Net Core Web API,它由一个新的 React client-side 应用程序使用。 client-side 应用程序和 Web API 都在不同的主机上并受 Auth0 保护。我在 Auth0 中设置了 client-side 应用程序和 Web API,然后我在 Auth0 中创建了一个 machine-to-machine 应用程序,以便能够与 Web API 静默通信(没有用户界面)。安全流程是这样的:

以上所有方法都对我有用,但我担心将我的 Web API 的 Auth0 ClientSecret 存储在 client-side 应用程序中。尽管它在屏幕上或任何地方的 cookie 中都不可见,但任何有能力的用户都可以通过检查网络流量来获取它。

Internet 上的许多人似乎都同意将第 3 方 API 密钥存储在 .env 文件中,而其他人则建议通过您自己的 Web API 路由第 3 方 API 访问。 .. 而我正在做后者。但是我仍然需要 Auth0 ClientSecret 才能访问我自己的 Web API,如果不将它们存储在 client-side.

上的某处,我想不出更好的方法来访问它

我能想到的一个 last-ditch 解决方案是不通过 Auth0 保护我的 Web API,而是从 client-side 应用程序到我的 Web API 的每次调用都应该包括可以由 Web API 验证的唯一内容(例如来自 Auth0 的用户 ID)。幸运的是,最初设置用户时,来自 Auth0 的用户 ID 将存储在我们的数据库中,所以这实际上是可能的。

鉴于我已经拥有 client-side 应用程序的访问令牌,Auth0 是否有任何其他方式让我在不提供 ClientSecret 的情况下获取 Web API 访问令牌?我很想知道其他人如何通过 Auth0 保护他们的 client-side 应用程序和他们的 Web API。

你是对的,你不应该在你的客户端应用程序中包含客户端密码。不要使用客户端凭据流,而是使用授权码 + PKCE 或隐式流。

话虽如此,如果您使用的是库或 SDK,Auth0 应该会处理大部分问题。

您有两种获取令牌的选择:

  • 请求初始访问令牌和 ID 令牌时,将 Web API 添加为受众并请求相关范围。

  • 使用 Auth0.js 的 checkSession 函数或 auth0-spa-js

  • getTokenSilently 函数发出静默请求

看看这个: https://auth0.com/docs/architecture-scenarios/spa-api/part-3