Удалить анонимных пользователей Firebase через некоторое время
Я использую анонимный auth, чтобы позволить моим пользователям использовать приложение без входа в систему. Однако Firebase, похоже, постоянно сохраняет эти анонимные идентификаторы пользователей. Есть ли способ автоматически очистить их или установить какое-то правило истечения срока действия? Я не хочу, чтобы эти одноразовые идентификаторы времени жили вечно и загромождали фактические данные пользователя от поставщиков.
Ответы
Ответ 1
К сожалению, это "утечка памяти" (утечка данных?) Поскольку нет разумного способа заставить анонимного пользователя преобразовать, эти анонимные идентификаторы пользователей скоро станут зомби, которые не будут иметь особой цели (о которой я могу думать), Кроме того, один реальный пользователь может (забывчиво) входить в качестве анонимного пользователя, но опять же, после того, как уже связывает свою электронную почту с предыдущим воплощением, а затем расстраивается при попытке установить ссылку на свою электронную почту. В целом, я считаю текущую анонимную реализацию пользователя нецелесообразной или, по крайней мере, далекой от идеала.
На данный момент я планирую иметь адрес электронной почты, который является случайным, но уникальным для данного пользователя/устройства для входа в анонимные пользователи, вместо использования встроенного анонимного знака (который отключен). На мой взгляд, должна быть настройка, чтобы сообщить Firebase удалить анонимный идентификатор пользователя при выходе из системы (они бесполезны в этой точке в любом случае) и/или после предопределенного количества времени. Кроме того, было бы полезно иметь возможность снова регистрироваться с тем же анонимным идентификатором пользователя до истечения срока действия (например, путем сохранения токена /etc.) Наконец, попытка связать электронное письмо, которое уже используется, должно просто объедините идентификатор анонимного пользователя с существующим идентификатором пользователя электронной почты/пароля через этап проверки.
Ответ 2
Вы можете использовать Firebase admin API, чтобы программно удалить пользователей. Вам нужно будет сохранить список пользователей в вашей базе данных, поскольку Firebase не предоставляет для этого запроса.
Ответ 3
Невозможно выполнить массовое удаление, однако для меня работал следующий трюк:
Я использовал Macro Recorder, и он работал как шарм. Просто записал несколько итераций в консоли, в которой я удалял пользователей, чтобы он повторял 500 раз и уходил.
Ответ 4
Почему-то есть способ удалить старых анонимных пользователей. Я делаю это с помощью cronjob AppEngine, который работает каждый час.
Но прежде чем сделать это, вы должны определить, что такое анонимный пользователь. Мои пользователи должны подтвердить свой адрес электронной почты, и поэтому я объявляю всех пользователей, которые не прошли проверку, анонимными через 90 дней.
С помощью галочки PubSub я собираю всех пользователей и удаляю их, вот пример:
export const removeOldUsers = functions.pubsub.topic( "hourly-tick" ).onPublish( event => {
function getInactiveUsers( users: Array<UserRecord> = [], nextPageToken?: string ) {
let userList = users;
return admin.auth().listUsers( 1000, nextPageToken ).then( ( result: any ) => {
console.log( 'Found ${result.users.length} users' );
const inactiveUsers = result.users.filter( ( user ) => {
return moment( user.metadata.lastSignInTime ).isBefore( moment().subtract( 90, "days" ) ) && !user.emailVerified;
} );
console.log( 'Found ${inactiveUsers.length} inactive users' );
// Concat with list of previously found inactive users if there was more than 1000 users.
userList = userList.concat( inactiveUsers );
// If there are more users to fetch we fetch them.
if ( result.pageToken) {
return getInactiveUsers( userList, result.pageToken );
}
return userList;
} );
}
return new Promise( ( resolve ) => {
console.info( 'Start deleting user accounts' );
getInactiveUsers().then( ( users ) => {
resolve( users );
} );
} ).then( ( users: Array<UserRecord> ) => {
console.info( 'Start deleting ${users.length} user accounts' );
return Promise.map( users, ( user ) => {
return admin.auth().deleteUser( user.uid ).then( () => {
console.log( "Deleted user account", user.uid, "because of inactivity" );
} ).catch( ( error ) => {
console.error( "Deletion of inactive user account", user.uid, "failed:", error );
} );
}, { concurrency: 3 } );
} ).then( () => {
console.info( 'Done deleting user accounts' );
} );
} );
Здесь я только что отправил свой класс в npmjs @beyond-agentur-ug/firebase-delete-inactive-users
Ответ 5
Анонимные пользователи могут быть отправной точкой, прежде чем обновлять их до анонимного пользователя (подумайте о сайте электронной коммерции, где анонимный пользователь добавляет материал в свою корзину, а затем при оформлении заказа, обновления для пользователя Google или электронной почты/пароля, в этом случае вы, вероятно, не захотите потерять корзину пользователя). Как объяснено, это может быть полезно, если вы хотите сохранить данные от анонимного пользователя обновленному пользователю. Если вы хотите очистить анонимных пользователей, автоматизированного способа сделать это невозможно. Однако, как только вы либо выйдете из анонимного пользователя, либо внесите анонимного пользователя, состояние анонимного пользователя будет потеряно.