使用signInWithCustomToken登录后无法获取用户详情求助
解决signInWithCustomToken登录后用户对象缺少详情的问题
问题根源
登录后返回的User对象大概率是本地缓存的基础身份数据,未实时同步最新的用户详情;也可能是服务器端生成令牌时,目标用户本身就未设置displayName、email这类属性。
具体解决方案
1. 主动刷新用户信息
登录成功后调用user.reload()方法拉取最新的用户数据,之后再提取所需字段:
async function signinWithToken(data, sendResponse) { const { token } = data; try { const user = await signInWithCustomToken(auth, token); // 刷新用户信息,同步服务器端最新数据 await user.reload(); // 刷新后直接从当前用户实例提取详情 const refreshedUser = auth.currentUser; sendResponse({ success: true, user: { uid: refreshedUser.uid, displayName: refreshedUser.displayName, email: refreshedUser.email, photoURL: refreshedUser.photoURL // 按需添加其他字段 } }); } catch (err) { sendResponse({ success: false, message: err.message }); } }
2. 确保服务器端用户数据完整
在生成自定义令牌前,确认服务器端的Firebase用户已配置好所需属性:
- 创建新用户时直接设置:
// 服务器端代码示例 admin.auth().createUser({ uid: "custom-user-id", email: "user@example.com", displayName: "张三", photoURL: "https://example.com/avatar.jpg" }) .then((userRecord) => { return admin.auth().createCustomToken(userRecord.uid); }) .then((customToken) => { // 将令牌返回给客户端 });
- 针对已有用户,先更新信息再生成令牌:
admin.auth().updateUser("existing-user-id", { displayName: "更新后的用户名", email: "new-email@example.com" }) .then((userRecord) => { return admin.auth().createCustomToken(userRecord.uid); });
3. 可选:从ID Token提取声明
如果生成自定义令牌时添加了自定义声明,可通过getIdTokenResult()获取额外信息:
async function signinWithToken(data, sendResponse) { const { token } = data; try { const user = await signInWithCustomToken(auth, token); const idTokenResult = await user.getIdTokenResult(); const userDetails = { uid: user.uid, displayName: user.displayName, email: user.email, // 提取自定义声明 role: idTokenResult.claims.role }; sendResponse({ success: true, user: userDetails }); } catch (err) { sendResponse({ success: false, message: err.message }); } }
内容的提问来源于stack exchange,提问作者AhmedSalem016
相关产品推荐
相关产品推荐

