Описание проблемы
Мое приложение для Android собирает данные через Google Analytics для Firebase. По соображениям конфиденциальности пользователи должны иметь возможность стереть свои данные с серверов Firebase, если они захотят это сделать.
Приложение запрашивает удаление, перенаправив его Firebase APP_INSTANCE_ID
на мой собственный сервер. Этот сервер был заранее подготовлен с учетными данными из моей личной учетной записи Google (через oauth2) для управления проектом Firebase. Сервер аутентифицируется с www.googleapis.com
и, используя предоставленный APP_INSTANCE_ID
, вызывает upsert.
Как отмечается в документации , для этой задачи подходит общий API Google Analytics.
После некоторых начальных проблем (из-за того, что у меня не было правильной области проверки подлинности, и 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 все еще присутствуют в таблице событий. На сервере Firebase не было обнаружено заметного изменения состояния в результате действий пользователя.
Вопрос
Итак, что я делаю не так? как успешно удалить данные пользователя из Google Analytics для Firebase?
EDIT
Вот код, который я использую для запроса (из 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' }