通过Firebase云函数实现Unity匿名登录后CurrentUser未设置的问题
问题分析与解决方案
你遇到的核心问题是:通过云函数调用admin.auth().createUser({anonymous: true})仅能在Firebase后台生成匿名用户记录,但并未在Unity客户端建立有效的Auth会话——Firebase Auth的CurrentUser只有在客户端完成登录流程后才会被设置,而直接创建用户的操作不会自动同步客户端状态。
要保留云函数创建用户的逻辑同时让Unity端CurrentUser生效,需要在云函数中生成自定义登录凭证(Custom Token),返回给客户端后完成登录。以下是具体实现方案:
1. 修改云函数代码(生成自定义Token)
在创建匿名用户后,调用admin.auth().createCustomToken()生成该用户的登录凭证,与用户文档数据一起返回给客户端:
exports.registerUserAnonymously = functions.https.onCall(async (data, context) => { try { const userRecord = await admin.auth().createUser({ anonymous: true }); // 生成当前用户的自定义登录Token const customToken = await admin.auth().createCustomToken(userRecord.uid); // 保留原有的用户文档创建逻辑 const userDoc = await createUserDocument(userRecord, null); // 返回Token和用户数据 return { user: userDoc, customToken: customToken }; } catch (error) { throw new functions.https.HttpsError("unknown", "匿名注册失败", error); } });
2. 修改Unity端代码(使用Token完成登录)
调用云函数获取Token后,通过Firebase Auth的SignInWithCustomTokenAsync方法完成客户端登录,此时CurrentUser会被自动设置:
public async void SignInAnonymous(){ QuickLoadingManager.EnableLoadingPanel(); var function = FirebaseFunctions.DefaultInstance.GetHttpsCallable("registerUserAnonymously"); await function.CallAsync().ContinueWithOnMainThread(async task => { if (task.Exception != null) { Debug.Log(task.Exception.GetBaseException().Message); OnFailedSignUp(task.Exception.GetBaseException().Message); } else if (task.IsCompleted) { // 解析云函数返回的结果 var result = task.Result.Data as Dictionary<string, object>; if (result == null || !result.ContainsKey("customToken")) { Debug.LogError("云函数未返回有效登录Token"); OnFailedSignUp("登录凭证获取失败"); return; } string customToken = result["customToken"] as string; // 使用自定义Token完成客户端登录 var authResult = await FirebaseAuth.DefaultInstance.SignInWithCustomTokenAsync(customToken); if (authResult.User != null) { Debug.Log("匿名登录成功,CurrentUser已初始化"); OnSuccessfulSignIn(); } else { Debug.LogError("自定义Token登录失败"); OnFailedSignUp("登录验证失败"); } } }); }
关键逻辑说明
- 自定义Token由Firebase Admin SDK生成,包含用户唯一标识(UID),仅服务器端有权限生成,确保安全性。
- Unity端调用
SignInWithCustomTokenAsync后,Firebase Auth客户端会验证Token有效性,建立本地会话并自动设置CurrentUser。 - 此方案既保留了云函数创建用户的业务逻辑,又完成了客户端的登录流程,解决
CurrentUser为null的问题。
内容的提问来源于stack exchange,提问作者Daniel Brunner
相关产品推荐
相关产品推荐

