关于休息:将API密钥放在标题或URL中

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


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


最好在标头中使用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


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

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

这样它也可以作为带有basic-auth的头文件传递。


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