使用 Service Worker 存储 Token

一般一个有登录功能的网站,用户登录成功后会返回一个 Token,以便在后续操作中进行身份验证。

Token 在客户端存储的方式不只一种,常见的有 CookieLocal StorageSession Storage 或直接定义一个变量在内存中存储。

这些方式各有使用场景和利弊,讨论它们不是本文的重点,要了解可查看 此文[1]。本文说的 Service Worker 存储方案也是对上文的提取,算作简单的学习笔记,供以后自己使用时快速参考。

Service Worker

使用步骤:

  1. 首先在页面中引入 service worker 文件和作用范围:
if ("serviceWorker" in navigator) {
  window.addEventListener("load"function ({
    navigator.serviceWorker
      .register("serviceWorker.js", { scope"/serviceWorker.html" })
      .then(
        function (registration{
          console.log("ServiceWorker registration succesful!");
        },
        function (err{
          console.log("ServiceWorker registration failed: ", err);
        }
      );
  });
}
  1. 将登录后获取到的 Token 传递给 service worker:
function login({
  fetch("/api/login")
    .then((res) => {
      if (res.status === 200) {
        return res.json();
      } else {
        throw Error(res.statusText);
      }
    })
    .then((data) => {
      navigator.serviceWorker.controller.postMessage({
        type"SET_TOKEN",
        token: data.token,
      });
    })
    .catch(console.error);
}
  1. service worker 将收到的 Token 存储起来:
// Global token variable in the service worker
let token = '';

// Exposed "method" for saving the token
self.addEventListener('message'function(event{
    if (event.data && event.data.type === 'SET_TOKEN') {
        token = event.data.token;
        console.log("[SW] token set!");
    }
});
  1. service worker 拦截 ajax 请求,自动将 Token 植入到请求 headers 中:
// Helper function to add the auth header if the oubound request matches the whitelists
const addAuthHeader = function (event{
  destURL = new URL(event.request.url);

  const modifiedHeaders = new Headers(event.request.headers);
  if (token) {
    modifiedHeaders.append("Authorization", token);
  }
  const authReq = new Request(event.request, {
    headers: modifiedHeaders,
    mode"cors",
  });
  event.respondWith((async () => fetch(authReq))());
};

// Intercept all fetch requests and add the auth header
self.addEventListener("fetch", addAuthHeader);

如是,一个存储 Token 的新方式就诞生了。由于 Token 只存在于 service worker 中,页面中其它 JS 代码访问不到,所以安全性上要高很多


service worker 还有更多的用途,可查阅 mdn 文档了解学习。

参考资料

[1]

How to Store Session Tokens in a Browser (and the impacts of each): https://blog.ropnop.com/storing-tokens-in-browser

– END –


原文始发于微信公众号(背井):使用 Service Worker 存储 Token

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/246823.html

(0)
小半的头像小半

相关推荐

发表回复

登录后才能评论
极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!