React Native中Facebook登录提示‘invalid scope:mail’问题排查
问题排查与解决方案
嗨,我来帮你梳理下这个问题~
首先,导致「invalid scope:mail」错误的直接原因是你写错了Facebook的权限名称!Facebook官方的邮箱权限是email,而不是你写的mail——这是个很容易犯的拼写小错误。
那为什么把代码移到Root组件里就正常了呢?大概率是你迁移代码的时候下意识修正了这个拼写错误,只是自己没留意到😉 当然也不排除组件生命周期的微小差异,但核心问题肯定是权限名称写错了。
接下来给你具体的修复步骤:
- 修正权限拼写:把
loginWithFacebook里的permissions:["mail", "public_profile"]改成permissions:["email", "public_profile"] - (可选但推荐)给登录逻辑加上完整的错误捕获,方便后续排查问题
- (兜底检查)去你的Facebook开发者后台确认
email权限已经被启用(一般默认是开着的,但保险起见可以看看)
修复后的loginWithFacebook函数示例:
async loginWithFacebook (){ try { const {type, token} = await Expo.Facebook.logInWithReadPermissionsAsync( "2073519281256416", {permissions:["email", "public_profile"]} // 这里修正了权限名称 ); if(type === "success"){ const credentials = fire.auth.FacebookAuthProvider.credential(token); await fire.auth().signInWithCredential(credentials); console.log("登录成功!"); } } catch (error) { console.error("登录过程出错:", error); } }
另外补充个小细节:你在LoginScreen里用onPress={()=> this.loginWithFacebook()}的写法是没问题的,不用额外绑定this,可以继续用。
等你修正完权限拼写,LoginScreen里的登录逻辑应该就能和Root组件里一样正常工作了,Root里的onAuthStateChanged监听也能正常捕获到登录状态的变化~
内容的提问来源于stack exchange,提问作者user10828115




