【问题标题】:Rails 5 API Key Pair Design PatternRails 5 API 密钥对设计模式
【发布时间】:2017-01-10 17:27:59
【问题描述】:

如何让我的 Rails 5 API-only 使用密钥对模式?由于这些要求,我不能考虑 JWT

我想:

  • 使用 API 跟踪应用程序
  • 无需用户名/密码即可安全验证资源所有权。

我能想到这个过程:

  • 用户在我们的 web 应用中创建新应用。
  • 系统生成安全公钥(应用标识符)和私钥
  • 只要能够提交 HTTP 请求,用户就可以使用密钥对将 API 与不同语言的应用集成。
  • 服务器将验证其密钥对并做出相应响应。

我的问题:

  • 是否有任何 gem 可以处理密钥对生成? (仅供参考)
  • 我宁愿自己生成密钥对,而不是使用 gem。哪种算法最适合我的要求?
  • 我应该使密钥对过期吗?

【问题讨论】:

  • Rails 5 附带了has_secure_token,您可以使用它来生成令牌。到期时间取决于您的应用程序和用户体验。
  • 这是否足够安全以用于私钥?

标签: ruby-on-rails api design-patterns


【解决方案1】:
  • 是否有任何 gem 可以处理密钥对生成? (仅供参考)

    您可以自己创建一个表来进行映射。对它们的组合创建唯一约束

    -------------------------
    | id          | INT     |
    -------------------------
    | public_key  | VARCHAR |
    -------------------------
    | private_key | VARCHAR |
    -------------------------
    | user_id     | INT     |
    -------------------------
    
  • 我宁愿自己生成密钥对,而不是使用 宝石。哪种算法最适合我的要求?

    不推荐。即使您可以比经过验证的 gem 做得更好(不太可能),也不值得花时间,除非您有一个非常好的理由,或者所有 gem 都存在根本缺陷,并且它们会导致您的用例出现问题.但如果您确实愿意,您可以使用像 MD5Murmurhash 这样的快速哈希算法并在它们之上构建。

    您可以简单地使用 ruby​​ 附带的SecureRandom。示例用例:

    SecureRandom.uuid #=> "2d931510-d99f-494a-8c67-87feb05e1594"
    
  • 我应该使密钥对过期吗?

    这取决于您的密钥对的使用方式。如果您的用户依赖密钥对您的应用进行 api 调用,则很可能不会。想象一下,您的应用依赖于 Google 的 API,而有一天,Google 突然让您的密钥过期了,您的所有 API 调用都返回 403。哎呀...但是您希望让用户可以选择撤销和重新生成它们。

    很好的例子是 Facebook、Google,甚至 Stripe、Braintree 等支付服务不会使您的密钥对过期,除非您撤销它。

    或者,如果您确实想要过期,您应该提供刷新机制。你可以看看Uber's oauth API

  • 我是否需要安全地生成应用 ID(我称之为公钥)?可以随意吗?

    所以我假设您所说的公钥和私钥对不是this。如果没有,您首先需要知道要公开的端点。

    如果您的用户只从服务器端访问您的 API 端点,那么您只需要一个密钥。然后你可以简单地通过密钥查找用户,然后确认身份。在大多数情况下,这就是您所需要的。

    如果您的用户还需要从前端发出请求(例如 google 的地址验证 API、stripe 的信用卡验证 API 等),您将需要一个可发布的密钥(因为它将在前端代码库中)。有了这个,你需要更加小心你返回的东西。一个经验法则是,如果信息是敏感的(如条纹),您希望返回特定于客户端的内容。例如,您验证信用卡并返回卡令牌。令牌对于特定客户端应该是唯一的。见下文。即使它们是同一张信用卡,您也会返回不同的令牌。当客户端实际请求向信用卡收费时,您使用密钥查找客户端,然后匹配卡令牌。

          publishable_keys                      credit_card_tokens
    -----------------------------------------    ----------------------------------------
    | publishable_key | secret_key | app_id |    | app_id | card_token | credit_card_id |
    -----------------------------------------    ----------------------------------------
    |   public_12345  | private_12 |    1   |    |   1    |   cc_1233  |       1        |
    -----------------------------------------    ----------------------------------------
    |   public_23456  | private_23 |    2   |    |   2    |   cc_2344  |       1        |
    -----------------------------------------    ----------------------------------------
    

【讨论】:

  • SecureRandom with base64 听起来非常适合密钥。我是否需要安全地生成应用 ID(我称之为公钥)?
  • @ln9187 不太清楚您所说的安全生成应用程序 ID 是什么意思。你能澄清一下吗?
  • 我们肯定需要一个安全的密钥(private_key),那么public_key呢,它可以是随机的吗?
  • @ln9187 请看我的编辑,最后一点。如果您有任何问题,请告诉我。
猜你喜欢
  • 1970-01-01
  • 2011-05-10
  • 2022-11-19
  • 2014-09-10
  • 1970-01-01
  • 1970-01-01
  • 2017-10-03
  • 2023-03-24
  • 1970-01-01
相关资源
最近更新 更多