Как проверить учетные данные электронной почты и пароля с помощью Firebase Admin SDK (на стороне сервера)? - PullRequest
0 голосов
/ 03 мая 2018

Я написал приложение Google Cloud Function Express и инструмент командной строки, который использует Node.js на моем локальном Mac.

Вызов myclitool login, одноразовый запрос запрашивает у пользователя адрес электронной почты и пароль. Инструмент CLI отправляет электронную почту и пароль внутри тела запроса с помощью HTTP-запроса POST на сервер Express через SSL.

Сервер отправит обратно секретный ключ API (сгенерированный функцией триггера во время регистрации пользователя), который будет записан в ~/.myclitoolrc и будет использоваться для всех последующих вызовов к моей конечной точке API.

Каждый последующий вызов из инструмента CLI ищет частный ключ API в коллекции учетных записей Firestore и аутентифицируется для каждого вызова API.

admin.firestore()
  .collection('accounts')
  .where('privateApiKey', '==', privateApiKey)
  .get() // and so on

Пока следующий код найдет admin.auth.UserRecord.

Service.prototype.signin = function signin(email, password) {
  return new Promise(function(resolve, reject) {
    admin.auth().getUserByEmail(email)
    .then(userRecord => {
      console.log(userRecord);
      resolve('some value later');
    })
    .catch(err => {
      reject(err);
    });
  });
};

Документация Firebase гласит: https://firebase.google.com/docs/reference/admin/node/admin.auth.UserRecord

passwordHash (строка или ноль)

Хешированный пароль пользователя (в кодировке base64), только если Firebase Auth алгоритм хеширования (SCRYPT). Если другой алгоритм хеширования был использован при загрузке этого пользователя, как это обычно происходит при миграции из другой системы аутентификации это будет пустая строка. Если нет пароля установлено, это будет нулевым. Это доступно только когда пользователь получено из listUsers ().

passwordSalt (строка или ноль)

Соль пароля пользователя (в кодировке base64), только если Firebase Auth алгоритм хеширования (SCRYPT). Если другой алгоритм хеширования был использован для загрузки этого пользователя, типично при миграции с другого Система аутентификации, это будет пустая строка. Если пароль не установлен, это будет нулевым Это доступно только тогда, когда пользователь получен от ListUsers ().

UserRecord извлекается и содержит свойства SCRYPTd passwordHash и passwordSalt.

UserRecord {
  uid: 'kjep.[snip]..i2',
  email: 'email@example.com',
  emailVerified: false,
  displayName: undefined,
  photoURL: undefined,
  phoneNumber: undefined,
  disabled: false,
  metadata: 
   UserMetadata {
     creationTime: 'Thu, 12 Apr 2018 09:15:23 GMT',
     lastSignInTime: 'Thu, 03 May 2018 03:57:06 GMT' },
  providerData: 
   [ UserInfo {
       uid: 'email@example.com',
       displayName: undefined,
       email: 'email@example.com',
       photoURL: undefined,
       providerId: 'password',
       phoneNumber: undefined } ],
  passwordHash: 'U..base64..Q=',
  passwordSalt: undefined,
  customClaims: undefined,
  tokensValidAfterTime: 'Thu, 12 Apr 2018 09:15:23 GMT' }

Похоже, что в составе Firebase Admin SDK нет функций проверки admin.auth().

Должен ли я осуществить проверку SCRYPT самостоятельно, найдя алгоритм или готовый модуль Node, или я должен принять отсутствие каких-либо функций проверки как признак того, что это не лучший подход?

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

1 Ответ

0 голосов
/ 04 мая 2018

В соответствии с запросом в комментариях приведен пример кода для доступа к Cloud Firestore с использованием Node.js через Firebase Javascript SDK (обеспечивает соблюдение правил безопасности).

В v4.13.0 подана ошибка (теперь закрыта). Я еще не тестировал 4.13.1, но исправление было объединено с веткой master. Если это не сработает, попробуйте v4.12.0.

const firebase = require('firebase');
require("firebase/firestore");

// Initialize Firebase
// You get these details from the Firebase Console
let config = {
  apiKey: "yourAPIkey",
  authDomain: "yourAuthDomain",
  databaseURL: "https://yourProjectID.firebaseio.com",
  projectId: "yourProjectID",
  messagingSenderId: "yourId"
};
firebase.initializeApp(config);

let email = 'yourUser@example.com';
let password = 'yourVerySecurePassword';

firebase.auth().signInWithEmailAndPassword(email, password)
  .catch(error => {
    console.log(error);
  });

firebase.auth().onAuthStateChanged((user) => {
  if (user) {
    console.log('I am logged in');

    // Initialise Firestore
    const firestore = firebase.firestore();
    const settings = {timestampsInSnapshots: true};
    firestore.settings(settings);

    return firestore
      .collection('accounts')
      .where('privateApiKey', '==', privateApiKey)
      .get()
      .then((querySnapshot) => {
        querySnapshot.forEach((documentSnapshot) => {
          if (documentSnapshot.exists) {
            console.log(documentSnapshot.id);
          }
        });
      });
  } else {
    // User is signed out.
    // ...
  }
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...