【问题标题】:Firebase: Delete user analytics data - userdeletionRequests:upsert - GDPRFirebase:删除用户分析数据 - userdeletionRequests:upsert - GDPR
【发布时间】:2021-12-27 16:52:08
【问题描述】:

我的问题是,如何使用“Google 用户删除 API”及其方法:userdeletionRequests:upsert 从 Firebase 中删除用户分析数据?这对我完全履行 GDPR 很重要。

我尝试搜索这个,但没有将它与“NodeJS”和“firebase-cloud-functions”结合使用的解决方案。

我最大的问题是,我如何获得访问权,令牌,这就是我现在所拥有的:

const accessToken = (await admin.credential.applicationDefault().getAccessToken()).access_token;

return ky.post(constants.googleUserDeletionURL, {
    body: JSON.stringify({
        kind: "analytics#userDeletionRequest",
        id: {
            type: "USER_ID",
            userId: uid,
          },
          propertyId: constants.googleUserDeletionPropertyId,
    }),
    headers: {
        "Authorization": `Bearer ${accessToken}`,
    },
}).catch((err) => {
    functions.logger.log(`An Error happened trying to delete user-anayltics ${(err as Error).message}`);
});

但我总是得到An Error happened trying to delete user-anayltics Request failed with status code 403 Forbidden

【问题讨论】:

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


    【解决方案1】:

    好的,经过漫长而痛苦的日子(字面意思是我花了超过 20 个小时),我已经想出了如何实现这个请求。这是步骤指南的步骤:

    第 1 步 - 需要的依赖项

    要向 google 发送 post-request,我们需要一个 http-client-library。我选择了“ky”,所以我们需要先安装它:

    npm install ky
    

    此外,我们需要创建或拥有 oAuth2 令牌,否则 post 请求将被拒绝并显示“错误 403”。要创建我们自己的 oAuth 令牌,我们需要另一个依赖项:

    npm install @googleapis/docs
    

    第 2 步 - 需要 Google 媒体资源 ID

    根据您的请求,Google 需要知道您的目标是哪个属性 ID/项目(稍后它应该在哪里删除用户分析数据)。要获取此属性 ID,我们需要通过 Firebase(不是“真正的”GCP,即通过 Firebase 的那个)登录 GCP。

    为此,请进入您的“console.firebase.google.com”→选择您的项目→分析仪表板→“在 Google Analytics 中查看更多信息(右上角的按钮)”

    将“property-id”写入搜索字段,然后将其保存在某处(我们稍后需要它)

    第 3 步 - 创建 Client-Secret

    第三步是创建一个服务帐户,我们稍后会将其添加到我们的功能文件夹中,以创建我们的oAuthClient(别担心,稍后您会明白我的意思)

    要创建新的service.json,请通过“https://cloud.google.com/”登录谷歌云平台,然后按照图片操作:

    第一:

    第二:

    第三:

    第四:

    第五

    第 4 步 - 下载 JSON

    创建“oAuth-Deleter 服务帐户”后,我们需要手动下载所需的 JSON,以便将其粘贴到我们的函数文件夹中。

    为此,请在“服务帐户”下选择“oauth-deleter@your-domain.iam.gserviceaccount.com”

    然后点击“Keys”和“Add key”,会自动下载一个service-json(选择Key type → JSON → Create)。

    第 5 步 - 将 JSON 文件粘贴到您的函数文件夹中

    要放松一下情绪,这是一个简单的步骤。将下载的 JSON 文件粘贴到您的函数文件夹中。

    第 6 步 - 授予对我们新创建的 oAuth-Deleter-Account 的访问权限

    创建服务帐户并在普通 GCP 中授予它访问权限对于 Google 来说是不够的,因此我们还必须在我们的 Firebase 项目中授予它访问权限。为此,请返回“通过 Firebase 的 GCP(参见第 2 步)”→ 单击设置→“帐户的用户访问权限”→ 单击“加号”

    然后点击“添加用户”并将我们之前复制的电子邮件写入电子邮件字段(步骤3中的电子邮件,图片第四“服务帐户ID”)。在我们的例子中,它是“oAuth-Deleter@your- domain.iam.gserviceaccount.com”。此外,它需要管理员访问权限:

    第 6 步 - 代码

    现在,经过数百万个不必要但必要的步骤,我们进入了最后一部分。该死的代码。我用“compilerOptions”→“module”:“esnext”,“target”:“esnext”在打字稿中写了这个。但我相信你足够聪明,可以在完成这么多步骤后更改代码:)

    import admin from "firebase-admin";
    import functions from "firebase-functions";
    import ky from "ky";
    import docs from "@googleapis/docs";
    import { UserRecord } from "firebase-functions/v1/auth";
    
    export const dbUserOnDeleted = functions.
       .auth
       .user()
       .onDelete((user) => doOnDeletedUser(user))
    
        ----------------------------
    
    export asnc function doOnDeletedUser/user: UserRecord) {
       try {
           const googleDeletionURL = "https://www.googleapis.com/analytics/v3/userDeletion/userDeletionRequests:upsert"
           
           // Step 1: Paste propertyID: (See Step 2)
           const copiedPropertyID = "12345678"
    
           // Step 2: Create oAuthClient
           const oAuthClient = new docs.auth.GoogleAuth({
               keyFile: "NAME-OF-THE-FILE-YOU-COPIED-INTO-YOUR-FUNCTIONS-FOLDER",
               scopes: ["https://www.googleapis.com/auth/analytics.user.deletion"]
           });
    
           // Step 3: Get user uid you want to delete from user-analytics
           const uid = user.uid
    
          // Step 4: Generate access token 
          // (this is the reason why we needed the 5 steps before this)
          // yup, a single line of code
          const accessToken = await oAuthClient.getAccessToken() as string;
    
          // Step 5: Make the request to google and delete the user
          return ky.post(googleDeletionURL, {
              body: JSON.stringify({
                  kind: "analytics#userDeletionRequest",
                  id: {
                     type: "USER_ID",
                     userid: uid
                  },
                  propertyId: copiedPropertyID
              }),
              headers: {
                  "Authorization": "Bearer " + accessToken,
              }
          });
    
       } catch (err) {
         functions.logger.error(`Something bad happened, ${(err as Error).message)`
       }
    }
    

    事后思考

    这曾经是并且可能将是我在堆栈溢出中最长的帖子。我不得不说,让这件事发挥作用是一件痛苦的事情。简单地从一个端点删除数据所需的工作量和设置量简直是荒谬的。谷歌,请修复。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-12-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-10-19
      • 2021-03-04
      • 1970-01-01
      • 2020-01-17
      相关资源
      最近更新 更多