Аутентификация Firebase с NodeJS: получение UID клиента, выполняющего запросы - PullRequest
0 голосов
/ 12 апреля 2019

Я использую NodeJS для связи с базой данных реального времени Firebase .

Правила определены так, что только учетная запись администратора может читать и писать:

{
  "rules": {
    ".read": "auth.uid === 'ADMIN_UID'",
    ".write": "auth.uid === 'ADMIN_UID'"
  }
}

КогдаСервер NodeJS Express инициализирует вход в систему с учетными данными администратора.

В веб-приложении я использую опцию Firebase «Войти через facebook»:

const provider = new firebase.auth.FacebookAuthProvider();

provider.setCustomParameters({
    display: "popup",
});

firebase
    .auth()
    .signInWithPopup(provider)

Все работает отлично.

Теперь я пытаюсь извлечь идентификатор пользователя (uid) пользователя, выполняющего запросы из веб-приложения.Когда я запускаю следующую строку:

const user = firebase.auth().currentUser;

я получаю пользователя с правами администратора, а не пользователя, выполняющего запросы.Это ожидается, я думаю.У меня вопрос, как мне получить UserId, не отправляя его явно, чтобы избежать проблем с безопасностью?

Ответы [ 2 ]

1 голос
/ 13 апреля 2019

Мне удалось сделать это с помощью Firebase Admin SDK .

Как описано в этом руководстве, вам необходимо:

  1. Создание личного ключа для учетной записи службы

    • В консоли Firebase откройте Настройки> Учетные записи службы.
    • Нажмите Создать новый закрытый ключ , затем подтвердите, нажав Создать ключ .
    • Надежно сохраните файл JSON, содержащий ключ.
  2. Установите переменную среды

Добавьте в свой .bashrc или .zshrc:

 export GOOGLE_APPLICATION_CREDENTIALS="/home/user/Downloads/service-account-file.json"

- В NodeJS инициализируйте SDK:

admin.initializeApp({
  credential: admin.credential.applicationDefault(),
  databaseURL: 'https://<DATABASE_NAME>.firebaseio.com'
});

В вашем клиенте отправьтетокен JWT в заголовке:

const token = await firebase.auth().currentUser.getIdToken()

fetch(url, {
   method: "POST",
   headers: {
      "Content-Type": "application/json",
      Authorization: token
   },
   body: ...
 });

На вашем сервере расшифруйте токен и получите UID:

  return admin
        .auth()
        .verifyIdToken(token)
        .then(function(decodedToken) {
            var uid = decodedToken.uid;
            console.log("uid ->", uid);
            return uid;
        })
        .catch(function(error) {
            console.log("error ->", error);

            // Handle error
        });

Вот и все.Очевидно, что работа с Firebase через ваш собственный домен NodeJS называется «использованием вашего собственного бэкенда».Это означает, что по умолчанию для них используется NodeJS или другой серверный посредник.

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

Обычно с помощью firebase вы можете включить доступ к context отправляемого запроса и userId доступен.

Что-то вроде следующего:

context.params.userId

...