身份验证和会话是很少真正 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 端并作为标头提交。
原因有两个:
- 您希望能够在不暴露任何秘密的情况下公开 URL
- 您希望能够在不暴露的情况下重用 URL
HTTP auth(在标头中)的另一个优点是使用 curl 测试 REST API 变得非常容易:
curl --user username:pass http://server/protectedResource
您甚至可以生成会话令牌并在 curl 中使用它们。
如果您对 nodejs 感到满意,可以查看 cansecurity http://github.com/deitch/cansecurity的 README 和源代码