2011-03-17 68 views
3

我想创建一个灵活的API Rest服务器。我将允许客户端使用HTTP或APIKEY进行身份验证。REST GET请求,动词和apikey

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

我想是这样的:/电子书/ 1/apikey/s4cr4t!

+0

如果您提及您(计划)使用的技术,将会有所帮助。 – gideon 2011-03-17 05:10:04

+0

@giddy为什么技术很重要? – 2011-03-17 11:09:58

+0

:)只是觉得他可以添加它..因为他的Q没有答案,评论几个小时。 – gideon 2011-03-17 11:49:13

回答

11

在我看来,你应该只使用Authorization头。这就是它的原因。

把它的URL是一个坏主意,因为:

一)如你所说它污染的URL
b)如果您决定去SSL安全,则API仍将出现在日志文件中
c)缓存将最终创建相同表示的多个副本,每个api键一个。

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

+0

对不起我的问题,但是这种方法不会暴露你的API密钥(使用开发人员工具)? – 2017-08-02 15:01:22

+0

@JoshMonreal它的确如此。但是,在HTTP请求中确实没有可以完全保护客户机密的地方。目标是把它放在最不可能成为问题的地方。理想情况下,API密钥只能用于未经授权的使用易于检测并可以翻转的情况。 – 2017-08-04 13:58:13

4

证书可以使用Authorization标头中传递:

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

我相信你需要在授权标题中指定一个方案。例如Authorizaton:myapiauthscheme apikey =“s4cr4t” – 2011-03-17 11:21:37

+0

是的,你实际上需要更多的东西,然后apikey,但这只是另一种方式的例子。 – 2011-03-17 18:27:52

+0

这会怎样看待'$ http.get()'? – 2016-10-28 15:26:56

2

这一切都取决于你想要走多远,但是技师保持不变:

语境

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

你有不同的选项来做到这一点的,这里有:

添加HTTP标头识别客户端

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

您还可以使用一个Cookie的。 cookie必须包含任何信息除了它是你的服务器上的“指针或钥匙”有状态会话资源(注:会话它的资源,这是“休息法律”)。您可以通过响应200 OK或POST(+ info)执行PUT(+ info)创建此资源,响应为201 Created和Location:/ sessions/123334。会话然后可以由服务器,如超时,有效的客户端IP地址,API密钥等

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

编码的内容

这里的标识,你可以自由地做你想要什么了。只需在您的内容中添加一个字段/令牌/标识并让服务器验证它。

RESTful API通过解析链接来执行应用程序流。另请参阅HATEOASFielding's words。这也适用于您有单独的登录应用程序的过程。

不要在URI中编码任何数据。 (带外信息)