3

我正在构建一个带有 API 后端的 Angular 应用程序。综合一些建议,我构建了带有令牌身份验证风格的 API。流程大致如下:

  1. 使用凭据发布到登录端点
  2. 验证凭据和授权,然后生成新令牌
  3. 将令牌返回给客户端
  4. 客户端通过 HTTP Basic 使用令牌访问 API 资源

这一切都运作良好。基于此令牌创建会话时会出现问题。我不认为我应该简单地将客户端上的令牌保存在 cookie 中,但我确实需要一个会话来在页面刷新等之间持续存在。我的 Angular 应用程序是无状态的,并且完全通过 API 调用填充。

我正在寻找有关在客户端上保留此令牌的建议。我觉得将令牌保存在 cookie 中是有危险的,因为 cookie 可能会被盗并仅用于作为其他人进行身份验证,但也许这是不正确的。

提前感谢你的帮助!

4

2 回答 2

1

我识别用户的唯一已知方法是在客户端上使用一些令牌。HTTP 是无状态的,无法知道哪个请求来自哪个用户(浏览器)。您无法通过他的 IP 地址识别用户(许多用户在路由器后面并共享连接)。您可以尝试浏览器指纹识别,它可以在某些浏览器上运行,但不能在所有浏览器上运行。

我建议使用 cookie 将此令牌存储在客户端上。它们会在每次请求时发送到服务器,您可以采取一些保护措施来防止它们被盗。

要保护此 cookie 免受中间人攻击,您需要使用通过 HTTPS 到服务器的加密连接。

在 cookie 上设置以下属性:

HTTPOnly: cookie 不能被 javascript 访问(XSS 保护)

安全:cookie 只会通过 https 发送

路径:cookie 将仅在指定路径上发送,例如 /login

我还将在 cookie 上定义一个过期日期,因此 cookie 在 2 天左右内无效。

但你是对的。如果此令牌被盗,其他人可以作为该用户登录。

于 2013-10-24T21:04:28.537 回答
0

由于它是一个 Angular 应用程序,我假设所有经过身份验证的方法都只会提供给 ajax 请求(你可以告诉你的服务器只响应 ajax),在这种情况下,CORS 会帮助你。

完全安全的唯一方法是 HTTPS,但是这种方法可能比您想象的更安全。阅读 CORS 以获取更多信息,但本质上的想法是服务器将仅响应来自同一域提供的 html 页面的 ajax 请求。

通常会发送飞行前 OPTIONS 请求来验证这一点。浏览器在实际请求之前发送一个带有 Origin 标头(页面来源)的 OPTIONS 请求。如果源与接收它的服务器的域匹配,则允许后续请求。否则,违反同源政策,将被拒绝。

这可以防止有人嗅出令牌并从您的服务器未服务的页面发送带有令牌的请求(例如在黑客本地计算机上运行的东西)。

如果您正在进行信用卡交易或任何超级安全的事情,您应该使用 HTTPS。

http://en.wikipedia.org/wiki/Cross-origin_resource_sharing

于 2013-10-24T20:59:35.907 回答