【发布时间】:2017-04-26 17:07:22
【问题描述】:
我开始使用 django-rest 框架作为后端的 Angular 2 单页应用程序的身份验证系统。我还想要某种“记住我”功能,让用户在一定时间内保持登录状态。
从我目前阅读的内容来看,这种 Angular 2 SPA/REST API 的最佳身份验证方法似乎是使用 jwt(json Web 令牌)。对于 jwt 身份验证,我查看了 django-rest-framework-jwt (https://github.com/GetBlimp/django-rest-framework-jwt)。
我看到的问题是令牌需要有很短的生命周期(几分钟到几个小时......),以便在令牌被盗时最大限度地减少安全问题。令牌现在需要经常刷新,以避免用户在使用应用程序时断开连接。在这种情况下,“记住我”功能会带来问题,因为令牌的生命周期很短。
我想到了一个解决方案,其中涉及将用作刷新令牌的第二个令牌。它将是不透明的,具有更长的寿命,并且将包含特定于用户的信息(IP 地址或类似的东西),因此如果它被盗,特定于用户的不同信息将使此刷新令牌无效。
以下是我的问题:
1- 我想知道它们是否是解决此问题的现有解决方案。对于任何安全/身份验证问题,我更愿意依靠经过良好测试的解决方案来避免我的 API 受到损害。
2- 基于特定用户信息的刷新令牌是个好主意吗?
3- 还有什么其他想法可以实现我想要的吗?
【问题讨论】:
-
记住我功能是可选的还是所有用户都没有选择?
-
@JJB 最后,我希望“记住我”功能是可选的。但第一步,所有用户都可以。
-
我对 django-rest-framework-jwt 本身不太确定,你能选择 JWT 中存储哪些数据吗?您可以让它返回 2 个不同的刷新令牌: REMEMBER ME 版本 如果在登录时选择了记住我,您将返回一个过期时间更长的刷新令牌,还包括 JWT 中的其他数据,如您所说的 IP 甚至浏览器指纹。您将需要一种方法来撤销刷新令牌。 NONE REMEMBER ME 版本刷新令牌将返回一个短暂的过期时间。
-
会话 cookie 非常类似于令牌,但它们已内置到期并随 Django 一起提供。最好只使用 Django 会话而不是令牌。
-
@RossRogers 我曾考虑过使用 Django 会话,但我计划将相同的 Rest-API 用于移动应用程序。我没有对此主题进行大量研究,但似乎 Django 会话不适用于移动应用程序。但是,是的,使用会话将是解决我的问题的一个很好的临时解决方案......
标签: django authentication angular django-rest-framework jwt