设计RESTful身份验证API

时间:2013-10-08 07:54:48

标签: api security rest authentication

我想在我的应用程序中使用RESTfull Authentication API。想象一下以下结构:

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

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

使用令牌更新并获取受保护的资源:

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

删除令牌(注销):

DELETE /session/{token}

问题:此API是RESTfull吗?如果不是,我该怎么做?

2 个答案:

答案 0 :(得分:2)

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

这就是我所做的,与你的相似,但有一个很大的区别。

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

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

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

终止/无效会话,这是一项常见活动,例如点击“退出”

DELETE /session/sessionId

与您所做的唯一真正区别在于,我永远不会在查询路径或正文中传递令牌和凭据。唯一的例外是如果你想进行基于表单的身份验证并提交,但即使这样,当我可以时,我更喜欢处理Web端并提交为标题。

原因是2倍:

  1. 您希望能够在不暴露任何秘密的情况下公开URL
  2. 您希望能够重复使用该网址而不会泄露
  3. HTTP身份验证的另一个优点(位于标题中)是使用curl 极其更容易测试REST API:

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

    你甚至可以生成会话令牌并在卷曲中使用它们。

    如果您对nodejs感到满意,可以查看cansecurity的http://github.com/deitch/cansecurity

    的自述文件和源代码。

答案 1 :(得分:0)

可能您应该采用略微不同的方法来“获取用户令牌”(或身份验证令牌):

  

POST / authentication / {username}(在HTTP标头中包含密码)

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

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

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

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