如何使用userDeletionRequests:upsert从Firebase删除用户分析数据?

时间:2018-08-28 19:03:55

标签: google-analytics google-analytics-api firebase-analytics

问题描述

我的Android应用通过Google Analytics for Firebase收集数据。出于隐私原因,用户必须选择从Firebase服务器上删除其数据。

该应用通过将其Firebase APP_INSTANCE_ID转发到我自己的服务器来请求删除。该服务器已预先通过我的个人Google帐户(通过oauth2)使用凭据准备好,用于管理Firebase项目。服务器使用www.googleapis.com进行身份验证,然后使用提供的APP_INSTANCE_ID调用upsert。

documentation指出,通用Google Analytics(分析)API可以完成此任务。

在遇到一些最初的麻烦之后(b / c我没有正确的身份验证范围,并且没有正确启用Analytics API),googleapis.com现在为每个upsert请求返回HTTP 200。 (顺便说一句,即使您提供了伪造的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()重置它为止。

测试程序

要测试删除操作,我使用以下过程(Nexus 5X模拟器,未配置Google Play,未配置Google帐户,但没有任何区别)向Firebase填充了几个自定义事件:

  1. 安装应用
  2. 触发一些自定义事件(FirebaseAnalytics.logEvent
  3. 观察这些事件出现在Firebase控制台上
  4. (大约一分钟后:)进行upsert调用,遵守HTTP 200,并记下“ deletionRequestTime”
  5. 立即调用FirebaseAnalytics.resetAnalyticsData(清除设备上缓存的所有事件数据)
  6. 卸载应用
  7. 冲洗并重复7或8次

但是,即使在24小时后,事件表中仍然存在100%的Firebase事件。由于出现了更新问题,Firebase服务器上没有发生明显的状态变化。

问题

那么,我在做什么错?如何从Google Analytics for 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 个答案:

答案 0 :(得分:2)

Firebase支持刚刚回到我身边,我引用:

  

Upsert方法删除我们记录的任何单个用户数据,但不会重新计算汇总指标。这意味着您可能不会在Analytics(分析)控制台的“事件”标签中看到任何更改。

所以,基本上我的错误是期望事件从控制台中消失。

这当然提出了一个问题,即人们如何确定API确实在工作……但是HTTP 200也许就足够了。