首页 > 解决方案 > PWA 的 API 身份验证

问题描述

设置

我们正在构建一个 PWA(渐进式网络应用程序)。主要组件是应用程序外壳 (SPA) 和 API。REST API 将提供应用程序所需的数据,而 SPA 将处理其余部分(根据 Google 推荐)。

问题

最终用户的身份验证似乎有问题,因为需要考虑 Web 浏览器。我们希望通过关闭浏览器来保持用户登录。我们已经对可能的解决方法进行了研究,但是我们想确保我们不会走错方向。

我们考虑过的解决方案

基于会话的身份验证- 用户将用户名和密码发送到 /accounts/auth 并接收带有会话 ID 的仅 HTTP cookie。会话需要存储在数据库或 Redis 中。这个选项的问题是 cookie 是由浏览器自动发送的,因此我们需要一个 CSRF 保护。使用同步器令牌模式,每次发出状态更改请求(例如 POST)时都会生成一个新令牌。这意味着应用程序需要为每个请求提供一个 CSRF 令牌,以便 PWA 可以通过 AJAX 发送它。我们认为这并不理想,因为用户可以快速连续发送多个帖子请求,导致其中一些请求失败并导致糟糕的用户体验。

我们也可以在没有 CSRF 的情况下使用这种方法,方法是将 CORS 策略限制在同一个域,并添加一个从技术上讲应该停止所有 CSRF 的标头要求,但是我们不确定它的安全性如何。

基于 JWT 令牌的身份验证- 用户将用户名和密码发送到 /accounts/auth 并发出新的 JWT 令牌。然后需要将 JWT 存储在localstoragecookie中。使用 localstorage 意味着 JWT 存在XSS 漏洞,如果令牌被盗,攻击者可以完全冒充用户。使用 cookie 我们仍然需要解决CSRF 问题。我们考虑了双重提交 cookie方法,但 CSRF 只会在每次重新发布 JWT 时刷新,这会为攻击者创建一个窗口以找出 CSRF 是什么。目前尚不清楚哪种方法最好使用。

基于会话的身份验证 + JWT 令牌身份验证- 用户将用户名和密码发送到 /accounts/auth,创建会话,在浏览器中设置仅 HTTP cookie,并将 JWT 令牌发送回用户。PWA 可以使用 JWT 对请求进行身份验证,并且每当 JWT 过期时,应用程序会再次调用 /accounts/auth 以获取新请求。/accounts/auth 端点仍然需要受 CSRF 保护,但是它对可用性的影响将被最小化。

似乎有大量文章声称localStorage不安全并且不应该使用,那么为什么像亚马逊这样的知名组织仍然推荐它呢?https://github.com/aws/amazon-cognito-auth-js - 此 SDK 使用localStorage存储令牌。

标签: authenticationsessionprogressive-web-appsapi-designjwt-auth

解决方案


这是我的看法。

JWT 令牌身份验证:通过这种方法,您始终可以使用一个有时间限制的令牌,其到期时间设置为 2 小时或什么?

或者另一种方法是尝试看看如何使用凭据管理 API建议的一些方法,例如,用户回来时自动登录。

例如,使用OTP进行两步验证;对于您的网络应用程序中非常重要的功能,可以选择。在这种情况下,基本内容与您拥有的任何一次身份验证方法相关联。

实际上,您还可以使用用户定义的 pin 码或短代码(在银行应用程序中经常看到)来授予对 Web 应用程序中某些功能的访问权限。

希望这会有所帮助,或者激发一些想法。


推荐阅读