如何在不向客户端公开 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 静默通信(没有用户界面)。安全流程是这样的:
- 用户尝试访问 client-side 应用。
- 用户 re-directed 向 Auth0 提供凭据。
- Auth0 向 client-side 应用验证凭据和 returns 用户信息(包括用户 ID + 访问令牌)。
- Client-side 应用程序将用户信息存储在本地存储中以备将来使用,直至过期。
- 对第 3 方 API 的任何调用都通过我自己的 Web API 进行路由,因此第 3 方 API 密钥位于服务器上的安全位置,而不是在client-side.
- 用户访问需要调用我的网站 API 的页面,但我们还没有我的网站 API 的访问令牌。
- Client-side 应用程序从 .env 文件中读取 ClientId 和 ClientSecret(hard-coded 值)并向 Auth0 发出 POST 请求以获取我的 Web 的访问令牌 API(这是 Auth0 推荐的静默获取 Web 访问令牌的方式 API,除非他们没有指定 ClientId 和 ClientSecret 的存储位置)。
- Auth0 returns 我的 Web 的访问令牌 API。
- Client-side 应用程序将 Web API 访问令牌存储在本地存储中以备将来使用,直到它过期。
- Client-side 应用程序使用新获取的访问令牌调用我的 Web API 作为 header.
中的承载令牌
- Web API 接收访问令牌,使用 Auth0 进行身份验证并完成请求。
以上所有方法都对我有用,但我担心将我的 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
我正在创建一个新的 .Net Core Web API,它由一个新的 React client-side 应用程序使用。 client-side 应用程序和 Web API 都在不同的主机上并受 Auth0 保护。我在 Auth0 中设置了 client-side 应用程序和 Web API,然后我在 Auth0 中创建了一个 machine-to-machine 应用程序,以便能够与 Web API 静默通信(没有用户界面)。安全流程是这样的:
- 用户尝试访问 client-side 应用。
- 用户 re-directed 向 Auth0 提供凭据。
- Auth0 向 client-side 应用验证凭据和 returns 用户信息(包括用户 ID + 访问令牌)。
- Client-side 应用程序将用户信息存储在本地存储中以备将来使用,直至过期。
- 对第 3 方 API 的任何调用都通过我自己的 Web API 进行路由,因此第 3 方 API 密钥位于服务器上的安全位置,而不是在client-side.
- 用户访问需要调用我的网站 API 的页面,但我们还没有我的网站 API 的访问令牌。
- Client-side 应用程序从 .env 文件中读取 ClientId 和 ClientSecret(hard-coded 值)并向 Auth0 发出 POST 请求以获取我的 Web 的访问令牌 API(这是 Auth0 推荐的静默获取 Web 访问令牌的方式 API,除非他们没有指定 ClientId 和 ClientSecret 的存储位置)。
- Auth0 returns 我的 Web 的访问令牌 API。
- Client-side 应用程序将 Web API 访问令牌存储在本地存储中以备将来使用,直到它过期。
- Client-side 应用程序使用新获取的访问令牌调用我的 Web API 作为 header. 中的承载令牌
- Web API 接收访问令牌,使用 Auth0 进行身份验证并完成请求。
以上所有方法都对我有用,但我担心将我的 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