Как удалить данные аналитики пользователей из Firebase с помощью userDeletionRequests: upsert? - PullRequest
0 голосов
/ 28 августа 2018

Описание проблемы

Мое приложение для 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, но это не должно иметь никакого значения):

  1. Установить приложение
  2. Запустить некоторые пользовательские события (FirebaseAnalytics.logEvent)
  3. Обратите внимание, что эти события появляются на консоли Firebase
  4. (Примерно через минуту :) Сделайте вызов upsert, просмотрите HTTP 200 и отметьте «deletionRequestTime»
  5. Немедленно позвоните FirebaseAnalytics.resetAnalyticsData (чтобы очистить любые данные о событиях, кэшированных на устройстве)
  6. Удалить приложение
  7. Промыть и повторить 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' }

1 Ответ

0 голосов
/ 10 сентября 2018

Поддержка Firebase только что вернулась ко мне, и я цитирую:

Метод Upsert удаляет любые индивидуальные пользовательские данные, которые мы зарегистрировали, но агрегированные метрики не пересчитываются. Это означает, что вы можете не увидеть никаких изменений на вкладке событий в консоли Google Analytics.

Итак, в основном моя ошибка заключалась в том, что я ожидал, что события исчезнут с консоли.

Это, конечно, поднимает вопрос о том, как определить, что API действительно работает ... но, возможно, достаточно HTTP 200.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...