SPA的简单API身份验证方案

时间:2017-05-15 08:53:50

标签: rest api http authentication jwt

我正在使用单个REST API后端搜索SPA Web应用程序的简单身份验证方案。

要求是:

  1. 针对自定义凭据存储的身份验证(应该足够灵活);
  2. 在指定的空闲超时后自动注销用户;
  3. 尊重最佳安全措施。
  4. 目前的想法:

    1. 使用HTTPS;
    2. 创建身份验证API端点;
    3. SPA会将用户凭据传递给身份验证API端点;
    4. 如果验证成功,则API终端会使用令牌进行响应(JWT,包括:用户ID,可选用户ID版本;到期时间设置为现在+允许空闲超时);
    5. SPA将令牌存储在浏览器本地存储中;
    6. 此后,SPA在所有API请求的标头中包含令牌;
    7. 所有受保护的API端点都验证提供的令牌并从中提取用户ID;
    8. SPA跟踪令牌的到期时间,当它接近时,SPA会向身份验证API端点发送续订请求(不包括凭据,只有当前令牌);
    9. 身份验证API端点处理续订请求,并使用新令牌或401状态代码进行响应。
    10. 我预计这种方法会带来以下好处:

      1. simplilicy - 需要2个后端组件(身份验证API端点和令牌验证/解析实用程序)+ 3个SPA组件(登录,刷新,将令牌插入请求标头);
      2. 灵活性 - 令牌仅包含身份识别声明,它不以任何方式限制访问控制实施,也不限制基础身份验证方案;
      3. 无需会话 - 无需查询会话存储,可能对性能有利;
      4. 使单个用户令牌无效的能力 - 可以通过增加(或更改)用户存储中的用户ID版本来实现。
      5. 所以问题是:

        我错过了什么? 这个方案有什么缺点吗?

1 个答案:

答案 0 :(得分:0)

为什么JWT可能不适合您的用例的一些反驳论点:

  

在指定的空闲超时后自动注销用户;

由于JWT令牌是不可变的,因此您无法检查用户闲置的时间(因为您无法检查上次操作的时间)

也没有好的方式"撤销令牌。可能的方法是:

  • 使用短暂的到期时间(用户必须经常重新登录)
  • 保留一份撤销令牌的黑名单(你基本上提出的是什么,但那时你的申请不会成为无国籍)
  • 更改密钥(但会使所有用户的所有现有令牌无效)

- 他们都有自己的缺点。

  

不需要任何会话 - 不需要查询会话存储,可能是它   对表现有好处;

     

使单个用户令牌无效的能力 -   可以通过增加(或改变)用户的用户ID版本来实现   存储。

如果您的应用程序是无状态的,那么这对性能会有好处,但这样做会将状态保留在用户存储中。