PWA 不支持 Cookie 导致的问题及解决参考

PWA(Progressive Web Apps)是一种让我们在移动端和桌面端提供类似于原生应用的体验的技术。它们可以在离线状态下工作,并具有许多安装原生应用才可使用的功能。但是,与传统网站不同的是,PWA 有一个严重的限制:它们不支持 Cookie。

在本文中,我们将讨论 PWA 不支持 Cookie 导致的问题,以及可行的解决方案。

问题:PWA 不支持 Cookie

当用户首次访问您的 PWA 时,您无法为其设置 Cookie。这意味着您无法使用基于 Cookie 的身份验证和授权,也无法使用跨站请求伪造(CSRF)保护,因为它需要使用 Cookie 来工作。

那么,如果没有 Cookie,如何在 PWA 中实现身份验证和授权呢?这涉及到一个在 PWA 中使用的新流程:Web Authentication。

解决方案:使用 Web Authentication

Web Authentication 是一个新的 Web API 标准,它提供了一种在 PWA 中进行身份验证和授权的方法,而无需使用 Cookie。它基于公钥加密 / 解密机制来实现。

在 Web Authentication 中,用户首先通过用户名和密码登录,然后系统将生成一个公钥 / 私钥对。公钥将被保存在服务器上,而私钥将保存在用户的设备上。

下面是一个示例代码,展示了如何使用 Web Authentication 来进行身份验证:

----- -------- -------------- -
  ----- ----- - ----- ------------------------------
    ---------- -
      ---------- --- ------------ -- ------- -- ---
      --- -
        ----- ------
      --
      ----- -
        ----- ------------------
        ------------ ---- --------
      --
      ----------------- --
        ----- -------------
        ---- --
      --
    -
  ---
  -- -------------------
-

----- -------- --------------- -
  ----- ----- - ----- ---------------------------
    ---------- -
      -------- -----
      ----- ----------
    -
  ---
  -- ----------------
-

上述代码仅用于演示目的,实际使用时需要编写更多代码来处理 Web Authentication 流程的各个步骤。

总结

PWA 的 Cookie 限制可能会阻碍某些功能的实现,但是通过 Web Authentication,我们可以在 PWA 中实现身份验证和授权而无需使用 Cookie。虽然这需要编写更多的代码,但是这一解决方案为 PWA 在身份验证和授权等方面的使用提供了灵活性和安全性。

参考文献

  1. Using the Credential Management API
  2. Web Authentication: An API for accessing Public Key Credentials Level 1

来源:JavaScript中文网 ,转载请联系管理员! 本文地址:https://www.javascriptcn.com/post/64cc38bc5ad90b6d0424f9f3


