ios 如何使用Firebase在组中添加新成员

z4bn682m  于 2022-11-19  发布在  iOS
关注(0)|答案(2)|浏览(200)

我正在开发具有分组功能的应用程序。现在我遇到了在组中添加新成员的问题。
和Slack一样,在创建组的过程中,用户可以决定组名并添加尚未使用应用程序的成员。作为添加成员的功能,我想使用邀请邮件链接,使用Firebase动态链接。
数据结构如下

User
 - id
 - name
 - email

Group
  - id
  - groupName
  - members[]

群组的成员数组具有用户ID。但当有人创建新群组时,新用户可能尚未注册应用程序。因此,他们在应用程序中没有用户ID属性。
我该如何解决这个问题?当有人创建新组时,我是否应该使用Firebase auth开发新用户的注册函数?这意味着新成员会自动拥有用户ID,并将其添加到成员属性中。或者,组成员数组应该拥有邮件地址而不是用户ID。
请告诉我。我对你教我的Swift或JavaScript很满意。谢谢。

slsn1g29

slsn1g291#

更新

在阅读了你的评论后,我会提出另一种方法。
当Group creator用户将用户添加到一个组时,如果用户不存在,您可以从前端调用一个Callable Cloud Function(CF),在一个特定集合中创建一个临时Firestore文档。该文档的ID将是(将来的)userId。
然后,仍然在同一个Cloud函数中,您向电子邮件地址发送一封电子邮件(您需要自己生成电子邮件,例如使用电子邮件扩展名),其中包含一个链接,该链接包含userId作为查询字符串值。
第一个CF的代码示例:

exports.provisionNewAccount = functions
    .https.onCall(async (data, context) => {

        try {

            // You can check that the caller is authenticated
            // if (context.auth.uid) {execute the rest of the code} else {throw an error} 

            // New user email
            const userEmail = data.email;

            // Generate the new user docID
            const fakeDocRef = admin.firestore().collection('_').doc();
            const requestId = fakeDocRef.id;

            // Create the doc in a specific collection
            await admin.firestore().collection('usersCreationRequests').doc(requestId).set({ email: userEmail, treated: false });

            // Generate the link to include in the email
            const linkURL = 'https://your.app/register.html?requestId=' + requestId
            
            // Send the email by creating a doc in the Extension collection
            await db
                .collection("emails")
                .add({
                    to: userEmail,
                    message: {
                        subject: "....",
                        html: `<a href="${linkURL}">Click to create your account</a>`  // adapt the html to add some text
                    },
                });
                
                return {result: 'OK'}

        } catch (error) {
            console.log(JSON.stringify(error));
            throw new functions.https.HttpsError('internal', JSON.stringify(error));
        }

    });

您可以通过传递未来用户的电子邮件来调用它,如此处所述。
当电子邮件收件人点击链接时,您将打开Web应用程序的特定页面,其中显示一组字段,供未来用户输入密码、显示名称等。然后,点击此页面中的登录按钮,您将调用可调用云函数,并向其传递Firestore文档ID和字段值(您从查询字符串中获取文档ID)。
如下所示,此云函数在身份验证服务中创建用户(使用Admin SDK),并将Firestore文档标记为已处理。在Web应用程序中获取云函数结果后,您对用户进行身份验证(您有他的电子邮件和密码,因为他/她在表单中输入了密码)。

exports.createNewAccount = functions
    .https.onCall(async (data, context) => {

        try {

            const userEmail = data.email;
            const userId = data.userId;
            const userPassword = data.password;
            const userDisplayName = data.displayName;

            // Fetch the user doc created in the first CF
            const snapshot = await admin.firestore().collection('usersCreationRequests').doc(userId).get();

            const treated = snapshot.get('treated');
            const email = snapshot.get('email');

            if (!treated && userEmail === email) {

                const createUserPayload = {
                    email,
                    emailVerified: false,
                    password: userPassword,
                    displayName: userDisplayName
                };

                const userRecord = await admin.auth().createUser(createUserPayload);

                return { result: 'OK' }

            } else {

                return { result: 'User already created' }

            }

        } catch (error) {
            console.log(JSON.stringify(error));
            throw new functions.https.HttpsError('internal', JSON.stringify(error));
        }

    });

实际上,我在一个B2B协作Web应用程序中使用了这种方法,用户可以通过电子邮件邀请新用户。

初始答案

(与更新完全不同)
所以他们在应用程序中没有用户ID属性...我该如何解决这个问题?当有人创建新组时,我应该使用Firebase auth开发新用户的注册功能吗?
您可以使用Anonymous Authentication模式,它完全符合您的需求:
您可以使用Firebase身份验证来创建和使用临时匿名帐户,以通过Firebase进行身份验证。这些临时匿名帐户可用于允许尚未注册您的应用的用户使用受安全规则保护的数据。如果匿名用户决定注册您的应用,您可以将他们的登录凭据链接到匿名帐户,以便他们可以在将来的会话中继续使用受保护的数据。
使用匿名身份验证登录时,将创建一个userId(uid),稍后您可以将匿名帐户转换为永久帐户

r6hnlfcb

r6hnlfcb2#

我总是使用userId来实现这种功能,你可以使用匿名身份验证后,用户点击邀请链接获得userId,然后如果需要解锁更多的功能与进一步的身份验证(添加更多的提供商)。
如果您只使用邮件地址而不进行身份验证,很难编写规则来防止用户访问不需要的数据,就像任何人都知道您的电子邮件能够访问您的帐户.

相关问题