我已经阅读了许多关于使用REST和Angular进行身份验证和授权的SO线程,但仍然感觉对我希望完成的内容没有很好的解决方法。背景是,我计划在AngularJS中构建一个应用程序,我想支持以下功能:
- 有限的访客访问权限
- 一旦通过身份验证,应用程序的基于角色的访问权限
- 通过API进行身份验证
所有对REST API的调用都需要在SSL上进行。我想在不违反RESTful原则的情况下构建应用程序,即不在服务器上存储会话状态。当然,无论在客户端方面采取什么样的授权方式,都必须在服务器端得到强化。由于我们需要通过每个请求传递整个状态,我知道需要传递某种令牌,以便接收REST请求的后端服务器可以对调用进行身份验证和授权。
说到这里,我的主要问题是有关身份验证的最佳实践是什么?看起来有很多不同的方法,这里只列举了我发现的几种:
- http://broadcast.oreilly.com/2009/12/principles-for-standardized-rest-authentication.html
- http://frederiknakstad.com/2013/01/21/authentication-in-single-page-applications-with-angular-js/
- http://docs.aws.amazon.com/AmazonS3/latest/dev/RESTAuthentication.html
有一个类似的问题(AngularJS最佳实践应用程序身份验证),但除非我误解了回答,否则它似乎暗示应使用服务器会话,这违反了RESTful原则。
我对Amazon AWS和George Reese文章的主要担忧是,它似乎假定使用者是程序,而不是终端用户。共享密钥可以提前分配给程序员,然后他们可以使用它来在此处编码调用。但这里并非如此-我需要代表用户从应用程序调用REST API。
这种方法是否足够?假设我有一个会话资源:
POST /api/session
为用户创建新会话
要创建会话,您需要发布包含“用户名”和“密码”的JSON对象。
{
"email" : "austen@example.com",
"password" : "password"
}
Curl示例
curl -v -X POST --data '{"username":"austen@example.com","password":"password"}' "https://app.example.com/api/session" --header "Content-Type:application/json"
响应
HTTP/1.1 201 Created {
"session": {
"id":"520138ccfa4634be08000000",
"expires":"2014-03-20T17:56:28+0000"
}
}
状态码
- 201 - 已创建,已建立新会话
- 400 - 错误请求,JSON对象无效或缺少必要信息
- 401 - 未授权,检查电子邮件/密码组合
- 403 - 拒绝访问,帐户已禁用或许可证无效
为了清晰起见,我省略了HATEOAS的详细信息。在后端,将创建一个新的、有限期的会话密钥并与用户关联。在后续请求中,我可以将其作为HTTP头的一部分传递:
Authorization: MyScheme 520138ccfa4634be08000000
然后后端服务器将负责解析请求,查找关联的用户并强制执行请求的授权规则。它还应该更新会话的过期时间。
如果所有这些都是在 SSL 上进行的,那么我是否需要防范任何可能的攻击?您可以尝试猜测会话密钥并将其放入标头中,因此我可以额外附加一个用户 GUID 到会话密钥中以进一步防止暴力攻击。
我已经有几年没有积极编程了,现在才重新开始。如果我表达不清或者不必要地重复造轮子,请见谅,我只是希望根据我的阅读经验与社区分享我的想法,并查看它们是否通过了实践检验。