猜你喜欢

  • SSE 如何保证消息的完整性及有效性

    前言 在前后端分离的开发模式下,前端通过 Ajax 或其他技术请求服务器数据,并将数据用于页面呈现。随着对实时性和性能的要求越来越高,基于 HTTP 长连接的 Server-Sent Events(S...

    1 年前
  • Deno 中如何解决 CSP 限制的问题?

    在前端开发中,CSP(Content Security Policy)用于限制页面可以加载的资源源,从而提高页面的安全性。然而,当我们在 Deno 中使用浏览器的 Web API 时,CSP 会对我们...

    1 年前
  • 如何使用 Jest 测试一个 RESTful API?

    在前端开发中,测试是一个很重要的环节,能够确保代码的质量和稳定性。Jest 是一个流行的 JavaScript 测试框架,被广泛用于前端和 Node.js 开发。在这篇文章中,我们将介绍如何使用 Je...

    1 年前
  • ES7 引入的 Object.values/Object.entries 方法 - 更容易操作对象

    在 JavaScript 中,我们经常需要操作对象(Object)来访问、修改或者遍历对象的属性。在 ES6 中,我们已经使用了比较方便的 Object.keys 方法来获取对象的所有键(keys),...

    1 年前
  • RESTful API 之 HTTPS 的多种实现方式

    前言 在使用 RESTful API 进行前后端交互时,使用 HTTPS 进行加密传输已经成为了必备的选择。HTTPS 可以有效地避免信息被窃听、篡改和冒充等问题。

    1 年前
  • 使用 Express 和 MongoDB 实现网站登录功能

    在现代化的 Web 应用程序中,网站登录功能是必不可少的。Express 是一种常见的 Web 应用程序框架,而 MongoDB 是一种常见的 NoSQL 数据库。

    1 年前
  • 用 ES8 的 Object.getOwnPropertyDescriptors() 方法隔离风险对象的属性

    前言 在前端开发中,我们经常需要操作对象的属性。有时候,为了保护对象的数据安全,我们需要限制对象的属性被修改和访问。这时候,我们可以用 ES8 中的 Object.getOwnPropertyDesc...

    1 年前
  • ESLint 报错:Expected indentation of 2 spaces but found 4

    当你使用 ESLint 对你的 JavaScript 代码进行检查时,你可能会遇到这样一个错误:Expected indentation of 2 spaces but found 4。

    1 年前
  • React-Native 与 Redux:让你的移动应用更加高效

    React-Native 是 React 生态圈中的一个重要成员,它通过使用 JSX 和 JavaScript 来构建原生的移动应用程序。Redux 则是一个 JavaScript 应用程序库,它用于...

    1 年前
  • 使用 ES11 的 BigInt 类型实现 JavaScript 的完整数学库 Math

    在过去的 JavaScript 版本中,我们使用原生的 Number 类型来进行数学运算。然而,由于 JavaScript 中 Number 类型的数字精度是有限的,当数字很大或很小时,就会出现精度丢...

    1 年前
  • 从 Serverless 到 Service Mesh,后端架构蜕变路径

    随着互联网技术的飞速发展,后端架构也在不断地演变和升级。从传统的单体应用架构到微服务架构再到 Serverless 和 Service Mesh,每一步的升级都让后端架构更加强大和灵活。

    1 年前
  • Sequelize 实现多租户系统的最佳实践

    Sequelize 实现多租户系统的最佳实践 在产品设计和开发过程中,如果需要支持多用户或多租户(Multi-Tenant)服务,那么加强多租户的数据隔离是必不可少的。

    1 年前
  • 详解 Custom Elements 的衍生类、mixin 以及继承

    前言 Custom Elements 是 Web Components 的标准之一,它允许我们创建一种全新的 HTML 元素,拥有自己的样式和行为。在使用 Custom Elements 的过程中,类...

    1 年前
  • ECMAScript 2021 (ES12) 中如何使用 Optional Chaining 来避免代码 Crash

    在前端开发中,我们经常需要操作对象的属性和方法。然而,当我们访问一个不存在的属性或方法时,代码会崩溃,并抛出 TypeError 异常。这在开发过程中是非常常见的问题,也是很令人头痛的一件事情。

    1 年前
  • 使用 PM2 解决 Node.js 应用进程卡死的问题

    前言 Node.js 是一种使用 JavaScript 编写服务端代码的开发语言,它的高效性和易用性使得它越来越受欢迎。但是,在使用 Node.js 开发应用时,经常会发现进程卡死的问题。

    1 年前
  • 使用 Mongoose 中的 distinct 实现去重

    在处理 MongoDB 数据库时,我们经常会遇到需要进行去重操作的情况。MongoDB 中提供了 distinct 方法来实现去重,而在 Node.js 开发中,我们可以使用 Mongoose 来操作...

    1 年前
  • Docker 中使用 supervisor 进行应用管理

    Docker 中使用 supervisor 进行应用管理 在 Docker 中,我们可以通过 supervisor 来进行应用管理,从而更加方便地进行容器的维护和管理。

    1 年前
  • 精读《ECMAScript 2018 标准》

    前言 作为前端开发人员,我们每天接触最多的就是 ECMAScript 语言,也就是 JavaScript 的标准。随着新标准的不断发布,JavaScript 语言也在不断发展和变化。

    1 年前
  • Vue.js: 使用 provide/inject 和 vuex 实现全局状态管理

    介绍 Vue.js 是一个优秀的前端框架,它提供了诸多方便的功能,其中包括单页面应用程序(SPA)的状态管理机制。SPA的一个主要问题是,全局状态往往需要在多个组件之间共享,如果每个组件都维护一个自己...

    1 年前
  • CSS Flexbox 的 Flex-basis 与 Width 的区别

    CSS Flexbox 是一种流行的布局方式,它可以让我们轻松地创建具有弹性和自适应性的布局。然而,有时候会出现关于 Flexbox 中 flex-basis 属性和 width 属性之间的混淆。

    1 年前

相关推荐

    暂无文章