# #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, и именно это значение мне нужно экспортировать для всех пользователей.