2013-10-08 78 views
2

我想在我的应用程序中使用RESTfull认证API。想象一下以下结构:设计一个RESTful认证API

创建一个新的会话令牌(登录):

POST /session/?username=&password <-- return session token 

使用令牌更新,并得到一个受保护的ressource:

PUT /ressource/example?token={token} 
GET /ressource/example?token={token} 

删除令牌(注销):

DELETE /session/{token} 

问:这是一个PI RESTfull?如果不是,我该怎么办?

+0

A /为什么不使用HTTP认证? b /为什么不使用会话cookie,它位于http标题中,不需要出现在你的url中? – njzk2

+0

请检查这个答案,看看是否有帮助。 [这里](http://stackoverflow.com/questions/19010067/restful-login-proper-implementation/19024952#19024952) – Satish

回答

3

身份验证和会话是很少真正RESTful的区域,因为它们是有状态的,除非您为每个请求传递完整的身份验证凭证。

这是我做的,和你的相似,只有一个很大的区别。

POST /session/ --> creates a session, passing credentials in HTTP Auth Header 

如果成功,以及会话ID,就像真实资源一样,上面将返回201。它还包含Cookie中的会话令牌(以及特殊的X-类型的HTTP标头),可用于每个后续请求中。

GET /protectedResource --> includes the credential in the HTTP header 

并终止/无效会话,这是一个常见的活动,如点击“注销”

DELETE /session/sessionId 

从你做了什么,唯一真正的区别是,我会从未在查询路径或主体中传递令牌和凭证。唯一的例外是如果你想做基于表单的认证并提交,但即使如此,当我可以的时候,我更喜欢处理Web端并提交为标题。

的原因是2倍:

  1. 你希望能够揭露URL不会暴露任何秘密
  2. 你希望能够重复使用的URL不暴露

HTTP auth的另一个优点是(它在头文件中)是它变得很容易使用curl来测试你的REST API:

curl --user username:pass http://server/protectedResource 

而且你甚至可以生成会话令牌并在curl中使用它们。

如果你是舒服的NodeJS,你可以看一下README和源代码cansecurity http://github.com/deitch/cansecurity

0

也许你应该遵循一个稍微不同的方式,以 “让用户令牌”(或身份验证令牌):

POST /认证/ {用户名}(在HTTP头中的密码)

或类似的东西,这个想法是,你想要的“资源”是特定用户的“令牌”或“身份验证令牌”。您使用的POST不是非常“RESTful”,因为您在资源“会话”上张贴,所以它可能是“会话的详细信息”...

关于PUT/GET,我认为这似乎是“正确的”,即您在每个请求中发送令牌以对“资源”进行操作。

关于DELETE,我不确定这是否会发生......这可能是您在服务器(Web服务)逻辑中定义的东西,例如:令牌的TTL。我不认为“客户端”应该能够删除令牌,但也许你有其他一些要求。

只是最后一次提醒,要非常小心地以“纯文本”使用它,即始终通过加密通道(例如:HTTPS)在HTTP标头中发送此信息(密码和令牌)。此外,有几种方法(如HTTP基本认证)已经实现了这种认证,你应该看看它们。