我应该使用访问令牌作为 API-KEY 吗?
Should I use an access token as API-KEY?
背景
我有一个带有节点后端和 angular 前端的应用程序。后端有两个 GraphQl 端点:
/auth
,其方法如下:
signIn
,它从我的 angular 前端验证交互式用户(基本 usr/pwd),并且 returns 一个访问令牌和一个安全的 httpOnly 刷新令牌(cookie);
refreshToken
,其中returns一个新的访问令牌;和
signOut
,这只是撤销刷新令牌。
/api
,其中包含业务规则,并通过收到的访问令牌(无状态)对请求进行身份验证
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,则需要向他们提供有关如何验证和管理过期的指导。这些细节在网上有详细记录。
如果这些用户非常非技术人员,则附加令牌甚至可以由出站代理管理,其中代理负责提供令牌。
背景
我有一个带有节点后端和 angular 前端的应用程序。后端有两个 GraphQl 端点:
/auth
,其方法如下:signIn
,它从我的 angular 前端验证交互式用户(基本 usr/pwd),并且 returns 一个访问令牌和一个安全的 httpOnly 刷新令牌(cookie);refreshToken
,其中returns一个新的访问令牌;和signOut
,这只是撤销刷新令牌。/api
,其中包含业务规则,并通过收到的访问令牌(无状态)对请求进行身份验证
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,则需要向他们提供有关如何验证和管理过期的指导。这些细节在网上有详细记录。
如果这些用户非常非技术人员,则附加令牌甚至可以由出站代理管理,其中代理负责提供令牌。