Как удалить данные аналитики пользователя из Firebase с помощью userDeletionRequests: upsert?
Описание
мое приложение для Android собирает данные через Google Analytics для Firebase. По соображениям конфиденциальности пользователи должны иметь возможность стереть свои данные с серверов Firebase, если они решат это сделать.
приложение запрашивает удаление, перенаправляя его Firebase APP_INSTANCE_ID
на мой собственный сервер. Этот сервер был подготовлен заранее с учетными данными из моей личной учетной записи Google (через oauth2) для управления проектом Firebase. Аутентификация сервера с www.googleapis.com
, и, используя предоставленные APP_INSTANCE_ID
, вызывает upsert.
как отмечает документация, универсальный API Google Analytics подходит для этой задачи.
после некоторых начальных проблем (b/c у меня не было правильной области auth, и API Analytics не был должным образом включен), googleapis.com
теперь возвращает HTTP 200 для каждого запроса upsert. (В сторону, даже если вы предоставляете фиктивный APP_INSTANCE_ID
, он возвращает 200.)
вот пример ответ от upsert, который не показывает ничего плохого:
{ kind: 'analytics#userDeletionRequest',
id:
{ type: 'APP_INSTANCE_ID',
userId: (REDACTED 32-char hexidecimal string) },
firebaseProjectId: (REDACTED),
deletionRequestTime: '2018-08-28T12:46:30.874Z' }
я знаю firebaseProjectId
правильно, потому что если я изменю его, я получу ошибку. Я проверил, что APP_INSTANCE_ID
правильно и стабильно до момента сброса с resetAnalyticsData()
.
Процедура Проверки
чтобы проверить удаление, я заполнил Firebase несколькими пользовательскими событиями, используя процедуру ниже (эмулятор Nexus 5X, без Google Play, без настроенных учетных записей Google, но это не должно сделайте любую разницу):
- установить приложение
- запуск некоторых пользовательских событий (
FirebaseAnalytics.logEvent
) - наблюдайте, как эти события появляются на консоли Firebase
- (примерно через минуту:) сделайте вызов upsert, соблюдайте HTTP 200 и обратите внимание на "deletionRequestTime"
- немедленно вызвать
FirebaseAnalytics.resetAnalyticsData
(для очистки любых данных событий, кэшированных на устройстве) - удалить приложение
- промыть и повторить 7 или 8 раз
однако даже через 24 часа 100% событий Firebase все еще присутствуют в таблице событий. В результате upserts на сервере Firebase не произошло заметного изменения состояния.
вопрос
Итак, что я делаю не так? как успешно удалить пользовательские данные из Google Analytics для Firebase?
редактировать
вот код, который я использую, чтобы сделать запрос (с узел.в JS):
const request = require( 'request' );
...
_deletePersonalData( data )
{
return new Promise( (resolve, reject) => {
request.post({
url: 'https://www.googleapis.com/analytics/v3/userDeletion/userDeletionRequests:upsert',
body: {
kind: 'analytics#userDeletionRequest',
id: {
type: 'APP_INSTANCE_ID',
userId: data.firebaseAppInstanceId
},
firebaseProjectId: (REDACTED)
},
headers: {
Authorization: 'Bearer ' + iap.getCurAccessToken()
},
json: true
}, (err, res, body) => {
console.log( 'user-deletion POST complete' );
console.log( 'Error ' + err );
console.log( 'Body ', body );
if( err )
{
reject( err );
return;
}
if( body.error )
{
reject( new Error( 'The Google service returned an error: ' + body.error.message + ' (' + body.error.code + ')' ) );
return;
}
resolve({ deletionRequestTime: body.deletionRequestTime });
});
});
}
вот примерный текст запроса:
{
kind: 'analytics#userDeletionRequest',
id: {
type: 'APP_INSTANCE_ID',
userId: (REDACTED 32-char hexidecimal string)
},
firebaseProjectId: (REDACTED)
}
и вот вывод консоли для того же запроса (тот же userId
и все):
user-deletion POST complete
Error: null
Body: { kind: 'analytics#userDeletionRequest',
id:
{ type: 'APP_INSTANCE_ID',
userId: (REDACTED 32-char hexidecimal string) },
firebaseProjectId: (REDACTED),
deletionRequestTime: '2018-08-29T17:32:06.949Z' }
1 ответов
поддержка Firebase только что вернулась ко мне, и я цитирую:
метод Upsert удаляет все данные отдельных пользователей, которые мы зарегистрировали, но агрегированные метрики не пересчитываются. Это означает, что на вкладке События в консоли Analytics могут не отображаться изменения.
Итак, в основном моя ошибка заключалась в том, что я ожидал, что события исчезнут с консоли.
Это, конечно, поднимает вопрос о том, как определить, что API на самом деле рабочий... но, возможно, HTTP 200 достаточно.