Как экспортировать аутентификацию пользователей Firebase, включая информацию о пользователе-поставщике для входа в систему с пользователями Apple

# #firebase #google-cloud-platform #firebase-authentication

Вопрос:

Я хочу экспортировать всех пользователей внутри Firebase Auth, потому что я хочу перейти из Firebase. Я могу получить экспорт пользователей просто отлично с помощью команды:

 firebase auth:export users.json --format=json --project [my-project]
 

Однако для всех пользователей, которые используют вход в Apple providerUserInfo , это пустой массив, поэтому в настоящее время нет возможности импортировать их в мою собственную базу данных и сохранить их в качестве функциональных учетных записей, которые могут снова войти в систему через SIWA.

Когда я смотрю на пользователя аутентификации, добавляя onAuthStateChanged прослушивателя и регистрируя пользователя аутентификации в консоли, то providerData.uid это идентификатор пользователя Apple, точный идентификатор, который мне нужно скопировать в мою новую базу данных:

   onAuthStateChanged(auth, authUser => {
    if (authUser) {
      const uid = authUser.providerData[0].uid;
      if (authUser.providerData[0].providerId === "apple.com") {
        console.log(`Apple ID: ${uid}`);
      } else {
        console.log(`Email address: ${uid}`);
      }
    }
  });
 

Таким образом, значение определенно хранится в Firebase Auth, и именно это значение мне нужно экспортировать для всех пользователей.

Поэтому мой вопрос: как я могу получить providerUserInfo для таких пользователей? Поможет ли accounts:lookup конечная точка REST? К сожалению, я не могу понять, как должна работать эта конечная точка, что idToken вам нужно отправить.

Комментарии:

1. Я предполагаю, что один из способов-использовать onAuthStateChanged и хранить providerData.uid в другой коллекции, но а) это большой риск для безопасности, позволяя клиенту создавать такие документы, и б) Мне нужно будет заставить всех пользователей использовать сайт до завершения миграции.

Ответ №1:

Я нашел способ экспортировать всех пользователей, включая внутренний идентификатор пользователя Apple, с помощью пакета SDK администратора:

 const fs = require("fs");
const admin = require("firebase-admin");
admin.initializeApp();

const records = {};

function handleUser(userRecord) {
  records[userRecord.uid] = userRecord;
}

const listAllUsers = nextPageToken => {
  // List batch of users, 1000 at a time.
  return admin
    .auth()
    .listUsers(1000, nextPageToken)
    .then(listUsersResult => {
      listUsersResult.users.forEach(userRecord => {
        handleUser(userRecord);
      });
      if (listUsersResult.pageToken) {
        // List next batch of users.
        return listAllUsers(listUsersResult.pageToken);
      }
    })
    .catch(error => {
      console.log("Error listing users:", error);
    });
};

// Start listing users from the beginning, 1000 at a time.
listAllUsers().then(() => {
  const data = JSON.stringify(records);

  fs.writeFile("users.json", data, err => {
    console.log("JSON data is saved.");
  });
});
 

Ответ №2:

ProviderUserInfo включает в себя следующие данные:

 {
  displayName?: string,
  email: string,
  phoneNumber?: string,
  photoURL?: string,
  providerId: string,
  uid: string
}
 

Для пользователей SIWA (Вход через Apple) их информация анонимизирована, и вы должны получить явное согласие пользователя, чтобы иметь возможность собирать их личную информацию. Если бы у вас была такая информация, вы бы использовали updateProfile() ее для прикрепления к их идентификатору пользователя в верхней части их UserRecord . Если бы существовала ProviderUserInfo запись для Apple, она состояла бы из:

 {
  displayName: null,    // SIWA does not provide a display name
  email: string,        // an anonymized email, same as User.email
  phoneNumber: null,    // SIWA does not provide a phone number
  photoURL: null,       // SIWA does not provide profile images  ​
 ​ providerId: string,   // "apple"
 ​ uid: string           // same as User.localId
}
 

Поскольку доступные данные находятся в другом месте, их бессмысленно включать в ответ и опускать.

Передача пользователей SIWA не является простым процессом. Вы должны выполнить действия, описанные в документации по переносу приложений и пользователей в новые команды. Короче говоря, вы используете «Токен идентификатора передачи» со свежими данными учетной записи пользователя, чтобы спросить службу аутентификации Apple: «Этот пользователь когда-либо входил в систему для этого старого идентификатора клиента?». В возвращенном ответе будет либо указано «Да, их идентификатор со старым идентификатором клиента был X», либо «Нет, это новый пользователь». На основании этого вы переносите их старые данные в свою новую базу данных и идентификатор аутентификации.

Важно отметить, что по истечении 60 дней вы больше не сможете переводить пользователей со старой службы на новую.

Комментарии:

1. Я действительно не понимаю. Внутренне Firebase Auth должен где-то хранить идентификатор пользователя Apple, чтобы связать пользователя аутентификации с пользователем Apple. sub Значение JWT от Apple. Если бы я мог экспортировать это значение, то пользователи могли бы войти в новую базу данных, как будто ничего не произошло.

2. На самом деле, когда я смотрю на пользователя аутентификации (добавляю onAuthStateChanged прослушивателя и регистрирую пользователя аутентификации в консоли), providerData.uid это, безусловно, идентификатор пользователя Apple, точный идентификатор, который мне нужно скопировать в мою новую базу данных. Таким образом, значение определенно хранится в Firebase Auth, и именно это значение мне нужно экспортировать для всех пользователей.