REST GET请求,动词和apikey

时间:2011-03-17 04:52:49

标签: api rest api-key

我想创建一个灵活的API Rest服务器。我将允许客户端使用HTTP或APIKEY进行身份验证。

我的问题是:将apikey添加到GET请求的正确方法是什么?我的问题是apikey污染了网址。

我想象这样的事情:/ book / 1 / apikey / s4cr4t!

3 个答案:

答案 0 :(得分:11)

在我看来,您应该只使用Authorization标头。这就是它的用途。

将它放在URL中是一个坏主意,因为:

a)正如你所说,它污染了URL  b)如果您决定使用SSL进行安全性,那么API仍会出现在日志文件中  c)缓存最终将创建相同表示的多个副本,每个api密钥一个。

有关创建自己的授权方案的更多信息,请转到here

答案 1 :(得分:4)

可以使用Authorization标头传递凭证:

GET http://domain.com:/book/1
Authorization: apikey="s4cr4t"

答案 2 :(得分:2)

这一切都取决于你想走多远,但机制保持不变:

<强>上下文

目标是识别具有某种安全级别的客户端。 (注意:安全性是另一个详细的讨论)。请记住,如果REST的“功能”是无状态的:这意味着服务器上除了资源之外没有会话状态。为了使客户端保持无状态,它需要在每个请求上提供足够的信息以使请求独立。它必须为服务器提供识别客户端的方法,例如用户名/密码,API密钥或令牌。

你有各种各样的选择,所以这里有一些:

添加HTTP标头以标识客户端

这里可以使用Authorization标头并将其与每个请求一起发送。有各种认证方案,但坚持使用Basic Auth等标准方案。在这里你可能会坚持使用SSL。如果您愿意,身份验证过程会生成一种令牌。

您也可以使用Cookie。 cookie必须包含 no information ,除非它是服务器上有状态会话资源的“指针或键”(注意:会话是一个“rest-legal”的资源)。您可以通过执行PUT(+ info)和响应200 OK或POST(+ info)来创建此资源,响应为201 Created和Location:/ sessions / 123334。然后,服务器可以验证会话,例如超时,有效的客户端IP地址,api密钥等。

使用上述方法,您还可以定义客户标题,例如Api-Key:XXXX。但是你把自己局限于特殊的客户。 Set-Cookie是“众所周知的”标题,因此浏览器会透明地处理它们。然后可以通过以下链接和填写表单(PUT + POST)来进行身份验证(创建会话资源)来完成身份验证过程。

对内容中的标识符进行编码

在这里,你可以自由地做你想做的事。只需在您的内容中添加字段/令牌/ ID,然后让服务器对其进行验证。

RESTful API通过解析链接来完成应用程序流程。另请参阅HATEOASFielding's words。当您有一个单独的登录应用程序的过程时,这也适用。

不要对URI中的任何数据进行编码。 (带外信息)