#node.js #firebase #firebase-authentication
# #node.js #firebase #firebase-аутентификация
Вопрос:
Я строю Node.js интерфейс командной строки (CLI), использующий Firebase для аутентификации с помощью серверной части. Я хочу избежать того, чтобы пользователь вводил свой пароль каждый раз, когда он запускает команду. Вместо этого я хочу реализовать поток «входа в систему», который сохраняет учетные данные в файловой системе, которые могут использоваться для последующей аутентификации без пароля до тех пор, пока пользователь не «выйдет из системы».
В основном то, что я ищу, — это функция сохранения состояния аутентификации в firebase
JavaScript SDK. К сожалению, эта функция не поддерживается для Node.js ; вызов setPersistence
в любом 'local'
из режимов или 'session'
в качестве режима вызывает сообщение об ошибке «Текущая среда не поддерживает указанный тип сохранения».
Какой самый простой способ реализовать эту функцию «самостоятельно»?
Я изучил, как SDK сохраняет пользователя в браузере, и в основном он строит пользовательский объект и сохраняет его в localstorage. Я могу сам достаточно легко упорядочить пользовательский объект в Node.js (у экземпляра есть toJSON
метод), но я не могу понять, как позже десериализовать строку в экземпляр firebase.User
. Я вижу эту функцию в исходном коде, которая выглядит так, как будто она справится с задачей. Но это не отображается извне в SDK AFAIK.
Комментарии:
1. Интерфейс командной строки (CLI) является локальным для компьютера. CLI часто называют терминалом. Итак, командная строка предназначена не для конечных пользователей, а для администраторов. Верно?
2. @RonRoyston Это CLI для конечных пользователей, а не администраторов. Функция, которую я хочу реализовать
npm login
, была бы аналогична той, которую вы когда-либо использовали.
Ответ №1:
Вы можете создать экземпляр firebase.User
класса из сериализованного пользовательского объекта:
Сохранить пользователя
const userJson = JSON.stringify(currentUser.toJSON())
// Write userJson to disk
Загрузить пользователя
// Read userJson from disk
const userData = JSON.parse(userJson)
const user = new firebase.User(userData, userData.stsTokenManager, userData)
firebase.auth().updateCurrentUser(user)
Источник: https://github.com/firebase/firebase-js-sdk/issues/1874#issuecomment-549085119
Ответ №2:
В приложениях CLI, которым требуются токены, обычно эти токены хранятся где-то на локальном компьютере (часто в «точечном» файле в домашнем каталоге для Linux-машин — например ~/.yourapp/config
.
Эти файлы могут быть в любом формате, который вы хотите, но мне нравятся JSON или YAML для хранения подобных вещей.
В терминах пользовательского объекта вы можете легко загрузить строку с помощью Node.js встроенный JSON.parse(yourStringUser)
.
В исходном коде firebase-js-sdk вы можете найти ссылки, где аналогично выполняется с хранилищем сеансов; используя toJSON()
метод для установки с определенным key
значением и получения этого значения с JSON.parse()
помощью метода.
Комментарии:
1. Спасибо за ваш ответ. Я могу сохранить сериализованного пользователя в домашнем каталоге пользователя. Однако вызова
JSON.parse
сериализованного пользователя недостаточно, потому что это создает «обычный» объект JavaScript, тогда как мне нужно создать экземплярfirebase.User
класса со всеми его причудливыми методами для обновления токена и так далее.
Ответ №3:
Управление сеансами с помощью сервисных работников
конечные пользователи будут иметь Node.js установлен локально — и вы хотите создать интерактивный скрипт / приложение узла, для которого требуется доступ клиента / токена к Firebase.
Firebase Auth предоставляет возможность использовать service workers для обнаружения и передачи токенов Firebase ID для управления сеансами.
Если вы посмотрите, как работает сама Firebase CLI, пользователи входят в систему через веб-браузер, а затем вставляют код аутентификации в Firebase CLI ( firebase login --no localhost
). Затем пользователь входит в систему. Итак, используйте браузер и Firebase Web SDK для сбора учетных данных.
Комментарии:
1. Спасибо за ответ! Я использовал
firebase
CLI (firebase-tools npm package), который использует браузер как часть своегоlogin
рабочего процесса. Это очень ловко, но включение браузера в общую картину только усложняет проблему. Веб-хранилище браузера нелегко получить из Node.js контекст. Этотfirebase login
рабочий процесс включает в себя исключительные меры для взаимодействия между Node.js и браузер. (Он запускает веб-сервер и открывает окно браузера пользователя). Мне нужно знать, что должно сохраняться в файловой системе и как удалить его позже.2. возможно, см. Аутентификация с помощью Firebase в JavaScript с использованием пользовательской системы аутентификации . Тем не менее, это особенность Web SDK. … аутентификация может быть потоком в реальном времени, поэтому я бы посоветовал дважды подумать, прежде чем принимать решение о настройке.
Ответ №4:
Я подробно изучил это с помощью службы поддержки Google Cloud Platform, и мы определили, что это невозможно с текущим SDK. Черт возьми, на реализацию этой функции с помощью AWS Cognito у меня ушло всего несколько часов. Там конструктор CognitoUser позволяет пользователю передавать свои любимые Node.js реализация API localStorage.