【问题标题】:Place API key in Headers or URL将 API 密钥放在标头或 URL 中
【发布时间】:2011-07-27 21:35:41
【问题描述】:

我正在为我公司的数据设计一个公共 API。我们希望应用程序开发人员注册一个 API 密钥,以便我们可以监控使用和过度使用。

由于 API 是 REST,我最初的想法是将此密钥放在自定义标头中。这就是我看到谷歌、亚马逊和雅虎的做法。另一方面,我的老板认为,如果密钥只是 URL 的一部分,则 API 更易于使用,等等。“http://api.domain.tld/longapikey1234/resource”。我想对此有话要说,但它违反了 URL 作为您想要的简单地址的原则,而不是您想要的方式或原因。

您认为将密钥放在 URL 中是否合乎逻辑?或者,如果为某些数据编写一个简单的 javascript 前端,您宁愿不必手动设置 HTTP 标头吗?

【问题讨论】:

    标签: rest http url authentication api-key


    【解决方案1】:

    它应该放在 HTTP 授权标头中。规范在这里https://www.rfc-editor.org/rfc/rfc7235

    【讨论】:

    • 我已经将授权标头用于第三部分 - 最终用户。也就是说,最终用户需要登录应用才能获得对内容的完全访问权限。
    • @Thomas 您可以在 auth 标头中放置的参数数量没有限制。看看 OAuth,它的 header 中有大约 8 个不同的参数值。
    • 链接更新——截至 2014 年 6 月,此地址为 RFC 7235
    • 我不是说你错了,但是当你说“应该是”时——你怎么知道?谁说? (我发现这个问题是因为 Apache 似乎经常在 PHP 执行之前剥离 Authorization 标头)
    • @JAAulde 我在这里更详细地介绍bizcoder.com/where-oh-where-does-the-api-key-go如果您有任何指向 Apache 问题的链接,我会很感兴趣。
    【解决方案2】:

    如果您想要一个可能会吸引老板的论点:想想 URL 是什么。网址是公开的。人们复制并粘贴它们。他们分享它们,他们把它们放在广告上。没有什么可以阻止某人(有意或无意地)将该 URL 邮寄给其他人使用。如果您的 API 密钥在该 URL 中,那么每个人都拥有它。

    【讨论】:

    • 除了您关于公开披露 URL 的观点外,所有有权访问路由器、公司代理服务器、缓存服务器等的网络管理员都可以看到 URL 和内联 API 密钥.
    • @AdamCaviness 不使用 HTTPS,所有 API 都应该实现它。 URL 已加密。作为管理员,您只能看到 DNS 查找和与之通信的 IP 地址,而不是内容。除此之外,我同意立场
    • @nickdnk,这是真的。现在关于 HTTPS,即便如此,完整的 URL 仍保留在浏览器历史记录中!好玩的东西。我不喜欢在 URL 中包含任何敏感内容。
    • @AdamCaviness 是的,从这个意义上说。我的理解是,如果有人可以访问路由器,他们就可以读取流量。
    • 这个 API 是一个很好的例子,说明如何不要做pipedrive.com/en/api
    【解决方案3】:

    最好在标头中使用 API Key,而不是在 URL 中。

    如果从浏览器尝试,URL 会保存在浏览器的历史记录中。这是非常罕见的情况。但是当后端服务器记录所有 URL 时,问题就来了。它可能会暴露 API 密钥。

    在header中使用API​​ Key有两种方式

    基本授权:

    条纹示例:

    curl https://api.stripe.com/v1/charges -u sk_test_BQokikJOvBiI2HlWgH4olfQ2:
    

    curl 使用 -u 标志传递基本身份验证凭据(在您的 API 密钥后添加一个冒号将阻止它询问您的密码)。

    自定义标题

    curl -H "X-API-KEY: 6fa741de1bdd1d91830ba" https://api.mydomain.com/v1/users
    

    【讨论】:

    【解决方案4】:

    我不会将密钥放在 url 中,因为它确实违反了这个松散的“标准”,即 REST。但是,如果您这样做了,我会将其放在 url 的“用户”部分。

    例如:http://me@example.com/myresource/myid

    这样它也可以作为带有基本身份验证的标头传递。

    【讨论】:

    • 注 1) 这只是基本身份验证的简写,2) 并非所有 HTTP 客户端都会支持它,并且 3) 至少一个主要浏览器会显示网络钓鱼警告。
    • @user359996 得分。作为回应:1)我在最后一句话中没有提到这一点,2)标准中提到了这一点(tools.ietf.org/html/rfc3986),所以这是客户的错,3)我没有意识到这一点,尽管我想它使感觉,我想知道在用作 api-call (XHR) 时是否仍然如此。最后,问题是关于以一种宁静的方式在 url 中包含 auth-info,我想我已经回答了。
    【解决方案5】:

    在参数中传递 api 密钥使客户端难以对其 API 密钥保密,他们往往会定期泄露密钥。 更好的方法是在请求 url 的标头中传递它。您可以在代码中设置 user-key 标头。 为了测试您的请求网址,您可以通过将用户密钥标头设置为您的 api-key 来使用谷歌浏览器中的 Postman 应用程序。

    【讨论】:

    • 参数中的api密钥如何让用户泄露密钥?
    猜你喜欢
    • 2013-09-10
    • 2012-03-24
    • 2021-04-17
    • 2018-08-12
    • 2018-11-25
    • 1970-01-01
    • 2017-04-11
    • 1970-01-01
    相关资源
    最近更新 更多