单页应用程序:身份验证令牌管理和浏览器刷新

use*_*331 9 javascript browser api angularjs single-page-application

在处理Angular应用程序时,我有一个单页应用程序,它与JSON Web服务进行数据通信.

我的Angular应用程序中的"登录"实际上只是为令牌交换用户名/密码.该令牌作为所有后续请求的标头传递,因此服务器可以对其进行授权.这很有效,直到用户刷新浏览器窗口当然(通过刷新或离开"页面"并返回).

显然,一种选择是让用户再次输入他们的用户名/密码,但这似乎是没有任何用户的好方法.

我可以想到4种选择:

  1. 将令牌存储在安全会话cookie中.(我现在正在做什么.我只是在使用,所以客户端可以读取.在服务器上没有使用或想要.)
  2. 使用某种本地存储来存储令牌.(不安全,需要手动过期维护.)
  3. 阻止用户使用一些"onbeforeunload"代码刷新浏览器.(我不喜欢当我得到"你确定要离开这个页面"的消息时,我认为其他人也有同感.)
  4. 包含令牌作为网址的一部分.(可能会使url看起来大而且凌乱.可能存在物理安全风险.可能会因书签和过期令牌而进行额外的工作.)

选项1是此功能的最佳选择吗?有没有比这些更好的事情?

Ale*_*Pop 2

我认为选项 1 最适合您的用例。所有主要的 Web 框架都支持此选项。

如果您需要手动处理此问题,则需要确保执行以下步骤:

  • Web 服务将通过创建和设置安全身份验证 cookie 来处理初始身份验证请求。auth cookie应该是基于时间的(仅在特定时间间隔内有效),并且如果可能的话,其值应该是唯一的值;
  • 在初始身份验证请求之后,所有后续请求将自动通过请求标头传递身份验证 cookie - 这是由浏览器处理的。
  • Web 服务需要通过验证 cookie 值并在 cookie 过期时返回错误来处理后续请求中基于 cookie 的身份验证。
  • 您需要确保客户端全局身份验证处理程序捕获任何身份验证异常并向用户显示友好的消息。