2016-07-19 2 views
0

Я создаю расширение Chrome, которое извлекает данные с Google Диска и вставляет его на произвольную страницу. Я получил OAuth для работы, но я не могу получить доступ к токену (который я вижу, устанавливается через chrome://identity-internals).Получение chrome.getAuthToken для работы внутри скрипта

Проблема заключается в том, что при нажатии кнопки панели навигации расширения Chrome я запускаю запрос для выполнения test.js. test.js, по-видимому, не имеет понятия chrome.identity, но ему нужна эта информация для запроса XHR. Я попытался

  1. Сохранение маркера аутентификации в LocalStorage так, что test.js может получить его (без удачи)
  2. Вложение в test.js внутри запроса AuthToken (не знаю, как на самом деле передать переменную в файл и получить его).

Есть идеи?

Спасибо заранее!

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() { 

      });  

}); 

ответ

3

localStorage (фактически это window.localStorage) хранится на происхождение (схему + имя хоста + номер порта), а также расширения имеют свои собственные один в привилегированных компонентах, которые могут получить доступ к запретному хрому. * API (некоторые из них перечислены в исключения в content scripts docs), а именно всплывающие окна и фон/страница событий, параметры и другие страницы с URL-адресом, например chrome-extension://abc..... (abc ... является идентификатором расширения).

localStorage веб-страницы принадлежат к своему происхождению, например https://www.google.com.

Скрипты содержимого выполняются в контексте веб-страницы, поэтому они не могут напрямую обращаться к расширению localStorage. Они видят только localStorage происхождения своей веб-страницы.

  • Решение 1: используйте другой executeScript установить переменную, которая будет использоваться в сценарии содержимого впрыскиваемого из файла:

    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-сериализации используется для того, чтобы не заморачиваться избежать специальные символы и возможность передавать объекты.

  • Решение 2: использовать messaging API для передачи данных после того, как скрипт содержание впрыскивается:

    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}); 
         }); 
        });  
    }); 
    

    содержание сценария:

    chrome.runtime.onMessage.addListener(function(msg, sender, sendResponse) { 
        if (msg.token) { 
         document.getElementById('token').textContent = msg.token; 
         //nowYouCanProcessToken(msg.token); 
        } 
    }); 
    
  • Решение 3: использование chrome.storage API доступны как из сценарий содержимого и вышеупомянутые привилегированные части расширения.

    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() { 
          }); 
         });  
        });  
    }); 
    

    сценарий содержание:

    chrome.storage.local.get('token', function(data) { 
        if (data.token) { 
         document.getElementById('token').textContent = data.token; 
         //nowYouCanProcessToken(data.token); 
        } 
    }); 
    
Смежные вопросы