iOS应用Firebase登录后调用Google Sheets API认证失败求助
解决Firebase登录后调用Google Sheets API的认证错误
核心问题
Firebase Auth的登录凭据无法直接用于Google Sheets API,你需要从Firebase关联的Google登录账号中获取专属的OAuth2访问令牌,才能完成Sheets API的身份验证。
解决步骤
1. 登录时添加Sheets API权限范围
在Google登录流程中,必须明确请求Sheets API的操作权限(根据需求选择读写或只读)。修改你的AuthenticationViewModel.swift登录逻辑:
let googleProvider = GoogleAuthProvider() // 按需选择权限,读写用spreadsheets,只读用spreadsheets.readonly googleProvider.addScope("https://www.googleapis.com/auth/spreadsheets") Auth.auth().signIn(with: googleProvider) { result, error in // 处理登录结果 }
2. 从Firebase用户提取OAuth2访问令牌
登录成功后,通过Firebase用户的providerData获取Google登录凭据,从中提取访问令牌。在AuthenticationViewModel.swift中添加方法:
func getGoogleOAuthAccessToken() -> String? { guard let currentUser = Auth.auth().currentUser else { return nil } for provider in currentUser.providerData { if provider.providerID == "google.com" { return provider.accessToken } } return nil }
3. 在Sheets API请求中携带令牌
修改SpreadsheetsController.swift的请求逻辑,在请求头中加入认证令牌:
// 先获取令牌 guard let accessToken = AuthenticationViewModel().getGoogleOAuthAccessToken() else { print("无法获取OAuth访问令牌") return } // 构造Sheets API追加请求 let sheetUrl = URL(string: "https://sheets.googleapis.com/v4/spreadsheets/{你的表格ID}/values/{目标范围}:append?valueInputOption=USER_ENTERED")! var request = URLRequest(url: sheetUrl) request.httpMethod = "POST" // 添加认证头 request.setValue("Bearer \(accessToken)", forHTTPHeaderField: "Authorization") request.setValue("application/json", forHTTPHeaderField: "Content-Type") // 构造要追加的数据 let payload = ["values": [["测试内容1", "测试内容2"]]] do { request.httpBody = try JSONSerialization.data(withJSONObject: payload) } catch { print("序列化数据失败: \(error)") return } // 发送请求 URLSession.shared.dataTask(with: request) { data, response, error in // 处理响应逻辑 }.resume()
4. 检查Google Cloud配置
- 确保Firebase对应的Google Cloud项目中,已启用Google Sheets API
- 在OAuth同意屏幕中,已添加你请求的Sheets权限范围;如果是正式环境,需发布同意屏幕并添加验证用户
额外注意
访问令牌存在过期时间,过期后可通过providerData.refreshToken调用Google令牌刷新接口获取新令牌。如果你的Firebase登录使用的是非Google Provider(如邮箱密码),则无法用此方法,需改用服务账号认证(仅推荐后端使用,iOS端不建议直接集成)。
内容的提问来源于stack exchange,提问作者user17792511
相关产品推荐
相关产品推荐

