Angularjs 客户端带有cookie的REST API身份验证和授权工作流

Angularjs 客户端带有cookie的REST API身份验证和授权工作流,angularjs,rest,symfony-2.6,Angularjs,Rest,Symfony 2.6,我正在Symfony2中构建一个restapi应用程序,并试图找到一种处理用户身份验证和授权的好方法。有很多解决方案,但到目前为止,没有一个解决了我所有的需求/顾虑 该API主要由AngularJS SPA使用,其中用户使用用户名和密码组合登录。让GUI用户能够: 使用用户名和密码登录 使用“记住我”复选框“永远”登录(可能一周左右) 同时在不同浏览器中使用“记住我”(如facebook) 从浏览器中删除Cookie以注销用户 在服务器端,我希望保持严格的RESTful。我想出了一个解决方案

我正在Symfony2中构建一个restapi应用程序,并试图找到一种处理用户身份验证和授权的好方法。有很多解决方案,但到目前为止,没有一个解决了我所有的需求/顾虑

该API主要由AngularJS SPA使用,其中用户使用用户名和密码组合登录。让GUI用户能够:

  • 使用用户名和密码登录
  • 使用“记住我”复选框“永远”登录(可能一周左右)
  • 同时在不同浏览器中使用“记住我”(如facebook)
  • 从浏览器中删除Cookie以注销用户
在服务器端,我希望保持严格的RESTful。我想出了一个解决方案,这似乎是我所需要的,但我想确保我没有遗漏任何东西

从服务器的角度来看,成功登录尝试的工作流:
  • 使用用户名和密码在/登录API端点上接收POST
  • 生成新令牌并将其返回给客户端。在db中保存该令牌的哈希。
    • 每个令牌数据库项必须具有预定义的生存期(在配置中设置)
      • 过期日期时间必须存储在数据库中
      • 旧的令牌哈希在过期时必须从db中删除(登录尝试时或通过cron)
    • 令牌与用户是多对一的-用户在任何给定时间都可以有多个活动令牌
  • 从服务器的角度对登录用户进行授权的工作流:
  • 从授权头中提取令牌
    • 用户id也可能包含在请求中,有待决定
  • 哈希标记,并将其与数据库中用户的每个哈希进行比较
  • 如果其中一个db哈希与请求哈希匹配且未过期,则更新哈希过期并授权用户
  • 从客户端(GUI)的角度来看,成功登录尝试的工作流:
  • 使用用户名和密码向/login API端点发送POST请求
  • 接收服务器生成的令牌。将其存储在浏览器中的cookie中(使用js,服务器不设置cookie)
  • 从客户端(GUI)的角度对登录用户进行授权的工作流:
  • 从cookie中读取令牌并在请求中设置授权头,例如授权:Basic QWXHZGRPPBJPCGVUIHNLC2FTZQ==
    • 始终从cookie中读取令牌,因为用户可能希望删除它以在浏览器中注销自己
  • 如果登录失败(cookie已删除或401响应),则放弃所有表单数据,删除cookie并重定向到登录屏幕

    显然,存储在客户端的cookie会在每次请求时传递给服务器,因为cookie就是这样做的,但服务器会忽略它。cookie仅适用于客户端。增加的带宽开销可以忽略不计


    这个工作流程看起来正常吗?我遗漏了什么吗?

    我做了一个名为的项目,它使用Json Web令牌(JWT)进行授权-基本承载。我相信它可以完成您描述的大多数事情,比如允许令牌过期和添加用户id或角色。它可能会帮助你做你想做的事情


    它是使用WebAPI2构建的,前端可以是基于AngularJS或JQuery的

    您是否考虑过使用本地存储而不是cookie。您选择Cookie的具体原因是什么?如果您没有将Cookie发送到服务器,为什么要使用它们?您不能使用本地存储或某些客户端方法来存储它。我们在一个系统上进行了笔试,其中一个标记是可以通过客户端代码修改的cookies。通过在不同浏览器上同时使用“记住我”(如facebook)“你是说记住我是共享的吗?即我在Firefox中打了勾,所以Chrome应该使用它?如果是这样,我认为那是不可能的。Cookie、缓存和本地存储对每个浏览器都是本地的。Cookie将您限制为基于浏览器的客户端-如果您希望在将来提供API(用于本机应用程序),则这对您没有好处。此外,请确保您添加了CSRF保护