我应该使用访问令牌作为 API-KEY 吗?

Should I use an access token as API-KEY?

背景

我有一个带有节点后端和 angular 前端的应用程序。后端有两个 GraphQl 端点:

angular 前端通过调用 /auth/signIn 端点对用户进行身份验证,将访问令牌保存在内存中,不知道 httpOnly 刷新令牌,并创建一个计时器来调用 /auth/refreshToken定期。

问题

我也需要授予我的客户以编程方式访问 /api 的权限(例如从 Zapier),所以我们正在谈论 API-KEY,对吧?我正在考虑在前端的 SETTINGS 区域中创建一个 API-KEY 部分,并在 /auth 端点中创建 CRUDE 方法来维护它们。我将在链接到生成的 API-KEY 的用户 table 中创建一个新的特殊非交互式“用户”,例如,用户 Zapier 将与 API -KEY 是为与 Zapier 交互而创建的,我可以在审计跟踪中看到它的 activity 以及其他用户的活动,并通过删除该用户轻松撤销它。

问题

我应该使用长期 (?) 访问令牌作为 API-KEY 吗?这不会破坏使用访问令牌的目的吗?我的 /api 将不再是无状态的,我必须检查每个请求的访问令牌是否存在,对吗?这似乎不是正确的选择。 有没有更好的方法?

使用刷新令牌作为 API-KEY 对我来说似乎不是一个选择,首先,因为它似乎不允许在客户端设置 httpOnly cookie,其次,因为更新访问令牌的逻辑对用户来说太复杂了,第三,因为我不想公开 /auth 端点。

API 密钥的安全性非常弱,所以最终这取决于数据敏感性,例如如果攻击者可以长时间轻松访问您的数据是否严重。

我赞成针对客户端类型的标准 OAuth 流程 - 也许 Client Credentials Grant - 以便使用访问令牌,这些令牌在有限的时间段内有效,例如 30 分钟。过期和刷新编码在网上有详细记录。

  • 如果它是一个用户应用程序,那么应用程序(或其后端)可能需要做一些工作才能正确获取令牌。

  • 如果客户正在编写代码以使用代码调用 API,则需要向他们提供有关如何验证和管理过期的指导。这些细节在网上有详细记录。

  • 如果这些用户非常非技术人员,则附加令牌甚至可以由出站代理管理,其中代理负责提供令牌。