Place API key in Headers or URL
我正在为我公司的数据设计一个公共API。 我们希望应用程序开发人员注册API密钥,以便我们可以监控使用和过度使用。
由于API是REST,我最初的想法是将此密钥放在自定义标头中。 这就是我见过谷歌,亚马逊和雅虎的方式。 另一方面,我的老板认为,如果密钥只是URL的一部分,那么API更容易使用,等等"http://api.domain.tld/longapikey1234/resource"。 我想有一些事情可以说,但它违反了URL的原则作为你想要的简单地址,而不是你想要它的方式或原因。
您是否认为将密钥放在URL中是合乎逻辑的? 或者,如果将简单的javascript前端写入某些数据,您是否还不必手动设置HTTP标头?
它应该放在HTTP Authorization标头中。规范在这里https://tools.ietf.org/html/rfc7235
-
我已经使用了第三部分的Authorization标头 - 最终用户。这是最终用户登录应用程序以获得对内容的完全访问权限。
-
@Thomas您可以在auth标头中放置的参数数量没有限制。查看OAuth,它在标题中有大约8个不同的参数值。
-
链接更新 - 截至2014年6月,现在是RFC 7235
-
@StephenP谢谢,更新。
-
我不是说你错了,但当你说"它应该是"时 - 你怎么知道的?谁说? (我发现了这个问题,因为似乎Apache经常在PHP执行之前剥离Authorization标头)
-
@JAAulde我在这里详细了解bizcoder.com/where-oh-where-does-the-api-key-go如果您有任何Apache问题的链接,我会感兴趣。
-
@DarrelMiller感谢您的链接。我同意它在标题中比URL查询字符串(或伪路径等)更好,但我希望从权威机构那里得到某种明确的方向,应该使用哪个标题。我的Apache问题目前是轶事,所以我没有任何链接提供回报。此时我倾向于使用类似X-API-KEY的东西。
-
@DarrelMiller在Symfony的HTTP基金会代码中查看此注释:github.com/symfony/http-foundation/blob/master/
-
@JAAulde嗯,RFC 7235是关于如何进行HTTP身份验证的完整规范,它提供的唯一选项是使用Authorization标头。
-
@JAAulde和github链接确实说它是php-cgi模块没有传递基本的auth头,而不是Apache本身。这可能是因为php-cgi本身可能会授权,并且不希望将明文密码传递给应用程序。
如果你想要一个可能吸引老板的论点:想想一下URL是什么。网址是公开的。人们复制并粘贴它们。他们分享他们,他们把它们放在广告上。没有什么能阻止某人(有意或无意)邮寄该URL以供其他人使用。如果您的API密钥位于该URL中,则每个人都拥有它。
-
除了有关公开披露URL的要点之外,所有能够访问路由器,公司代理服务器,缓存服务器等的网络管理员都可以看到URL和内联API密钥。
-
@AdamCaviness不使用HTTPS,所有API都应该实现。 URL已加密。作为管理员,您只能看到DNS查找和与之通信的IP地址,而不是内容。除此之外我同意立场
-
@nickdnk,这是真的。现在关于HTTPS,即便如此,完整的URL仍保留在浏览器历史记录中!好玩的东西。我不喜欢URL中的任何敏感内容。
-
@AdamCaviness是的,从那个意义上说。我理解它就像有人可以读取流量,如果他们有权访问路由器。
-
这个API是如何不做pipedrive.com/en/api的一个很好的例子。
-
URL中的API密钥也意味着它也可能最终出现在各种日志中。
最好在标头中使用API??密钥,而不是在URL中。
如果从浏览器尝试,URL将保存在浏览器的历史记录中。这种情况非常罕见。但是当后端服务器记录所有URL时会出现问题。它可能会暴露API密钥。
有两种方法,您可以在标题中使用API?? Key
基本授权:
条纹示例:
1
| curl https://api.stripe.com/v1/charges -u sk_test_BQokikJOvBiI2HlWgH4olfQ2: |
curl使用-u标志传递基本身份验证凭据(在API密钥之后添加冒号将阻止它询问您的密码)。
自定义标题
1
| curl -H"X-API-KEY: 6fa741de1bdd1d91830ba" https://api.mydomain.com/v1/users |
-
为什么选择X-API-KEY?这个X是一种自定义标头的HTTP规范吗?
-
stackoverflow.com/questions/3561381/
我不会把密钥放在url中,因为它确实违反了REST这个松散的"标准"。但是,如果你这样做,我会把它放在网址的"用户"部分。
例如:http://[email protected]/myresource/myid
这样它也可以作为带有basic-auth的头文件传递。
-
注1)这只是基本身份验证的简写,2)并非所有HTTP客户端都会尊重它,3)至少有一个主要浏览器会显示网络钓鱼警告。
-
@ user359996取得的分数。作为回应:1)我在最后一句话中提到了这一点,2)标准中提到了这一点(tools.ietf.org/html/rfc3986),这就是客户的错误,3)我没有意识到这一点虽然我认为这是有道理的,但我想知道在用作api-call(XHR)时是否仍然如此。最后,问题是关于在网址中以一种宁静的方式包含auth-info,我想我已经回答了这个问题。
在参数中传递api密钥使客户端难以保密他们的API密钥,他们往往会定期泄漏密钥。
更好的方法是将其传递到请求url的头部。您可以在代码中设置用户密钥头。
为了测试您的请求,您可以通过将用户密钥标头设置为api-key来在Google Chrome中使用Postman应用。