gpt4 book ai didi

api - 构建 API key 和访问 token

转载 作者:行者123 更新时间:2023-12-03 10:29:14 24 4
gpt4 key购买 nike

我有一个关于如何使用访问 token 和 API key 构建 REST API 的问题。

我有一个需要身份验证的 API。我想启用两个用例:

  • 用户使用 OAuth2(密码授予)登录界面,并被授予临时访问 token 。此 token 用于对用户进行身份验证。因此,本身使用 API 的 UI 可以获取数据并显示它。
  • 我还希望用户拥有一个 API key 来执行相同的调用,但在其应用程序中。显然,与访问 token 相反,我希望 API key 能够长期存在。此外,与绑定(bind)到给定用户的访问 token 相反(如果我们引入团队机制,每个用户将拥有不同的访问 token ,尽管他们访问相同的资源),API key 对于项目应该是唯一的。

  • 虽然相似,但我不确定我应该如何构建它。我认为,在内部,API key 和访问 token 都应该存储在同一个表中,但 API key 没有过期时间。我对吗?

    我不确定的一件事是客户端的概念。似乎在规范中,客户端更像是一个外部应用程序。但是我真的可以在这里使用这个概念吗?

    例如,每个“项目”实际上是一个不同的客户端(尽管这里的客户端是同一个应用程序,而不是第三方开发者创建的应用程序)。

    因此,如果用户 A 在系统上创建一个帐户,将自动创建一个客户端 A,其访问 token 与客户端 A 绑定(bind),并具有一个长期访问 token (也称为 API key )。例如,这可以用于直接在他的代码上执行 API 调用。

    然后,如果用户 A 登录仪表板,将创建一个临时访问 token ,但这次没有应用程序,而是与用户绑定(bind),生命周期很短。

    这听起来合理吗?有没有人已经实现过这样的事情?

    谢谢!

    最佳答案

    我认为您不应该将“API key ”视为访问 token 的替代品。

    无论如何,您都必须使用访问 token 来承担请求之间的身份验证,因此您实际上使用“API key ”建模的不是通常的不记名 token 的替代品,而是提供其他授权类型的不同客户端请求 token 。

    我个人实现的流程如下:

  • 用户使用密码授权类型进行身份验证,每个用户都有一个公共(public)客户端(即您的“网络应用程序”客户端,它是公共(public)的,即它没有 client_secret )。
  • 然后用户可以创建自己的客户端。根据 OAuth2 规范,这些不是公开的,因此它们将包含 client_idclient_secret .这些就是您所说的“API key ”。
  • 然后,用户将能够通过他们的客户端请求访问 token ,使用您想要支持的任何给定授权类型(例如,直接客户端凭据、授权代码、隐式、第三方等)。您将不得不强调有关如何处理客户端凭据的适当安全实践。

  • 显然,您必须以客户端可以属于特定用户并具有不同可接受的授权类型的方式实现 OAuth2 服务器(即,您可能不希望允许用户客户端使用密码授权,而您可能希望禁止除了您的 Web 应用程序客户端的密码之外的任何授权类型)。

    然后,您将能够在每个客户端或每个授予类型的基础上定义 token TTL 或缺少 token (例如,通过密码授予请求的访问 token ,仅可由 Web 应用程序客户端使用,将具有较短的 TTL,而授权代码授予将提供长期存在的 token )。
    不过,我建议不要完全缺少 TTL,而是使用 refresh_token授予类型以更新过期的访问 token 。

    此外,您可能必须定义某种授权系统(ACL、RBAC 等),以定义哪个客户端可以做什么。这意味着每个访问 token 都应包含对用于创建其的客户端的引用。

    所以,总结一下,以下是关系:

    用户 有一个 客户 .
    客户 有一个 用户 .
    客户 有很多 token .
    token 有一个 客户 .
    token 有一个 用户 .

    双向 YMMV。

    您应该能够使用任何给定平台的最常见的 OAuth2 服务器实现来实现我描述的所有内容。

    TL;DR:“API key ”实际上是 OAuth2 客户 .

    关于api - 构建 API key 和访问 token ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29686475/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com