AngularJS和Slim框架的JWT认证和令牌刷新流程

10
我想知道我迄今为止所做的身份验证/令牌更新方式是否可靠,是否存在任何缺陷或漏洞,因为我试图将数据库交互限制为零。具体如下:
  1. 用户通过正常的用户名/密码或Facebook进行身份验证
  2. PHP后端生成一个带有30分钟过期时间的令牌并将其发送到angularjs客户端
  3. JWT令牌存储在$localStorage中
  4. 每个请求头都使用拦截器注入JWT令牌
  5. 需要身份验证的所有Slim路由都使用中间件检查发送的令牌。
  6. 如果令牌无效(已过期,被篡改,不适用于该特定角色),则Slim将以401/403错误响应。
  7. Angular服务每分钟检查一次令牌是否即将过期
  8. 如果令牌即将过期(剩余5至1分钟),服务会将旧令牌发布到另一个API端点。
  9. API端点检查令牌的有效性,并返回一个新令牌,有效期为30分钟。
  10. 我之前提到的轮询服务将在$ localStorage中替换旧令牌。
  11. 重复以上步骤。
注意:在生产环境中将实施SSL。

1
有一篇关于在哪里存储JWT的好文章。https://stormpath.com/blog/where-to-store-your-jwts-cookies-vs-html5-web-storage/ - Mika Tuupola
@MikaTuupola 感谢您的提示。我将把令牌存储在cookie中以增加保护。我已经实现了那里提到的反CSRF机制,并查看了您的slim-jwt-auth中间件。做得好!我自己编写了一个非常基本的中间件,但是您的绝对优于它。必须尝试一下。除了cookie/localStorage问题,还有什么似乎“错误”的逻辑吗? - Răzvan
1个回答

5
没有必要循环检查令牌过期。我在Angular项目中使用https://github.com/auth0/angular-jwt作为库,它提供了一种在HTTP请求发送之前刷新令牌的方式,简化了身份验证机制。
此外,如果请求加载模板(以.html结尾),您可以从请求中删除令牌,但这只是个人偏好。

谢谢@Valdas,但这个循环有其用途:即使没有用户活动或请求,它也不会让令牌在浏览器打开时过期。至于angular-jwt库提供的所有便利设施,我可能会在我的下一个项目中使用它。 - Răzvan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接