一般一个有登录功能的网站,用户登录成功后会返回一个 Token,以便在后续操作中进行身份验证。
Token 在客户端存储的方式不只一种,常见的有 Cookie、Local Storage、Session Storage 或直接定义一个变量在内存中存储。
这些方式各有使用场景和利弊,讨论它们不是本文的重点,要了解可查看 此文[1]。本文说的 Service Worker 存储方案也是对上文的提取,算作简单的学习笔记,供以后自己使用时快速参考。
Service Worker
使用步骤:
-
首先在页面中引入 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);
}
);
});
}
-
将登录后获取到的 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);
}
-
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!");
}
});
-
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 文档了解学习。
参考资料
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