客户端使用Cookie的REST API身份验证和授权工作流程

时间:2015-01-06 10:11:15

标签: angularjs rest symfony-2.6

我正在Symfony2中构建一个REST API应用程序,我正在尝试找到一种处理用户身份验证和授权的好方法。有很多解决方案,但到目前为止,它们都没有满足我的所有要求/关注。

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

非常重要
  • 使用用户名和密码登录
  • 使用“记住我”复选框登录“永远”(可能是一周或类似的东西)
  • 同时在不同浏览器中使用“记住我”(如facebook)
  • 从浏览器中删除Cookie以记录用户

在服务器端,我希望保持严格的RESTful。我提出了一个似乎是我需要的解决方案,但我想确保我没有遗漏任何东西。

从服务器的角度成功登录尝试的工作流程:

  1. 使用用户名和密码
  2. 在/ login API端点上接收POST
  3. 生成新令牌并将其返回给客户端。在db中保存该标记的哈希值。
    • 每个令牌数据库条目必须具有预定义的生命周期(在配置中设置)
      • 到期日期时间必须存储在db
      • 旧的令牌哈希值必须在数据库到期时(登录尝试时或通过cron)从数据库中删除
    • 令牌与用户是多对一的 - 用户可以在任何给定时间拥有多个有效令牌
  4. 从服务器的角度授权登录用户的工作流程:

    1. 从授权标头中提取令牌
      • 用户ID也可能包含在请求中,待决定
    2. 哈希令牌并将其与db
    3. 中每个用户的哈希值进行比较
    4. 如果其中一个数据库哈希值与请求哈希值匹配且未过期,则更新哈希值到期并授权用户
    5. 从客户端(GUI)角度尝试成功登录的工作流程:

      1. 使用用户名和密码
      2. 将POST请求发送到/ login API端点
      3. 接收服务器生成的令牌。将其存储在浏览器中的cookie中(使用js,服务器不设置cookie)
      4. 从客户端(GUI)角度授权登录用户的工作流程:

        1. 从cookie中读取令牌并在请求中设置授权标头,例如授权:基本QWxhZGRpbjpvcGVuIHNlc2FtZQ ==
          • 始终从cookie中读取令牌,因为用户可能希望将其删除以在浏览器中登出。
        2. 如果登录失败(cookie已删除或401响应)丢弃所有表单数据,请删除cookie并重定向到登录屏幕。

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

          这个工作流程看起来不错吗?我错过了什么吗?

1 个答案:

答案 0 :(得分:1)

我做了一个名为WebApiSecure的项目,该项目使用 Json Web Tokens(JWT)进行授权 - 基本承载。我相信它会执行您描述的大部分内容,例如允许令牌过期以及添加用户ID或角色。它可能会帮助你做你想做的事。

它是使用Web Api 2构建的,前端可以是AngularJS或基于JQuery。