将API密钥放在标题或URL中

时间:2011-04-01 18:24:27

标签: rest http url authentication api-key

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

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

您认为将密钥放入网址是否合乎逻辑?或者,如果将简单的javascript前端写入某些数据,您是否还不必手动设置HTTP头?

5 个答案:

答案 0 :(得分:63)

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

答案 1 :(得分:57)

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

答案 2 :(得分:11)

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

如果从浏览器尝试过,则会将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

答案 3 :(得分:2)

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

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

这样它也可以作为带有basic-auth。

的标题传递

答案 4 :(得分:1)

在参数中传递api密钥使客户端难以保密他们的API密钥,他们往往会定期泄漏密钥。 更好的方法是将其传递到请求url的头部。您可以在代码中设置用户密钥头。 为了测试您的请求,您可以通过将用户密钥标头设置为api-key来在Google Chrome中使用Postman应用。