我有 2 个注册页面,一个用于学生,一个用于教师。 当他们注册时,我如何为每个人设置不同的自定义声明? (学生:正确或老师:正确)
我猜这可能在 .onCreate 上实现?我只能为每个 onCreate 函数设置一个自定义声明,如何使其动态化?
exports.AddTeacherRole = functions.auth.user().onCreate(async (authUser) => {
if (authUser.email) {
const customClaims = {
teacher: true,
};
传递给 Authentication Cloud Functions 的
authUser
对象与 Firebase Admin SDK 返回的 UserRecord
的对象类型完全相同。
根据您创建用户的方式(例如,从前端,在 JavaScript 中使用
createUserWithEmailAndPassword()
,或者例如从 Admin SDK,使用 createUser()
),UserRecord
可能会拥有或多或少的“额外”属性(例如 displayName
、photoURL
等)。
问题在于,这个
UserRecord
实例没有可用于指示用户角色(学生或教师)的特定属性。因此,您无法在云函数中获取此信息,该信息是在创建用户时触发的。
一种常见的方法是将此类额外数据添加到与用户 ID 具有相同 ID 的 Firestore 文档(或实时数据库节点)中。然后从这个文档中,您可以触发一个更新用户记录的云函数。
另一种方法是使用云函数来完成所有工作:创建用户、设置自定义声明并创建 Firestore 文档。您将在以下文章中找到有关这种方法的一些详细解释。
回答您在已删除答案中提出的问题:
为了验证一下,可以通过创建 2 个单独的 https 来解决 可调用的云函数,用于处理每个角色的注册 例子?
是的,您可以有两个可调用的云函数,但我认为应该可以只拥有一个,并在调用此云函数时传递不同的参数值,具体取决于用户角色。
类似:
const setCustomClaim = firebase.functions().httpsCallable('setCustomClaim');
const userRole = "student" // or role = "teacher"
setCustomClaim({role: userRole, userId, bar: "foo" }).then(function(result) {
// Read result of the Cloud Function.
// ...
});