You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

通过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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.31 12:01:01