将API密钥放在标题或URL中


76

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

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

您觉得将密钥放入URL是否合乎逻辑?或者,如果将简单的JavaScript前端写入某些数据,您是否不必手动设置HTTP标头?

Answers:


76

应将其放在HTTP Authorization标头中。规格在这里https://tools.ietf.org/html/rfc7235


我已经在第三部分(最终用户)中使用了Authorization标头。也就是说,最终用户需要登录到该应用程序才能完全访问该内容。
Thomas Ahle

5
@Thomas可以在auth标头中输入的参数数量没有限制。查看OAuth,它在标头中大约有8个不同的参数值。
Darrel Miller

1
链接更新-自2014
斯蒂芬P

我并不是说您错了,而是当您说“应该”时,您怎么知道?谁说?(我发现了这个问题,因为似乎Apache经常在执行PHP之前先剥离Authorization标头)
JAAulde 2015年

2
@JAAulde我在这里了解更多详细信息bizcoder.com/where-oh-where-does-the-api-key-go 如果您有任何指向Apache问题的链接,我将很感兴趣。
Darrel Miller

67

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


1
除了你对公开披露的URL时,URL和在线API密钥将所有的网络管理员可见与访问路由器,企业代理服务器,缓存服务器等点
亚当Caviness

4
@AdamCaviness不与HTTPS一起使用,无论如何,所有API都应实现。URL已加密。作为管理员,您只能看到与之通信的DNS查找和IP地址,而不能看到其内容。除此之外,我同意立场
nickdnk

1
@nickdnk,是的。现在,关于HTTPS,即使如此,完整的URL仍保留在浏览器历史记录中!好玩的东西。我不喜欢URL中的任何敏感内容。
亚当·卡维尼斯

@AdamCaviness是的,从这个意义上讲。我理解这就像有人可以访问路由器一样读取流量。
nickdnk

这个API很好地说明了如何不执行pipedrive.com/en/api
John John Pichler

13

最好在标头(而不是URL)中使用API​​密钥。

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

您可以通过两种方式在标头中使用API​​密钥

基本授权:

条带示例:

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

1
为什么要使用X-API-KEY?这是X的自定义标头的HTTP规范吗?
John John Pichler


2

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

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

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


5
注意1)这只是基本身份验证的简写,2)并非所有的HTTP客户端都会接受它,3)至少一个主要的浏览器将显示网络钓鱼警告。
user359996

@ user359996得分。作为回应:1)我在最后一句话中没有提到这一点; 2)在标准(tools.ietf.org/html/rfc3986)中提到了这一点,这是客户的错,3)我不知道那件事。 ,尽管我认为这很有意义,但我想知道用作api-call(XHR)时是否仍然如此。最后,问题是关于以一种轻松的方式将auth-info包含在url中,我想我已经回答了。
亚当·瓦格纳

1

在参数中传递api密钥会使客户端很难保留其APIkey的机密性,它们倾向于定期泄漏密钥。更好的方法是将其传递到请求url的标头中。您可以在代码中设置user-key标头。为了测试您的请求网址,您可以将user-key标头设置为api-key,从而在Google chrome中使用Postman应用。


1
参数中的api键如何使用户泄漏其键?
Heinzlmaen
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.