Flutter开发中Facebook登录后facebookAuthCredential.idToken为null问题
问题原因
- Firebase封装的
FacebookAuthProvider.credential()方法仅需传入Facebook返回的access token即可生成合法的认证凭证,该凭证的idToken字段默认无值属于官方设计的正常现象,不是代码逻辑错误。 - Facebook移动端登录流程默认不返回OpenID Connect标准的idToken,只有access token作为有效认证凭证,因此生成的
OAuthCredential不会填充idToken字段。
正确使用方式
现有登录逻辑无需修改,直接调用signInWithCredential即可正常完成Firebase认证。如果需要获取Firebase侧的用户idToken,应该在登录成功后从返回的User对象中获取,示例代码如下:
Future<UserCredential> signInWithFacebook() async { // 触发Facebook登录流程 final LoginResult loginResult = await FacebookAuth.instance.login(); // 用access token生成认证凭证 final OAuthCredential facebookAuthCredential = FacebookAuthProvider.credential(loginResult.accessToken!.token); // 此处idToken为null属于正常情况,不影响后续登录流程 // print(facebookAuthCredential.idToken); // 完成Firebase登录 final userCredential = await FirebaseAuth.instance.signInWithCredential(facebookAuthCredential); // 如需获取idToken,从登录成功的User对象中获取 final idToken = await userCredential.user?.getIdToken(); print(idToken); // 此处可拿到有效的Firebase idToken return userCredential; }
补充说明
- 若调用
signInWithCredential时出现报错,优先检查Firebase控制台中Facebook登录开关已开启,且Facebook开发者后台的OAuth重定向URI已正确配置为Firebase指定的地址,该类报错和本次idToken为null的问题无关。 - 如果你是需要Facebook侧返回的idToken而非Firebase的idToken,需要在发起Facebook登录时明确申请openid权限,同时调用Facebook的接口单独获取,常规Firebase登录场景不需要该操作。
内容的提问来源于stack exchange,提问作者Mohammed Nabil
相关产品推荐
相关产品推荐

