如何使用 userDeletionRequests:upsert 从 Firebase 中删除用户分析数据?
How do I delete user analytics data from Firebase using userDeletionRequests:upsert?
问题描述
我的 Android 应用通过 Google Analytics for Firebase 收集数据。出于隐私原因,如果用户选择这样做,他们必须能够从 Firebase 服务器上擦除他们的数据。
该应用通过将其 Firebase APP_INSTANCE_ID
转发到我自己的服务器来请求删除。此服务器已预先准备好凭据,来自我的个人 Google 帐户(通过 oauth2),用于管理 Firebase 项目。服务器使用 www.googleapis.com
进行身份验证,并使用提供的 APP_INSTANCE_ID
调用更新插入。
如 documentation 所述,通用 Google 分析 API 适用于此任务。
经过一些最初的麻烦(b/c 我没有正确的授权范围,并且分析 API 没有正确启用),googleapis.com
现在 returns 每个 upsert 请求的 HTTP 200。 (顺便说一句,即使你提供了一个伪造的 APP_INSTANCE_ID
,它也是 returns 200。)
这是更新插入的示例响应,没有任何问题:
{ 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
是正确的,并且 stable 直到用 resetAnalyticsData()
.
重置的那一刻
测试程序
为了测试删除,我使用以下程序在 Firebase 中填充了几个自定义事件(Nexus 5X 模拟器,没有 Google Play,没有配置 Google 帐户,但这不应该任何区别):
- 安装应用程序
- 触发一些自定义事件(
FirebaseAnalytics.logEvent
)
- 观察那些事件出现在 Firebase 控制台上
- (大约一分钟后:)进行 upsert 调用,观察 HTTP 200,并记下 "deletionRequestTime"
- 立即调用
FirebaseAnalytics.resetAnalyticsData
(清除设备上缓存的任何事件数据)
- 卸载应用程序
- 冲洗并重复 7 或 8 次
然而,即使在 24 小时后,100% 的 Firebase 事件仍然存在于事件 table 中。由于更新插入,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' }
Firebase 支持刚刚回复我,我引用:
Upsert method deletes any individual user data we have logged, but aggregate metrics are not recomputed. This means that you might not see any changes in the events tab in your Analytics console.
所以,基本上我的错误是期望事件从控制台消失。
当然,这提出了一个问题,即如何确定 API 是否确实在工作...但也许 HTTP 200 就足够了。
问题描述
我的 Android 应用通过 Google Analytics for Firebase 收集数据。出于隐私原因,如果用户选择这样做,他们必须能够从 Firebase 服务器上擦除他们的数据。
该应用通过将其 Firebase APP_INSTANCE_ID
转发到我自己的服务器来请求删除。此服务器已预先准备好凭据,来自我的个人 Google 帐户(通过 oauth2),用于管理 Firebase 项目。服务器使用 www.googleapis.com
进行身份验证,并使用提供的 APP_INSTANCE_ID
调用更新插入。
如 documentation 所述,通用 Google 分析 API 适用于此任务。
经过一些最初的麻烦(b/c 我没有正确的授权范围,并且分析 API 没有正确启用),googleapis.com
现在 returns 每个 upsert 请求的 HTTP 200。 (顺便说一句,即使你提供了一个伪造的 APP_INSTANCE_ID
,它也是 returns 200。)
这是更新插入的示例响应,没有任何问题:
{ 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
是正确的,并且 stable 直到用 resetAnalyticsData()
.
测试程序
为了测试删除,我使用以下程序在 Firebase 中填充了几个自定义事件(Nexus 5X 模拟器,没有 Google Play,没有配置 Google 帐户,但这不应该任何区别):
- 安装应用程序
- 触发一些自定义事件(
FirebaseAnalytics.logEvent
) - 观察那些事件出现在 Firebase 控制台上
- (大约一分钟后:)进行 upsert 调用,观察 HTTP 200,并记下 "deletionRequestTime"
- 立即调用
FirebaseAnalytics.resetAnalyticsData
(清除设备上缓存的任何事件数据) - 卸载应用程序
- 冲洗并重复 7 或 8 次
然而,即使在 24 小时后,100% 的 Firebase 事件仍然存在于事件 table 中。由于更新插入,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' }
Firebase 支持刚刚回复我,我引用:
Upsert method deletes any individual user data we have logged, but aggregate metrics are not recomputed. This means that you might not see any changes in the events tab in your Analytics console.
所以,基本上我的错误是期望事件从控制台消失。
当然,这提出了一个问题,即如何确定 API 是否确实在工作...但也许 HTTP 200 就足够了。