使用Facebook登录iOS应用时出现Bad access token错误求助
iOS Facebook登录对接Firebase报"Bad access token"问题排查方案
问题定位
核心矛盾是Facebook登录返回的AccessToken无法被Firebase Auth验证,同时跳转Facebook时出现Limited Login提示——这是因为当前AccessToken模式与Firebase不兼容,再加上部分配置缺失导致的。
具体解决步骤
1. 关闭Facebook Limited Login模式
跳转时的提示说明你启用了Limited Login,但Firebase Auth暂不支持该模式的AccessToken,需立即关闭:
- 进入Facebook开发者后台,找到你的应用→【Login with Facebook】→【Settings】
- 将【Limited Login】选项设置为Disabled
2. 确保请求正确的权限
初始化FBLoginButton时,指定Firebase所需的基础权限:
let loginButton = FBLoginButton() // 必须包含public_profile,email为可选权限 loginButton.permissions = ["public_profile", "email"]
3. 核对Firebase与Facebook的配置一致性
- 确认Firebase控制台【Authentication】→【Sign-in method】→【Facebook】中的App ID和App Secret,与Facebook开发者后台【Settings】→【Basic】中的信息完全一致(注意不要有空格、大小写错误)
- 在Facebook后台【Login with Facebook】→【Settings】的Valid OAuth Redirect URIs中,添加Firebase提供的回调地址(可在Firebase Facebook配置页查看)
4. 补充Info.plist必要配置
当前配置缺少关键项,需添加以下内容:
<!-- 允许应用调用Facebook相关Scheme --> <key>LSApplicationQueriesSchemes</key> <array> <string>fbapi</string> <string>fbauth2</string> </array> <!-- 解决iOS 9+网络请求限制 --> <key>NSAppTransportSecurity</key> <dict> <key>NSAllowsArbitraryLoads</key> <true/> </dict>
5. 代码优化:先验证AccessToken再传给Firebase
在将token传给Firebase前,先通过Facebook Graph API验证token有效性,排除无效token的问题:
func loginButton(_ loginButton: FBSDKLoginKit.FBLoginButton, didCompleteWith result: FBSDKLoginKit.LoginManagerLoginResult?, error: (any Error)?) { if let error = error { print("Facebook登录错误:\(error.localizedDescription)") return } guard let token = result?.token else { print("未获取到有效Facebook Token") return } // 先验证Token有效性 let graphRequest = FBSDKLoginKit.GraphRequest(graphPath: "/me", parameters: ["fields": "id,name"], tokenString: token.tokenString, version: nil, httpMethod: .get) graphRequest.start { _, graphResult, graphError in if let graphError = graphError { print("Token验证失败:\(graphError.localizedDescription)") return } // 验证通过后再请求Firebase登录 let credential = FacebookAuthProvider.credential(withAccessToken: token.tokenString) FirebaseAuth.Auth.auth().signIn(with: credential) { authResult, authError in guard authResult != nil, authError == nil else { print("Firebase登录失败:\(authError?.localizedDescription ?? "未知错误")") return } print("登录成功") self.navigationController?.dismiss(animated: true) } } }
内容的提问来源于stack exchange,提问作者Xin Lok
相关产品推荐
相关产品推荐

