2

我想在我的应用程序中使用 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 的吗?如果没有,我该怎么做?

4

2 回答 2

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 端并作为标头提交。

原因有两个:

  1. 您希望能够在不暴露任何秘密的情况下公开 URL
  2. 您希望能够在不暴露的情况下重用 URL

HTTP auth(在标头中)的另一个优点是使用 curl 测试 REST API 变得非常容易:

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

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

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

于 2013-10-08T09:24:26.637 回答
0

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

POST /authentication/{username}(在 HTTP 标头中带有密码)

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

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

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

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

于 2013-10-08T08:03:55.047 回答