通过自定义声明使用 Firebase Auth 获取 WooCommerce 用户订阅状态
Getting WooCommerce user subscription status with Firebase Auth through custom claims
我对 Firebase 和自定义声明非常陌生,所以我希望有人能提供帮助。
我有一个使用 Firebase Auth 作为其身份验证系统的应用程序。该应用程序是使用 Flutter 构建的。它是一个基于订阅的应用程序,因此用户必须具有 'active' 订阅状态才能登录。每个用户的订阅信息(包括状态)存储在名为 [=31] 的 Firestore 集合中=].每个用户在创建订阅时都会分配一个以其 uid 作为名称的文档。
我的应用程序的工作方式是用户将使用 Firebase 身份验证在 WordPress 网站上创建一个帐户。此时,他们的用户已在 Firebase Auth 中创建,但他们在 'subscriptions' Firestore 集合中没有分配的文档。只有在他们使用 WooCommerce 订阅购买订阅后才会创建。我基本上需要在以下情况下阻止他们登录:
- 没有为他们创建 'subscriptions' Firestore 文档(即他们已经创建了一个帐户但尚未购买订阅)。
- 一旦他们购买了订阅并为他们创建了文档,他们的订阅状态就不是 'active'。
据我所知,只有在订阅有效时才允许用户登录的最佳方法是使用自定义声明。我在 javascript 中使用 VS Code 构建了以下两个自定义声明函数,它们旨在检查 Firestore 中的订阅集合以了解用户的订阅状态,无论是在创建文档时还是在更新文档时:
const functions = require("firebase-functions");
const admin = require("firebase-admin");
admin.initializeApp();
// Claim when a user is created
exports.createUser = functions.firestore
.document("subscriptions/{subscription}")
.onCreate((snap, context) => {
// Get an object representing the document
const newValue = snap.data();
// Access a particular field
const userId = newValue.firebaseUid;
console.log("New subscription ${UserId} created!");
const status = newValue.status;
// Assign claims to the user
return admin.auth().setCustomUserClaims(userId, {status});
});
// Claim when a user is updated
exports.updateUser = functions.firestore
.document("subscriptions/{subscription}")
.onUpdate((change, context) => {
// Get an object representing the document
const updatedValue = change.after.data();
// Access a particular field
const userId = updatedValue.firebaseUid;
console.log("User subscription status updated!");
const status = updatedValue.status;
// Assign claims to the user
return admin.auth().setCustomUserClaims(userId, {status});
});
出于某种原因,这些都不起作用。他们确实在 Firebase 控制台中成功上传到我的项目。但是,他们没有向标准 auth 声明添加自定义声明。我期待在索赔地图的末尾看到 'status: active/pending/cancelled'
。他们似乎也无法处理用户不存在文档的情况(即当用户刚刚创建帐户但尚未订阅时)。
有人可以告诉我为什么这些不起作用以及我做错了什么吗?我怎样才能确保将订阅状态添加到我的用户的身份验证声明中,以便我可以保证他们只有在有有效订阅的情况下才能登录?谢谢!
我意识到上面代码的主要问题是我使用了错误的 Firebase 用户 ID getter 值。我正在使用来自 TechCater 的插件,需要将值 firebaseUid
更改为 firebase_user_id
。另外,我把函数合二为一,用onWrite
代替了onCreate
和onUpdate
。完美运行的 new/updated 函数如下所示:
const functions = require("firebase-functions");
const admin = require("firebase-admin");
admin.initializeApp();
// Claim when a user is updated
exports.onUpdateUsers = functions.firestore
.document("subscriptions/{subscription}")
.onWrite((change, context) => {
// Get an object representing the document
const updatedValue = change.after.data();
if (updatedValue == null) {
return;
}
// Access a particular field
const userId = updatedValue.firebase_user_id;
console.log("User subscription status created or updated!");
console.log("User ID: ", userId);
const status = updatedValue.status;
console.log("Status: ", status);
// Assign claims to the user
return admin.auth().setCustomUserClaims(userId, {status});
});
此外,关于我在最初的问题中关于当用户注册但未购买订阅时如何创建自定义声明的评论,我意识到我需要做的就是了解当用户已经创建了他们的帐户,但没有购买订阅,订阅状态将返回为 null
,所以我只需要检查状态是 null
以及 'active'
或其他。该功能现在完全按照我的需要工作。
我对 Firebase 和自定义声明非常陌生,所以我希望有人能提供帮助。
我有一个使用 Firebase Auth 作为其身份验证系统的应用程序。该应用程序是使用 Flutter 构建的。它是一个基于订阅的应用程序,因此用户必须具有 'active' 订阅状态才能登录。每个用户的订阅信息(包括状态)存储在名为 [=31] 的 Firestore 集合中=].每个用户在创建订阅时都会分配一个以其 uid 作为名称的文档。
我的应用程序的工作方式是用户将使用 Firebase 身份验证在 WordPress 网站上创建一个帐户。此时,他们的用户已在 Firebase Auth 中创建,但他们在 'subscriptions' Firestore 集合中没有分配的文档。只有在他们使用 WooCommerce 订阅购买订阅后才会创建。我基本上需要在以下情况下阻止他们登录:
- 没有为他们创建 'subscriptions' Firestore 文档(即他们已经创建了一个帐户但尚未购买订阅)。
- 一旦他们购买了订阅并为他们创建了文档,他们的订阅状态就不是 'active'。
据我所知,只有在订阅有效时才允许用户登录的最佳方法是使用自定义声明。我在 javascript 中使用 VS Code 构建了以下两个自定义声明函数,它们旨在检查 Firestore 中的订阅集合以了解用户的订阅状态,无论是在创建文档时还是在更新文档时:
const functions = require("firebase-functions");
const admin = require("firebase-admin");
admin.initializeApp();
// Claim when a user is created
exports.createUser = functions.firestore
.document("subscriptions/{subscription}")
.onCreate((snap, context) => {
// Get an object representing the document
const newValue = snap.data();
// Access a particular field
const userId = newValue.firebaseUid;
console.log("New subscription ${UserId} created!");
const status = newValue.status;
// Assign claims to the user
return admin.auth().setCustomUserClaims(userId, {status});
});
// Claim when a user is updated
exports.updateUser = functions.firestore
.document("subscriptions/{subscription}")
.onUpdate((change, context) => {
// Get an object representing the document
const updatedValue = change.after.data();
// Access a particular field
const userId = updatedValue.firebaseUid;
console.log("User subscription status updated!");
const status = updatedValue.status;
// Assign claims to the user
return admin.auth().setCustomUserClaims(userId, {status});
});
出于某种原因,这些都不起作用。他们确实在 Firebase 控制台中成功上传到我的项目。但是,他们没有向标准 auth 声明添加自定义声明。我期待在索赔地图的末尾看到 'status: active/pending/cancelled'
。他们似乎也无法处理用户不存在文档的情况(即当用户刚刚创建帐户但尚未订阅时)。
有人可以告诉我为什么这些不起作用以及我做错了什么吗?我怎样才能确保将订阅状态添加到我的用户的身份验证声明中,以便我可以保证他们只有在有有效订阅的情况下才能登录?谢谢!
我意识到上面代码的主要问题是我使用了错误的 Firebase 用户 ID getter 值。我正在使用来自 TechCater 的插件,需要将值 firebaseUid
更改为 firebase_user_id
。另外,我把函数合二为一,用onWrite
代替了onCreate
和onUpdate
。完美运行的 new/updated 函数如下所示:
const functions = require("firebase-functions");
const admin = require("firebase-admin");
admin.initializeApp();
// Claim when a user is updated
exports.onUpdateUsers = functions.firestore
.document("subscriptions/{subscription}")
.onWrite((change, context) => {
// Get an object representing the document
const updatedValue = change.after.data();
if (updatedValue == null) {
return;
}
// Access a particular field
const userId = updatedValue.firebase_user_id;
console.log("User subscription status created or updated!");
console.log("User ID: ", userId);
const status = updatedValue.status;
console.log("Status: ", status);
// Assign claims to the user
return admin.auth().setCustomUserClaims(userId, {status});
});
此外,关于我在最初的问题中关于当用户注册但未购买订阅时如何创建自定义声明的评论,我意识到我需要做的就是了解当用户已经创建了他们的帐户,但没有购买订阅,订阅状态将返回为 null
,所以我只需要检查状态是 null
以及 'active'
或其他。该功能现在完全按照我的需要工作。