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

Unity(C#)中Firebase跨设备登录验证并登出旧设备的实现问询

解决方案与可行性分析

需求可行性

这个需求完全可行,Firebase Auth提供了核心机制,结合自定义逻辑就能实现你的目标。

核心实现思路

1. 异地登录触发邮件验证

Firebase没有内置的"异地登录自动发验证邮件"开关,但可以通过以下逻辑实现:

  • 监听用户登录事件,登录成功后,从Firestore/Realtime Database读取用户存储的历史设备标识(可用Unity的SystemInfo.deviceUniqueIdentifier生成,注意平台权限配置)。
  • 对比本次登录的设备标识与历史记录,若不一致,调用Firebase Auth的SendEmailVerificationAsync()发送验证邮件,同时在数据库中标记该会话为"未验证"状态,限制用户操作直到验证完成。
  • 可以结合Firebase Auth的用户元数据UserMetadata.LastSignInTimestamp辅助判断登录场景,但设备标识的对比更直接。

2. 强制旧设备登出

实现旧设备登出的关键是管理用户会话令牌:

  • 调用FirebaseAuth.DefaultInstance.CurrentUser.RevokeRefreshTokensAsync(),撤销用户所有旧的刷新令牌,旧设备的会话会在令牌过期或下次刷新时自动失效。
  • 客户端监听FirebaseAuth.DefaultInstance.StateChanged事件,当检测到用户会话失效时,主动执行SignOut()完成登出。
  • 可选:在Realtime Database/Firestore中给用户节点加forceSignOut标记,旧设备监听该字段变化,一旦触发就立即登出并重置标记。

C# 关键代码片段

登录后设备校验与验证触发

using Firebase.Auth;
using UnityEngine;

public async void HandleLogin(string email, string password)
{
    try
    {
        var authResult = await FirebaseAuth.DefaultInstance.SignInWithEmailAndPasswordAsync(email, password);
        var currentUser = authResult.User;
        
        // 从数据库获取用户上次登录的设备ID
        string lastDeviceId = await FetchUserLastDeviceId(currentUser.UserId);
        string currentDeviceId = SystemInfo.deviceUniqueIdentifier;

        if (!string.IsNullOrEmpty(lastDeviceId) && lastDeviceId != currentDeviceId)
        {
            // 发送验证邮件
            await currentUser.SendEmailVerificationAsync();
            // 标记会话未验证
            await MarkSessionUnverified(currentUser.UserId);
            Debug.Log("异地登录,请检查邮箱完成验证");
        }
        else
        {
            // 更新数据库中的设备ID记录
            await UpdateUserLastDeviceId(currentUser.UserId, currentDeviceId);
            Debug.Log("登录成功");
        }
    }
    catch (FirebaseException ex)
    {
        Debug.LogError($"登录失败: {ex.Message}");
    }
}

强制旧设备登出逻辑

// 新设备验证通过后调用,撤销旧令牌
public async void RevokeOldUserSessions(string userId)
{
    var targetUser = await FirebaseAuth.DefaultInstance.GetUserAsync(userId);
    await targetUser.RevokeRefreshTokensAsync();
    
    // 可选:设置强制登出标记
    await SetForceSignOutFlag(userId, true);
}

// 旧设备监听Auth状态变化
private void OnAuthStateChanged(object sender, System.EventArgs args)
{
    var user = FirebaseAuth.DefaultInstance.CurrentUser;
    if (user == null)
    {
        Debug.Log("账号已在其他设备登录,已自动登出");
        // 此处处理登出后的UI逻辑
    }
}

// 初始化时注册监听
private void Start()
{
    FirebaseAuth.DefaultInstance.StateChanged += OnAuthStateChanged;
}

搜索关键词

  • Firebase Auth revoke refresh tokens Unity C#
  • Firebase send email verification on new device login
  • Firebase Realtime Database force sign out Unity
  • Firebase Auth user device tracking Unity

注意事项

  • SystemInfo.deviceUniqueIdentifier在iOS等平台需要配置隐私权限,需在Unity项目中提前设置。
  • 存储设备信息和会话状态时,要配置Firebase安全规则,确保只有用户本人能访问自己的数据节点。
  • 可在Firebase控制台自定义邮件验证链接的跳转页面,在验证完成后触发旧设备登出的逻辑。

内容的提问来源于stack exchange,提问作者Pedro Benetti

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 23:20:27