Постоянное состояние авторизации Firebase + расширение Chrome - PullRequest
1 голос
/ 23 апреля 2019

Я пытаюсь настроить аутентификацию в моем расширении Chrome. Я просто хочу, чтобы пользователи могли щелкнуть значок расширения, войти в систему с помощью адреса электронной почты и пароля, а затем использовать различные компоненты расширения. Если всплывающее окно расширения закрыто, им не нужно будет снова входить в систему.

Я скрупулезно следовал документации здесь , здесь и документации по расширению Chrome здесь с моим очень ограниченным опытом разработки.

Вот мой manifest.json.

{
  "name": "Extension",
  "version": "0.1",
  "description": "",
  "permissions": [
    "tabs",
    "activeTab",
    "storage"
  ],
  "content_security_policy": "script-src 'self' https://www.gstatic.com/ https://*.firebaseio.com https://*.firebase.com https://www.googleapis.com; object-src 'self'",
  "background": {
    "page":"background.html",
    "persistent": true
  },
  "browser_action": {
    "default_popup": "popup.html",
    "default_icon": {}
  },
  "manifest_version": 2
}

Мои background.html и background.js строго идентичны последнему примеру, на который я ссылался выше, за исключением того, что я заменил конфигурацию Firebase своим собственным.

Мой popup.html:

<!DOCTYPE html>
<html lang="en" dir="ltr">

  <head>
    <meta charset="utf-8">
    <title></title>
    <script src="https://www.gstatic.com/firebasejs/5.10.0/firebase.js"></script>
    <script src="firebase/initialize.js" charset="utf-8"></script>
    <script src="https://cdn.firebase.com/libs/firebaseui/3.5.2/firebaseui.js"></script>
    <link type="text/css" rel="stylesheet" href="https://cdn.firebase.com/libs/firebaseui/3.5.2/firebaseui.css"/>
    <link type="text/css" rel="stylesheet" href="styles/popup.css" />
  </head>

  <body>
    <h1>Extension</h1>
    <div id="firebaseui-auth-container"></div>
    <!-- Firebase App (the core Firebase SDK) is always required and must be listed first -->
    <script src="src/popup.js"></script>
  </body>

</html>

Где initialize.js - это просто скрипт инициализации Firebase, а мой popup.js:

//Initizalier FirebaseUI instance
var ui = new firebaseui.auth.AuthUI(firebase.auth());
//Define sign-in methods
var uiConfig = {
  callbacks: {
    //Callbacl if sign up successful
    signInSuccessWithAuthResult: function(authResult) {
      // User successfully signed in.
      // Return type determines whether we continue the redirect automatically
      // or whether we leave that to developer to handle.

      //Script to replace popup content with my Extension UI

      return false;
    },
  },
  signInOptions: [
    {
      provider: firebase.auth.EmailAuthProvider.PROVIDER_ID,
      requireDisplayName: false
    }
  ],
};

//Initialize UI
ui.start('#firebaseui-auth-container', uiConfig);

Используя это, я могу сказать, что вход в систему работает каждый раз, когда я нажимаю на значок расширения, но если я закрою и снова открою всплывающее окно, мне придется снова войти в систему. Я спрашивал об этом почти везде, где мог. Я также пытался задать ответ на этот вопрос стекопотока на мой background.js сценарий, но безрезультатно.

Если я не совсем потерян, думаю, у меня есть представление о том, почему это так. Если я не ошибаюсь, всплывающее окно действий браузера переопределяет действия фоновой страницы / скрипта. Однако я не уверен, что я должен изменить. Я также рассмотрел об аутентификации Firebase с помощью Chrome Extensions , но не могу понять, как это вписывается в мою работу.

На данный момент я понятия не имею, что делать дальше.

1 Ответ

0 голосов
/ 27 апреля 2019

Я нашел решение своей проблемы.Ответ @cloop в вопросе, на который я ссылаюсь, верен, но ради людей, которые позже столкнутся с этим вопросом, я объясню по-своему.Я надеюсь, что это будет более дружественным для новичка, поскольку я сам не разработчик.

Обратите внимание, что это просто мое решение иметь MVP, скорее всего, есть лучший способ сделать это.

Прежде всего, не используйте Библиотека Firebase UI , поскольку она не будет совместима с расширениями Chrome.Я предполагаю, что вы прошли руководство по расширению Chrome , а также базовую документацию Firebase Authentication .

Теперь мы должны отказаться от всего, что у нас есть, и начать все заново с пустого расширения.Мы настроим для него аутентификацию по электронной почте и паролю.

Сначала мы создадим манифест:

