好的,经过漫长而痛苦的日子(字面意思是我花了超过 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)`
}
}
事后思考
这曾经是并且可能将是我在堆栈溢出中最长的帖子。我不得不说,让这件事发挥作用是一件痛苦的事情。简单地从一个端点删除数据所需的工作量和设置量简直是荒谬的。谷歌,请修复。