2016-07-19 11 views
0

Ich erstelle eine Chrome-Erweiterung, die Daten aus dem Google Drive eines Nutzers abruft und in eine beliebige Seite einfügt. Ich habe das OAuth zum Funktionieren gebracht, aber ich kann nicht scheinen, Zugang zu dem Token zu erhalten (was ich sehen kann, wird über chrome://identity-internals gesetzt).chrome.getAuthToken in einem Skript verwenden

Das Problem hier ist, dass, wenn der Chrome-Erweiterung Navigationsleiste Schaltfläche angeklickt wird, ich eine Anforderung zum Ausführen test.js auslösen. test.js hat anscheinend kein Konzept von chrome.identity, aber es benötigt diese Informationen, um eine XHR-Anforderung zu stellen. Ich habe versucht,

  1. die Auth-Token in localstorage speichern, so dass test.js abgerufen werden kann (kein Glück)
  2. die test.js innerhalb der authToken Anfrage Nesting (nicht sicher, wie eigentlich die Variable gehen in die Datei und rufen Sie sie ab).

Gibt es irgendwelche Ideen?

Vielen Dank im Voraus!

chrome.browserAction.onClicked.addListener(function (tab) { 

      chrome.identity.getAuthToken({ 'interactive': true }, function(token) { 
       // This works 
       alert(token); 
       // This doesn't work 
       localStorage.setItem("authtoken", token); 

      }); 
      chrome.tabs.executeScript(tab.id, { 
       // This file needs access to the authtoken 
       // but within test.js, chrome.identity is undefined. 
       "file": "test.js" 
      }, function() { 

      });  

}); 

Antwort

3

localStorage (effektiv ist es window.localStorage) pro Herkunft gespeichert (Schema + Hostname + Port-Nummer) und Erweiterungen haben ihre eigenen man in privilegierten Komponenten, die einen eingeschränkten Chrom zugreifen können. * API (einige sind zu finden Ausnahmen in content scripts docs), nämlich Popup und Hintergrund/Ereignis Seite, Optionen und andere Seiten mit einer URL wie chrome-extension://abc..... (abc ... ist eine Erweiterung ID).

localStorage einer Webseite gehört zu seiner eigenen Herkunft wie https://www.google.com.

Inhaltsskripts werden im Kontext der Webseite ausgeführt, sodass sie nicht direkt auf die Erweiterung localStorage zugreifen können. Sie sehen localStorage nur vom Ursprung ihrer Webseite.

  • Lösung 1: eine weitere executeScript verwenden, um eine variable einzustellen, die durch den Content-Skript aus einer Datei eingespritzt verwendet werden:

    wird verwendet, um
    chrome.browserAction.onClicked.addListener(function(tab) { 
        chrome.identity.getAuthToken({interactive: true}, function(token) { 
         chrome.tabs.executeScript(tab.id, { 
          code: 'var token=' + JSON.stringify(token) + ';' 
         }, function() { 
          chrome.tabs.executeScript(tab.id, {file: "test.js"}, function() { 
          }); 
         }); 
        });  
    }); 
    

    JSON-Serialisierung nicht entweichen zu stören Sonderzeichen und in der Lage sein, Objekte zu übergeben.

  • Lösung 2: verwenden messaging API Daten zu übergeben, sobald der Inhalt Skript injiziert wird:

    chrome.browserAction.onClicked.addListener(function(tab) { 
        chrome.identity.getAuthToken({interactive: true}, function(token) { 
         chrome.tabs.executeScript(tab.id, {file: "test.js"}, function() { 
          chrome.tabs.sendMessage(tab.id, {token: token}); 
         }); 
        });  
    }); 
    

    Inhalt Script:

    chrome.runtime.onMessage.addListener(function(msg, sender, sendResponse) { 
        if (msg.token) { 
         document.getElementById('token').textContent = msg.token; 
         //nowYouCanProcessToken(msg.token); 
        } 
    }); 
    
  • Lösung 3: chrome.storage API zugänglich verwenden beide aus ein Inhaltsskript und die oben genannten privilegierten Teile einer Erweiterung.

    chrome.browserAction.onClicked.addListener(function(tab) { 
        chrome.identity.getAuthToken({interactive: true}, function(token) { 
         chrome.storage.local.set({token: token}, function() { 
          chrome.tabs.executeScript(tab.id, {file: "test.js"}, function() { 
          }); 
         });  
        });  
    }); 
    

    Content-Skript:

    chrome.storage.local.get('token', function(data) { 
        if (data.token) { 
         document.getElementById('token').textContent = data.token; 
         //nowYouCanProcessToken(data.token); 
        } 
    });