Javascript 使用firebase auth限制浏览器扩展上下文菜单

Javascript 使用firebase auth限制浏览器扩展上下文菜单,javascript,firebase,google-chrome-extension,firebase-authentication,Javascript,Firebase,Google Chrome Extension,Firebase Authentication,我对浏览器扩展有点小问题。我试图用密码锁定一些网站,我想让用户能够使用context menù将网站添加到黑名单中。因为我不想依赖chrome存储或indexedDB,所以我考虑使用firestore创建黑名单,并在浏览器启动时检索它。问题就在这里。要实现这一点,假设用户使用google帐户登录。我可以使用identity api或firebase auth登录用户,问题是这样每个用户都会有自己的黑名单,这并不是我真正想要的,我希望如果用户A在登录后将网站添加到黑名单中,用户B将无法解锁该网站,

我对浏览器扩展有点小问题。我试图用密码锁定一些网站,我想让用户能够使用context menù将网站添加到黑名单中。因为我不想依赖chrome存储或indexedDB,所以我考虑使用firestore创建黑名单,并在浏览器启动时检索它。问题就在这里。要实现这一点,假设用户使用google帐户登录。我可以使用identity api或firebase auth登录用户,问题是这样每个用户都会有自己的黑名单,这并不是我真正想要的,我希望如果用户A在登录后将网站添加到黑名单中,用户B将无法解锁该网站,直到用户A将其从黑名单中删除。这可能吗,我能有一些建议吗

我发现的另一个问题是关于上下文菜单。是否可以手动启用或禁用上下文菜单语音?我希望用户A在登录后能够使用上下文菜单,而用户B将不会看到它。这可能吗

黑名单代码

// this is the code I'm using to check / add / remove websites from indexedDB
// I want to switch db to firestore 

import nedb from "nedb-promises";
import CryptoJS from "crypto-js";

const db = {}

db.protectedSites = nedb.create({
  filename: "blocked_sites",
  autoload: true  
});


let protectedWebsites = [];
let authInfo = {};

/* */
db.protectedSites.find({}).then( (results) => {
  if( results.length > 0 ){
    results.forEach( (url) => {
      protectedWebsites.push(url.siteUrl);
    });
    chrome.webRequest.onBeforeRequest.addListener( checkProtectedSitesRequests ,{ 
      urls: protectedWebsites, 
      types: ["main_frame"] 
    },["blocking"]);
  }
});

const checkProtectedSitesRequests = (details) => {  
  const siteUrl = `${details.url}*`;
  db.protectedSites.findOne({ siteUrl }).then( (result) => {
    authInfo.url = details.url;
    authInfo.hash = result.password;
  });
  return { redirectUrl: chrome.runtime.getURL("blocked.html") }
}

const addToProtectedWebsite = (pageInfo) => {
  const siteUrl = `${pageInfo.pageUrl}*`;
  console.log(siteUrl);
  const password = prompt("Password:");
  const hash = CryptoJS.SHA3(password);
  db.protectedSites.findOne({ siteUrl }).then( (result) => {
    if( !result ){
      db.protectedSites.insert({ siteUrl, password: hash.toString(CryptoJS.enc.Base64) }).then( (result) => {
        protectedWebsites.push(result.siteUrl);
        console.log(result);
        chrome.webRequest.onBeforeRequest.removeListener( checkProtectedSitesRequests );
        chrome.webRequest.onBeforeRequest.addListener( checkProtectedSitesRequests ,{ 
          urls: protectedWebsites, 
          types: ["main_frame"] 
        },["blocking"]);
      });
      chrome.tabs.reload({ bypassCache: true });
    }else{
      console.log(`website ${result.siteUrl} already password protected!`);
      return;
    }
  });
}
  
const removeFromProtectedWebsite = (pageInfo) => {
  const siteUrl = `${pageInfo.pageUrl}*`;
  console.log(`removing item ${siteUrl}`);
  db.protectedSites.remove({ siteUrl }).then( (result) => {
    protectedWebsites = protectedWebsites.filter( (item) => item !== siteUrl );
    if( protectedWebsites.length > 0 ){
      chrome.webRequest.onBeforeRequest.removeListener( checkProtectedSitesRequests );
      chrome.webRequest.onBeforeRequest.addListener( checkProtectedSitesRequests,{ 
        urls: protectedWebsites,
        types: ["main_frame"]
      },["blocking"]);
      chrome.tabs.reload({ bypassCache: true });
    }else{
      chrome.webRequest.onBeforeRequest.removeListener( checkProtectedSitesRequests );
    }
  });
}

chrome.runtime.onMessage.addListener( (message, sender, sendResponse) => {
  if( message.action === "pendingAuth" ){
    sendResponse({authInfo});
  }else if( message.action === "authorize" ){
    protectedWebsites = protectedWebsites.filter( (item) => item !== `${message.url}*` );
    console.log(protectedWebsites);
    if( protectedWebsites.length > 0 ){
      chrome.webRequest.onBeforeRequest.removeListener( checkProtectedSitesRequests );
      chrome.webRequest.onBeforeRequest.addListener( checkProtectedSitesRequests, { 
        urls: protectedWebsites, 
        types: ["main_frame"]
      },["blocking"]);
    }else{
      chrome.webRequest.onBeforeRequest.removeListener( checkProtectedSitesRequests );
    }
    chrome.tabs.update( { url: message.url });
  }
  return true;
});


上下文菜单代码

// creating a context menu 
const menu = chrome.contextMenus.create({ 
  type: "normal",
  title: chrome.i18n.getMessage("extName"),
  contexts: ["all"],
  visible: true
});
// can be this sub voice dynamic?
chrome.contextMenus.create({
  type: "normal",
  title: chrome.i18n.getMessage("blockMenuTitle"),
  contexts: ["all"],
  visible: true,
  parentId: menu,
  onclick: addToBlockedSites
});