Google analytics 如何使用userDeletionRequests:upsert从Firebase中删除用户分析数据? 问题描述

Google analytics 如何使用userDeletionRequests:upsert从Firebase中删除用户分析数据? 问题描述,google-analytics,google-analytics-api,firebase-analytics,Google Analytics,Google Analytics Api,Firebase Analytics,我的Android应用程序通过Google Analytics for Firebase收集数据。出于隐私原因,用户必须能够从Firebase服务器上擦除数据,如果他们选择这样做的话 该应用程序通过将其Firebaseapp\u实例\u ID转发到我自己的服务器来请求删除。这个服务器已经提前准备好了凭据,来自我的个人Google帐户(通过oauth2),用于管理Firebase项目。服务器通过www.googleapis.com进行身份验证,并使用提供的APP\u INSTANCE\u ID,调

我的Android应用程序通过Google Analytics for Firebase收集数据。出于隐私原因,用户必须能够从Firebase服务器上擦除数据,如果他们选择这样做的话

该应用程序通过将其Firebase
app\u实例\u ID
转发到我自己的服务器来请求删除。这个服务器已经提前准备好了凭据,来自我的个人Google帐户(通过oauth2),用于管理Firebase项目。服务器通过
www.googleapis.com
进行身份验证,并使用提供的
APP\u INSTANCE\u ID
,调用upsert

如前所述,通用Google Analytics API适用于此任务

在出现一些初始问题(b/c我没有正确的身份验证范围,并且分析API没有正确启用)之后,
googleapis.com
现在为每个upsert请求返回HTTP 200。(顺便说一句,即使您提供了一个伪造的
APP\u实例\u 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\u INSTANCE\u ID
是正确的,并且在使用
resetAnalyticsData()
重置之前是稳定的

试验程序 为了测试删除,我使用以下过程(Nexus 5X emulator,没有Google Play,没有配置Google帐户,但这不会有任何区别),用几个自定义事件填充Firebase:

  • 安装应用程序
  • 触发一些自定义事件(
    FirebaseAnalytics.logEvent
  • 观察Firebase控制台上显示的事件
  • (大约一分钟后:)进行upsert调用,观察HTTP 200,并注意“deletionRequestTime”
  • 立即调用
    FirebaseAnalytics.resetAnalyticsData
    (清除设备上缓存的任何事件数据)
  • 卸载应用程序
  • 冲洗并重复7或8次
  • 然而,即使24小时后,100%的Firebase事件仍然存在于事件表中。由于升级,Firebase服务器上未发生可识别的状态更改

    问题: 那么,我做错了什么?如何从Google Analytics for Firebase成功删除用户数据

    编辑

    下面是我用来发出请求的代码(来自node.js):

    const request=require('request');
    ... 
    _删除个人数据(数据)
    { 
    返回新承诺((解决,拒绝)=>{
    请求.post({
    网址:'https://www.googleapis.com/analytics/v3/userDeletion/userDeletionRequests:upsert', 
    正文:{
    种类:“分析#用户删除请求”,
    id:{
    键入:“应用程序\实例\ ID”,
    userId:data.firebaseAppInstanceId
    }, 
    firebaseProjectId:(已编辑)
    }, 
    标题:{
    授权:“持有者”+iap.getCurAccessToken()
    }, 
    json:true
    },(err,res,body)=>{
    log('user deletation POST complete');
    console.log('Error'+err);
    console.log('Body',Body);
    如果(错误)
    { 
    拒绝(错误);
    返回;
    } 
    if(body.error)
    { 
    拒绝(新错误('谷歌服务返回错误:'+body.Error.message+'('+body.Error.code+')));
    返回;
    } 
    解析({deletionRequestTime:body.deletionRequestTime});
    }); 
    });
    } 
    
    下面是一个请求主体示例:

    {
    种类:“分析#用户删除请求”,
    身份证:{
    键入:“应用程序\实例\ ID”,
    userId:(已编辑的32字符十六进制字符串)
    },
    firebaseProjectId:(已编辑)
    }
    
    这里是针对相同请求的控制台输出(相同的
    userId
    和所有内容):

    用户删除帖子完成
    错误:null
    正文:{kind:'analytics#userDeletionRequest',
    身份证件:
    {类型:'APP_INSTANCE_ID',
    userId:(已编辑的32字符十六进制字符串)},
    firebaseProjectId:(已编辑),
    删除请求时间:'2018-08-29T17:32:06.949Z'}
    
    Firebase支持刚刚回复我,我引用:

    Upsert方法删除我们记录的任何单个用户数据,但不会重新计算聚合度量。这意味着您可能在分析控制台的事件选项卡中看不到任何更改

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


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

    这应该是有效的。您需要重新联系Firebase支持以获得更多帮助。还请通过颠覆API(FWIW)提供请求,我的经历与此类似-请求最终成功,但在发生任何事情之前花了很长时间(几天)。仅供参考,我目前正在等待Firebase支持部门的回复。并且,到目前为止未发现任何删除。请编辑您的问题并包括您提出的请求。我需要的不仅仅是回复。@DalmTo按要求编辑,如果我遗漏了什么,请告诉我