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
相关产品推荐
相关产品推荐

