小编aus*_*rum的帖子

在不破坏RESTful原则的情况下,Angular中的身份验证和授权的最佳实践?

我已经阅读了很多关于使用REST和Angular进行身份验证和授权的SO线程,但我仍然觉得我对我希望做的事情有一个很好的解决方案.对于某些背景,我打算在AngularJS中构建一个我想要支持的应用程序:

  1. 有限的访客访问
  2. 经过身份验证后对应用程序的基于角色的访问
  3. 通过API验证

所有对REST API的调用都需要通过SSL进行.我想在不破坏RESTful原则的情况下构建应用程序,即不保持会话状态存储在服务器上.当然,在客户端进行的任何授权都必须在服务器端得到加强.由于我们需要在每个请求中传递整个状态,因此我知道我需要传递某种令牌,以便接收REST请求的后端服务器可以对该调用进行身份验证和授权.

话虽如此,我的主要问题是身份验证 - 这里的最佳做法是什么?似乎讨论了很多不同的方法,这里只是我发现的一些方法:

有一个类似的问题(AngularJS最佳实践应用程序身份验证),但除非我误解了答案,否则似乎意味着应该使用服务器会话,这违反了RESTful原则.

我对Amazon AWS和George Reese文章的主要关注是它似乎假设消费者是一个程序,而不是最终用户.可以提前向程序员发出共享密钥,然后可以使用它在此处对呼叫进行编码.这不是这种情况 - 我需要代表用户从应用程序中调用REST API.

这种方法是否足够?假设我有一个会话资源:

POST/api/session

为用户创建新会话

要创建会话,您需要POST一个包含"username"和"password"的JSON对象.

{
    "email" : "austen@example.com",
    "password" : "password"
}
Run Code Online (Sandbox Code Playgroud)

卷曲示例

curl -v -X POST --data '{"username":"austen@example.com","password":"password"}' "https://app.example.com/api/session" --header "Content-Type:application/json"
Run Code Online (Sandbox Code Playgroud)

响应

HTTP/1.1 201 Created {
    "session": {
        "id":"520138ccfa4634be08000000",
        "expires":"2014-03-20T17:56:28+0000"
    }
}
Run Code Online (Sandbox Code Playgroud)

状态代码

  • 201 - 建立了新会议
  • 400 - 错误请求,JSON对象无效或缺少必需信息
  • 401 - 未经授权,检查电子邮件/密码组合
  • 403 - 拒绝访问,禁用帐户或许可证无效

为清楚起见,我将HATEOAS细节遗漏.在后端,将创建一个新的,有限持续时间的会话密钥并与用户相关联.在后续请求中,我可以将其作为HTTP标头的一部分传递:

Authorization: MyScheme 520138ccfa4634be08000000 
Run Code Online (Sandbox Code Playgroud)

然后,后端服务器将负责从请求中消化此内容,查找关联用户并强制执行请求的授权规则.它应该也可以更新会话的到期时间.

如果所有这一切都发生在SSL上,我是否会对任何我应该保护的攻击敞开大门?您可以尝试猜测会话密钥并将它们放在标头中,因此我想我还可以在会话密钥中附加用户GUID以进一步防止暴力攻击.

我已经积极编程已经有几年了,我刚刚回到这里.抱歉,如果我是钝的或不必要地重新发明轮子,只是希望社区根据我的阅读目前运行我的想法,看看他们是否通过了试金石.

authentication rest angularjs single-page-application

41
推荐指数
2
解决办法
4万
查看次数