2011-04-01 45 views
55

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

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

你会发现将密钥放在URL中是合乎逻辑的吗?或者,如果将一个简单的JavaScript前端写入某些数据,您是不是必须手动设置HTTP标头?

回答

52

它应该放在HTTP授权标头中。规范在这里https://tools.ietf.org/html/rfc7235

+0

我已经为第三部分 - 最终用户使用了授权标头。这就是最终用户需要登录到应用程序才能获得对内容的完全访问权限。 – 2011-04-01 23:31:25

+5

@Thomas可以放入auth头文件的参数数量没有限制。看看OAuth,它在头部有大约8个不同的参数值。 – 2011-04-01 23:42:15

+1

链接更新 - 现在是[RFC 7235](https://tools.ietf.org/html/rfc7235)截至2014年6月 – 2014-12-01 20:44:54

2

我不会把钥匙放在网址中,因为它违反了这个宽松的“标准”,即REST。但是,如果你这样做,我会把它放在url的'用户'部分。

如:http://[email protected]/myresource/myid

这样,它也可以作为与基本认证头传递。

+5

注1)这只是基本身份验证的简写,2)并非所有HTTP客户端都会遵守它,并且3)至少有一个主要浏览器会显示网络钓鱼警告。 – user359996 2012-09-11 18:47:48

+0

@ user359996取得的积分。作为回应:1)我在最后一句中对此有所了解,2)标准中提到了这一点(http://tools.ietf。org/html/rfc3986),所以这就是客户端的错误,3)我没有意识到这一点,尽管我认为它是有道理的,但我不知道这是否仍然适用于api-call(XHR)。最后,问题是关于在网址中包含auth-info以一种平静的方式,并且我认为我回答了这个问题。 – 2012-09-11 23:22:54

46

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

+0

好点。谢谢。 – 2011-06-03 10:55:51

+1

除了您公开披露URL的观点之外,所有可访问路由器,企业代理服务器,缓存服务器等的网络管理员都可以看到URL和内嵌API密钥。 – 2012-08-20 21:00:40

+3

@AdamCaviness不支持HTTPS ,无论如何,所有的API都应该实现。网址已加密。作为管理员,您只能看到DNS查找和IP地址,而不是内容。除此之外,我同意立场 – nickdnk 2016-01-12 13:40:15

7

最好在标题中使用API​​密钥,而不要在URL中使用。

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

两种方式,您可以使用头API密钥

基本授权:

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

卷曲使用-u标志来传递基本身份验证凭据:

从条纹示例(在您的API密钥之后添加冒号将会阻止它向您询问密码)。

自定义页眉

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

为什么选择X-API-KEY?这是X是一种用于定制头文件的HTTP规范吗? – 2016-11-15 17:02:39

+0

http://stackoverflow.com/questions/3561381/custom-http-headers-naming-conventions – 2016-11-16 11:20:11

0

传递的API密钥参数很难让客户保持其APIkeys秘密,他们往往会定期泄漏密钥。 更好的方法是将它传递到请求url的头部。您可以在代码中设置用户密钥标头。 为了测试您的请求网址,您可以在谷歌浏览器中使用Postman应用程序,方法是将用户密钥标头设置为您的api密钥。