Javascript 使用firebase auth限制浏览器扩展上下文菜单
我对浏览器扩展有点小问题。我试图用密码锁定一些网站,我想让用户能够使用context menù将网站添加到黑名单中。因为我不想依赖chrome存储或indexedDB,所以我考虑使用firestore创建黑名单,并在浏览器启动时检索它。问题就在这里。要实现这一点,假设用户使用google帐户登录。我可以使用identity api或firebase auth登录用户,问题是这样每个用户都会有自己的黑名单,这并不是我真正想要的,我希望如果用户A在登录后将网站添加到黑名单中,用户B将无法解锁该网站,直到用户A将其从黑名单中删除。这可能吗,我能有一些建议吗 我发现的另一个问题是关于上下文菜单。是否可以手动启用或禁用上下文菜单语音?我希望用户A在登录后能够使用上下文菜单,而用户B将不会看到它。这可能吗 黑名单代码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将无法解锁该网站,
// 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
});