{
  "name": "Test extension",
  "version": "0.1",
  "description": "An extension to test Firebase auth",
  "permissions": [/*Insert necessary permissions*/],
  "content_security_policy": "script-src 'self' https://www.gstatic.com/ https://*.firebaseio.com https://*.firebase.com https://www.googleapis.com; object-src 'self'",
  "background": {
    "page":"background.html",
    "persistent": true
  },
  "browser_action": {
    "default_popup": "popup.html",
  },
  "manifest_version": 2
}

background.html - это фоновая страница, связанная со скриптом background.js.Это связано с тем, что нам необходимо загрузить firebase в <head> страницы, прежде чем мы сможем инициализировать его в скрипте, см., Например, скрипт здесь .popup.html будет страницей, которую мы будем динамически загружать в зависимости от состояния аутентификации.Он связан со скриптом popup.js и содержит только элемент div #container.Мы немедленно добавим прослушиватель событий в это всплывающее окно, чтобы отправить сообщение фоновому сценарию, используя Messaging API .

window.addEventListener('DOMContentLoaded', (_event) => {
  console.log("DOM loaded and parsed");
  //Send a message to background script informing that the page is loaded
  chrome.runtime.sendMessage({type: "popupLoad"}, function (response) {
       if (response.type == "loggedIn") {
           let htmlString = /*Your extension UI's HTML*/;
           document.querySelector("#container").innerHTML(htmlString);
       } else if (response.type == "loggedOut") {
           let htmlString = /*Log in form HTML*/
           document.querySelector("#container").innerHTML(htmlString);
       };
  });

Итак, мы сделали это, отправив сообщениефоновый скрипт, как только DOM нашего popup.html будет полностью загружен для запроса состояния аутентификации.Фоновый скрипт отправит нам объект response типа loggedIn или loggedOut, что позволит нам решить, какой интерфейс нам следует загрузить для нашего всплывающего окна.

Теперь мы смотрим на фоновый скрипт.

Сначала вам нужно инициализировать Firebase.

var config = {
    /*Your config parameters from the Firebase console*/
  };
firebase.initializeApp(config);

Теперь нам нужно добавить прослушиватель сообщений.Обратите внимание, что при этом будет прослушиваться любое сообщение от любого Chrome environement (вкладка, окно, всплывающий скрипт и т. Д.), Поэтому мы должны убедиться, что действуем в отношении правильного типа сообщения.Вот почему я использовал {type: "popupLoad"} при создании сообщения всплывающего скрипта.Все мои сообщения имеют как минимум атрибут type.

chrome.runtime.onMessage.addListener(
    function(message, _sender, _sendResponse) {
      if (message.type == "popupLoad") {
        //Get current authentication state and tell popup
        let user = firebase.auth().currentUser;
        if (user) {
          sendResponse({type: "loggedIn"});
        } else {
          sendResponse({type: "loggedOut"});
        };
      } else if (message.type == "other") {
          //handle other types of messages
      };
    });

Мы достигли того, что, как только пользователь нажимает на значок расширения, мы можем решить, какой интерфейс интерфейсаВсплывающее окно должно основываться на состоянии аутентификации.Конечно, если пользователь вышел из системы, он увидит нашу форму входа / регистрации.Кнопка этой формы должна иметь прослушиватель событий, который отправляет сообщение (например, типа loginAttempt) в фоновый сценарий, а затем фоновый сценарий должен дать ответ на всплывающий сценарий, если вход выполнен успешно, что позволяет намзаменить содержимое #container пользовательским интерфейсом нашего расширения.Здесь мы видим, что расширение на самом деле является одностраничным приложением.

Мне пришлось использовать метод firebase.auth().onAuthStateChanged() в фоновом скрипте, который по сути является прослушивателем событий, если он обнаруживает изменения в состоянии аутентификации, если яне ошибаюсь.

Я не буду вдаваться в подробности, но я надеюсь, что для начинающих, таких как я, этого будет достаточно, чтобы обернуть голову вокруг этого и придумать рабочий прототип.

Короче:

  • Не использовать библиотеку Firebase UI
  • Инициализировать Firebase в фоновом скрипте
  • Расширение представляет собой одностраничное приложение.Используйте Messaging API для извлечения текущего состояния проверки подлинности или изменений состояния проверки подлинности из фонового сценария, чтобы иметь возможность решить, какой интерфейс вы хотите обслуживать пользователю

Если кто-то заметит какую-либо проблему с этим ответом,не стесняйтесьНекоторая заслуга принадлежит многим людям, которые были достаточно любезны, чтобы помочь мне в разработке Discord, или тем немногим разработчикам, которых я написал по электронной почте и поставил меня на правильный путь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...