3

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

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

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

4

3 回答 3

11

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

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

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

有关创建您自己的授权方案的更多信息,请访问此处

于 2011-03-17T11:17:26.617 回答
4

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

GET http://domain.com:/book/1
Authorization: apikey="s4cr4t"
于 2011-03-17T07:04:28.077 回答
2

这完全取决于您想走多远,但机制保持不变:

语境

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

您有多种选择来执行此操作,因此这里有一些:

添加 HTTP 标头以识别客户端

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

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

通过上面的方法,还可以定义一个客户头,比如Api-Key: XXXX。但随后您将自己限制在特殊客户身上。Set-Cookie 是“众所周知的”标头,因此浏览器会透明地处理它们。然后可以通过以下链接并填写表单(PUT + POST)以进行身份​​验证(创建会话资源)来完成身份验证过程。

在内容中编码标识符

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

RESTful API 通过解析链接来执行应用程序流。另见HATEOAS菲尔丁的话。当您有单独的登录到应用程序的过程时,这也适用。

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

于 2011-03-20T11:16:08.763 回答