Как войти в систему с помощью электронной почты и пароля через PHP и получить токен JWT? - PullRequest
0 голосов
/ 22 сентября 2019

Я не могу понять, как аутентифицировать пользователя из PHP. документы демонстрируют вход через javascript, где электронная почта и пароль пользователя представлены в виде простого текста (firebase.auth().createUserWithEmailAndPassword(email, password)), и я не уверен, как это работает с точки зрения безопасности, когда люди могут просто просмотреть исходный код и получитьинформация для входа в систему.

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

В настоящее время соблюдаются следующие правила безопасности (это минимум, который разрешает чтение / запись любого пользователя, вошедшего в систему):

rules_version = '2';
service cloud.firestore {
  match /databases/{database}/documents {
    match /{document=**} {
      allow read, write: if request.auth.uid != null;
    }
  }
}

Мои вопросы:

1.Как я могу аутентифицировать пользователя с помощью электронной почты и пароля из PHP, а затем получить токен, который в дальнейшем может быть использован javascript?

2.Как именно работает аутентификация Firebase, прежде чем я получу достаточное разрешение для взаимодействия с инструментами, такими как Firestore? (Насколько я понимаю, я предполагаю, что это работает, сначала войдя со стороны сервера, чтобы получитьтокен с деталями, тогда javascript может использовать этот токен для безопасного взаимодействия с Firestore, но я не уверен, что это именно то, что ожидается.)

3.Почему логирование (с использованием простой электронной почты и пароля) при использовании javascript является чем-то особенным?Разве это не значит, что все могут видеть все учетные данные?

4.Для библиотек javascript, которые взаимодействуют с сервером, как это, как сервер (Firestore) может предотвратить изменение данных от злодеев через консоль?После входа в систему они могут просто отправлять команды с консоли на сервер, потому что это всего лишь JavaScript.Я прав? (Разумеется, после входа в систему)

1 Ответ

2 голосов
/ 22 сентября 2019

Позвольте мне вначале сказать, что Firebase не предназначен для доступа от имени пользователя из бэкэнд-службы (по крайней мере, я так думаю).Клиентские SDK предназначены для использования в клиентском приложении, ориентированном на пользователя, а Server / Admin SDK предназначены для фоновых заданий и работ по обслуживанию (если облачных функций Firebase недостаточно).

Как я могу аутентифицировать пользователя по электронной почте и паролю из PHP, а затем получить токен, который в дальнейшем может быть использован javascript?

A "Войти по электронной почте и паролю"Функциональность в настоящее время (я собираюсь взад и вперёд в моей голове, если она должна ?) недоступна в неофициальном Firebase SDK для PHP , но вы можете сделать это с помощью пользовательского токена:

<?php

use Kreait\Firebase\Factory;

$email = '...';
$password = '...';
$serviceAccount = '/path/to/service-account.json';

$factory = (new Factory())->withServiceAccount($serviceAccount);

$auth = $factory->createAuth();

$userRecord = $auth->verifyPassword($email, $password);
$customToken = $auth->createCustomToken($userRecord->uid);

Затем вы можете передать пользовательский токен в ваше приложение JavaScript и использовать Auth.signInWithCustomToken() с ним.

Как именно работает аутентификация Firebase до того, как яу вас достаточно прав для взаимодействия с такими инструментами, как Firestore?

На стороне сервера служебная учетная запись используется для аутентификации запросов к API-интерфейсам Firebase.Если вы создаете такие учетные данные учетной записи службы, как описано в официальной документации , вы можете использовать ее для инициализации вместе с ней SDK сервера и доступа к Firebase без каких-либо ограничений.Если вы затем выполняете действия от имени пользователя, вы должны убедиться, что пользователь ранее прошел аутентификацию с вашим пользовательским приложением.

В настоящее время соединение API «как пользователь» недоступно в SDK, так кака также поддержка Firestore, но я над этим работаю.

На стороне клиента Client SDK инициализируется с помощью ключа API (который не является секретом, его можно найти, например, в источнике HTML).код веб-приложения с поддержкой Firebase), но приложение вообще не может взаимодействовать с Firebase без какой-либо аутентификации, по крайней мере анонимная аутентификация .При анонимной проверке подлинности это делается с помощью правил безопасности различного типа (Хранилище, База данных в реальном времени, Firestore, ...), чтобы гарантировать, что анонимные пользователи не смогут связываться с другими данными, кроме их одних.

Почему логирование (с использованием простой электронной почты и пароля) при использовании javascript - это вообще вещь?Разве это не значит, что все могут видеть все учетные данные?

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

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

Для библиотек javascript, которые взаимодействуют с сервером, вот так: как сервер (Firestore) может предотвратить модификацию данных от злодеев черезПриставка?После входа в систему они могут просто отправлять команды с консоли на сервер, потому что это всего лишь JavaScript.Правильно ли я?

После входа в систему в качестве пользователя приложения этот пользователь сможет получить доступ только к тем частям вашего приложения, которые для него включены, через определенные правила безопасности.В отношении правила безопасности, которое вы дали, вы правы: это слишком допустимо, и, пока кто-то проходит проверку подлинности, он может читать и писать, если он вообще проходит проверку подлинности (так что это только предотвратит доступ к вашему приложению без аутентификации.

Если вы хотите, чтобы пользователи могли видеть и изменять только свои собственные данные, вы можете использовать правило, подобное этому:

rules_version = '2';
service cloud.firestore {
  match /databases/{database}/documents/{userId} {
    match /{document=**} {
      allow read, update, delete: if request.auth.uid == userId;
      allow create: if request.auth.uid != null;
    }
  }
}

Это был только пример, официальная документация по безопасности Firestore гораздо более полная, чем я мог бы быть ^^.

Пользователи приложения не могут ни войти в консоль Firebase вашего проектани с помощью инструментов Firebase CLI.

...