Как аутентифицировать POST-запрос от расширения chrome для моего приложения с помощью токенов JSON?

контекст

В настоящее время мое веб-приложение HapiJS использует OAuth 2.0 для доступа к API Google. Как только пользователь аутентифицируется в приложении, сервер генерирует JNT Web Token (JWT), который хранится на клиенте и отправляется обратно в заголовок Authorization последующих запросов.

Что я хотел бы сделать

Теперь я хотел бы использовать те же шаги (авторизация + создание JWT) с моим расширением Google Chrome, которое синхронизирует данные с приложением через конечную точку REST.

Текущие мысли

Моя идея состоит в том, чтобы использовать ту же авторизацию OAuth, что и в моем приложении, для создания JWT, а затем для сохранения этого JWT в расширение Chrome. Затем этот JWT передается с каждым запросом из моего расширения chrome в мое приложение для проверки запроса.

К сожалению, кажется, что расширение Chrome использует собственную авторизацию через API удостоверений Chrome и не позволит мне использовать процесс аутентификации, который я имел в виду.

На приведенной ниже диаграмме описаны шаги, которые я предвижу, чтобы получить JWT, созданный в моем приложении, затем сохраненный на моем расширении chrome (а также указывает на то, где проблема): diagram

Вопрос

Поэтому мой вопрос: есть ли другой или лучший способ хранения JWT, созданного в моем приложении, на моем расширении Chrome?

Надеюсь, мои объяснения достаточно ясны

Ответы

Ответ 1

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

Проблема с этим подходом заключается в том, что сохранение разумной информации, такой как информация пользователя (которая закодирована в jwt), неодобрительно из-за проблем с безопасностью.

В идеале у вас должен быть сервер, который обрабатывает аутентификацию взад и вперед, сохраняет информацию и испускает токен сеанса для своих клиентов, который затем вы можете сохранить в localStorage, если хотите.

Ответ 2

Если вы хотите, чтобы ваш popup.html содержал ссылку, позволяющую пользователям открывать (приводя к OAuth Google в вашей модели), вам нужно больше работы, чем простая привязка.

Вам нужно будет добавить прослушивателей событий к ссылке и использовать chrome.tabs.create.

Вот демонстрационный код:

popup.html

<html>
    <body>
        <span class="link" data-href="https://www.google.com">link</span>
        <span class="link" data-href="https://www.bing.com">link</span>
        <span class="link" data-href="https://www.yahoo.com">link</span>

        <script>

            //get all links
            var links = document.getElementsByClassName('link');

            //loop through each link
            for (var ii = 0, nn = links.length; ii < nn; ii++)
            {
                //add listener
                links[ii].addEventListener('click', function(e)
                {
                    //grab link
                    var url = this.getAttribute('data-href');

                    //open link in new tab using chrome.tabs.create method
                    chrome.tabs.create({url:url});
                });
            }
        </script>
    </body>
</html>

Ответ 3

Я думаю, что вы могли бы использовать localStorage (или библиотеку, которая делает то же самое, но могла бы работать лучше для вашего кода)

Без кода, я не могу сделать лучше для тебя, братан, извини

Ответ 4

Вы пытались использовать localStorage?

Вы можете сохранить токен следующим образом:

localStorage.setItem('token', 'abcde')

и может извлекать

localStorage.getItem('token')

но информация будет потеряна при повторной загрузке страницы.