описание проблемы
Мои приложения Android собирают данные через Google Analytics для Firebase. По соображениям конфиденциальности пользователи должны иметь возможность стереть свои данные с серверов Firebase, если они захотят это сделать.
Приложение запрашивает удаление, пересылая свой Firebase APP_INSTANCE_ID
на мой собственный сервер. Этот сервер был подготовлен заранее с учетными данными из моей личной учетной записи Google (через oauth2) для управления проектом Firebase. Сервер аутентифицируется с помощью www.googleapis.com
и, используя предоставленный APP_INSTANCE_ID
, вызывает воскрешение.
Как отмечается в документации, для этой задачи подходит общий API Google Analytics.
После некоторых начальных проблем (b/c у меня не было правильной области полномочий, и API googleapis.com
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 и обратите внимание на "deleteionRequestTime",
- Немедленно вызовите
FirebaseAnalytics.resetAnalyticsData
(чтобы очистить данные о событиях, сохраненные на устройстве) - Удаление приложения
- Промыть и повторить 7 или 8 раз
Однако даже спустя 24 часа 100% событий Firebase все еще присутствуют в таблице событий. На сервере Firebase не произошло заметного изменения состояния в результате повышения.
Вопрос
Итак, что я делаю неправильно? как я могу успешно удалить данные пользователя из Google Analytics для Firebase?
РЕДАКТИРОВАТЬ
Здесь код, который я использую, чтобы сделать запрос (from node.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' }