chrome插件如何与web实现单点登录

chrome插件中,我们通常会看到在插件端登录操作会跳转到第三方独立的web去登录,一旦web登录,返回到插件端,一刷新页面,插件就自动登录了。这是如何实现的呢?本文是插件web端钱包的单点登录的一篇总结笔记,希望在项目中有所帮助。

本文主要会从以下几点思考插件的单点登录

  • web端与插件如何通信
  • 插件web端如何信息共享
  • 内部插件content通信机制

postMessage

我们知道在web端一个网站与iframe内嵌的另一个网站可以通过postMessage通信,而我们的插件是挂载在content中的,所以我们可以通过postMessage通信吗?

web端我想过postMessage发送信息给插件

bash 复制代码
// web
window.postMessage({data: "hello word"}, "*")

插件端

bash 复制代码
// chrome plugin content
window.addEventListener("message", (data) => {
    console.log(data);
})

由于在插件端排除了插件,所以很显然postMessage与插件的通信基本没有希望。

插件如何与web信息共享

首先我们看一张图,如果插件与web信息共享

插件登录,跳转到web端,web端连接钱包后,插件端刷新就自动登录了。

在web端登录后,插件端刷新页面,插件就自动登录了,后续只要web断链钱包,那么插件端就会断连了。

单点登录最核心是共享cookie

我们先看web端,以伪代码模拟登录

js 复制代码
// http://localhost:3000
// util.ts
import Cookies from "js-cookie";
export const cookieUtil = {
  // 设置cookie
  setCookie: (name, value, options) => {
    Cookies.set(name, value, options);
  },

  // 读取cookie
  getCookie: name => {
    return Cookies.get(name);
  },

  // 删除cookie
  removeCookie: name => {
    Cookies.remove(name);
  }
};

App.tsx

js 复制代码
// http://localhost:3000
// App.tsx
import { cookieUtil } from './util';
const handleLogin = () => {
  cookieUtil.setCookie("xToken", "asdtest", {});
}
handleLogin();

插件端的content中向background发送消息

js 复制代码
// content.js
chrome.runtime.sendMessage({
  type: "getCookie",
});

backrgound.js中接收这个消息

js 复制代码
// 在background.js中监听content发送过来的消息,chrome.runtime.onMessage
chrome.runtime.onMessage.addListener((request, sender, sendResponse) => {
    const { type } = request;
    if (type === "getCookie" && chrome.cookies && chrome.cookies.get) {
    chrome.cookies.get(
      { url: "http://localhost:3000/", name: "xToken" },
      async (res) => {
        const [tab] = await chrome.tabs.query({
          active: true,
          currentWindow: true,
        });
        await chrome.tabs.sendMessage(tab.id, { xToken: res.value });
      }
    );
  }
});

我们在background.js中读取了指定web页的cookie,然后通过chrome.tabs.sendMessage(tab_id, {xToken: 'xxx'})发送给了contentcontent.js中,我们接收background.js发送过来的消息

js 复制代码
// content.js
chrome.runtime.onMessage.addListener((request, sender, sendResponse) => {
    const {xToken} = request;
    console.log(xToken);
    if (xToken) {
      console.log('登录了')
    } else {
      console.log('没登录')
    }
  });

至此你从插件端拿到web端设置的cookie,那么就可以判断只要web端登录了,那么插件端检测到cookie,那么就自动登录了。

在使用插件读取cookie需要注意几点

  • content中使用chrome无法获取cookie
js 复制代码
// error
chrome.cookies.get
  • 使用cookie必须在manifest.jsonpermissions必须有cookie
js 复制代码
{
    "host_permissions": [
    "http://localhost:3000/"
  ],
   "permissions": ["cookies"],
}

总结

  • postMessage无法与插件通信,因为当前插件屏蔽了插件

  • web端设置cookie,在插件端的background读取web端的cookie,然后把cookie传送给content,在content中通过获取的cookie判断是否登录

  • 插件访问cookie只能在backgroud.js中访问,无法直接在content.js中访问,只能在background.js发送信息给content.js

相关推荐
子兮曰19 小时前
jev-ultrafast 深度解析:7 秒订机票的浏览器 Agent 是如何炼成的
前端·后端·agent
子兮曰19 小时前
Jev 爆发一周:7 秒 Agent 背后的 System One 生态与三场争议
前端·后端·ai编程
前端小万19 小时前
写公众号赚了 3000 块后,我做了一款叫 "一键成稿" 的软件
前端·微信小程序
爱勇宝19 小时前
ZCode 开源 24 小时:一份没有历史的账本,回答不了"有没有偷代码"
前端·后端·chatglm (智谱)
三十而立洋20 小时前
Cookie 详解:从产生到安全,一次讲透
前端·javascript
卡布鲁21 小时前
把一个 Vite + Vue3 应用塞进 qiankun (React + Umi3) 主站:十个坑的复盘
前端·javascript·react.js
汉堡大王95271 天前
Jev:不是聊天机器人, 而是一个智能 if 语句
前端·人工智能·后端
梦想很大很大1 天前
从运行事实到回归证据:Workrun 的 Telemetry 与 Evaluation 实践
前端·人工智能·后端
计算机魔术师1 天前
Meta Muse agent 接入 Shopify 的 Shop Pay 实现代理式购物
前端
沙蒿同学1 天前
我用 Go 搭了一条 AI Agent 流水线:从 1 张商品图到一整套淘宝详情页
前端·javascript·后端