Angularjs 在不违反RESTful原则的情况下在Angular中进行身份验证和授权的最佳实践?

Angularjs 在不违反RESTful原则的情况下在Angular中进行身份验证和授权的最佳实践?,angularjs,rest,authentication,single-page-application,Angularjs,Rest,Authentication,Single Page Application,我已经读了很多关于REST和Angular的身份验证和授权的文章,但是我仍然觉得我没有一个很好的解决方案来解决我希望做的事情。出于某些背景,我计划在AngularJS中构建一个应用程序,我想支持: 有限的客人访问 通过身份验证后对应用程序的基于角色的访问 通过API进行身份验证 对RESTAPI的所有调用都需要通过SSL进行。我希望在不违反RESTful原则的情况下构建应用程序,即不将会话状态存储在服务器上。当然,无论在客户端进行什么样的授权,都必须在服务器端加强。因为我们需要在每个请求中传递整

我已经读了很多关于REST和Angular的身份验证和授权的文章,但是我仍然觉得我没有一个很好的解决方案来解决我希望做的事情。出于某些背景,我计划在AngularJS中构建一个应用程序,我想支持:

  • 有限的客人访问
  • 通过身份验证后对应用程序的基于角色的访问
  • 通过API进行身份验证
  • 对RESTAPI的所有调用都需要通过SSL进行。我希望在不违反RESTful原则的情况下构建应用程序,即不将会话状态存储在服务器上。当然,无论在客户端进行什么样的授权,都必须在服务器端加强。因为我们需要在每个请求中传递整个状态,所以我知道我需要传递某种令牌,以便接收REST请求的后端服务器能够对调用进行身份验证和授权

    话虽如此,我的主要问题是关于身份验证——这里的最佳实践是什么?似乎讨论了很多不同的方法,以下是我发现的一些方法:

    有人问了一个类似的问题(),但除非我误解了答案,否则这似乎意味着应该使用服务器会话,这违反了RESTful原则

    我对Amazon AWS和George Reese文章的主要关注点是,它似乎假设消费者是一个程序,而不是最终用户。一个共享的秘密可以提前发布给程序员,然后程序员可以在这里使用它来编码调用。这里不是这样的-我需要代表用户从应用程序调用RESTAPI

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

    POST/api/session

    为用户创建新会话

    要创建会话,您需要发布一个包含“用户名”和“密码”的JSON对象

    卷曲示例

    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"
        }
    }
    
    响应

    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,以进一步防止暴力攻击


    我已经有好几年没有积极编程了,现在我又回到了这里。如果我迟钝或不必要地重新发明轮子,我表示歉意,只是希望根据我迄今为止的阅读,让社区运行我的想法,看看它们是否通过了石蕊测试。

    这是一篇关于使用angular构建的身份验证和登录服务的难以置信的文章


    这个问题很好地总结了我对REST的理解

    如果将令牌存储在会话中,您仍在服务器端创建状态(这是一个问题,因为该会话通常只存储在一台服务器上,可以通过粘性会话或其他解决方案来缓解)

    我想知道您创建RESTful服务的理由是什么,因为这可能不是一个大问题

    如果在主体中随每个请求一起发送令牌(因为所有内容都是用SSL加密的,所以这是可以的),那么可以有任意数量的服务器(负载平衡)为请求提供服务,而无需事先了解状态

    长话短说,我认为以RESTful实现为目标是一个很好的目标,但是当涉及到身份验证和验证授权时,纯粹的无状态肯定会增加一层复杂性

    到目前为止,我已经开始在考虑REST的情况下构建后端,创建有意义的URI并使用正确的HTTP谓词,但为了简化身份验证(不使用多个服务器时),仍然在会话中使用令牌


    我通读了你发布的链接,AngularJS一个似乎只关注客户端,在那篇文章中似乎没有明确提到服务器,他确实链接到另一个(我不是节点用户,所以请原谅我的解释有误)但是,服务器似乎依赖于客户端来告诉它它的授权级别,这显然不是一个好主意。

    当有人询问REST身份验证时,我听从Amazon Web服务的建议,基本上建议“这样做”。为什么?因为,从“群体智慧”的角度来看,AWS解决了问题,被比大多数人更了解和关心安全请求的人大量使用、大量分析和审查。而安全是一个“不重新发明轮子”的好地方。就“站在肩膀上”而言,你可以比AWS做得更糟

    现在,AWS不使用令牌技术,而是使用基于共享机密和有效负载的安全哈希。它可以说是一个更复杂的实现(包括所有的规范化过程等)

    但它是有效的

    缺点是,它要求您的应用程序保留个人共享的秘密(即密码),并且还要求服务器具有访问该秘密的权限