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

ние проблемы

Мое приложение для Android собирает данные через Google Analytics для Firebase. По соображениям конфиденциальности пользователи должны иметь возможность стереть свои данные с серверов Firebase, если они захотят это сделать.

Приложение запрашивает удаление путем пересылки его FirebaseAPP_INSTANCE_ID на мой собственный сервер. Этот сервер был заранее подготовлен с учетными данными из моей личной учетной записи Google (через oauth2) для управления проектом Firebase. Сервер аутентифицируется сwww.googleapis.comи, используя прилагаемыйAPP_INSTANCE_IDВызывает upsert.

Как отмеченодокументациядля этой задачи подходит общий API Google Analytics.

После некоторых начальных проблем (из-за того, что у меня не было правильной области аутентификации, и API-интерфейс Google 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 не произошло в результате upserts.

Вопрос

Итак, что я делаю не так? Как успешно удалить пользовательские данные из Google Analytics для Firebase?

РЕДАКТИРОВАТЬ

Вот код, который я использую для отправки запроса (из 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)

Ваш ответ на вопрос