使用Firebase SDK实现Google登录时,强制获取生日权限的方案咨询
问题:Firebase Google登录强制获取生日授权或检测授权状态
我正在使用Firebase SDK在React前端实现Google登录功能。当用户首次登录时,需调用后端接口将其注册到数据库,而注册要求用户年龄满14周岁,因此必须获取用户生日信息。我的认证代码如下:
const provider = new GoogleAuthProvider(); provider.addScope('https://www.googleapis.com/auth/user.birthday.read'); provider.addScope('https://www.googleapis.com/auth/userinfo.profile'); const googleRes = await signInWithPopup(auth, provider); const credential = GoogleAuthProvider.credentialFromResult(googleRes);
若用户同意授权生日信息即可完成注册,但当前弹窗允许用户拒绝共享生日信息。由于生日信息是必填项,我需实现以下方案之一:
- 强制用户授权生日信息,否则无法完成登录;
- 在代码中检测用户是否授权该权限,以便告知用户问题或提供解决方案。
请问是否有可行的实现方式?
注:若用户首次拒绝授权,第二次登录时Google不再显示勾选框,直接提示将共享生日信息,这正是我期望首次登录的表现。我已尝试添加额外权限并检查SDK返回对象,但未找到判断授权状态的相关信息。
解决方案
一、检测用户是否授权生日权限
Firebase登录返回的结果里不会直接包含权限状态,你可以通过调用Google People API来验证用户是否授予了生日读取权限:
- 从登录结果中获取用户的ID Token:
const idToken = await googleRes.user.getIdToken();
- 编写函数调用People API检查权限及生日信息:
async function checkBirthdayPermission(idToken) { try { const response = await fetch('https://people.googleapis.com/v1/people/me?personFields=birthdays', { headers: { 'Authorization': `Bearer ${idToken}` } }); const data = await response.json(); // 若请求失败或未返回生日数据,说明未授权 if (!response.ok || !data.birthdays || data.birthdays.length === 0) { return false; } return true; } catch (error) { console.error('权限检查失败:', error); return false; } }
- 登录后验证权限,未授权则提示并重新触发登录:
const hasBirthdayAccess = await checkBirthdayPermission(idToken); if (!hasBirthdayAccess) { alert('请授权生日信息以完成注册'); // 重新登录时Google会强制要求授权,符合你期望的表现 await signInWithPopup(auth, provider); }
二、强制首次登录即要求授权生日信息
通过配置Google Cloud Console的OAuth同意屏幕,可将生日权限设为必填,让用户无法拒绝:
- 进入Google Cloud Console,找到你的项目,进入「API和服务」→「OAuth同意屏幕」
- 在「Scopes for Google APIs」中,将
https://www.googleapis.com/auth/user.birthday.read标记为必填(该权限属于敏感范围,支持设为必填) - 保存配置后,首次登录弹窗会强制用户授权该权限,否则无法完成登录流程
补充注意事项
- 使用People API前,需确保你的Google Cloud项目已启用People API(在API库中搜索并启用)
- 两种方案都能满足你的需求,若需更灵活的提示逻辑,选API检测方案;若要直接强制授权,选控制台配置方案
内容的提问来源于stack exchange,提问作者Diplodoco
相关产品推荐
相关产品推荐

