繁体   English   中英

iOS“请求缺少必需的身份验证凭据。需要 OAuth 2 访问令牌、登录 cookie 或其他有效的身份验证凭据

[英]iOS "Request is missing required authentication credential. Expected OAuth 2 access token, login cookie or other valid authentication credential

我已经在我的 iOS 应用程序中使用 firebase 登录,并且在 podfile 中初始化了 Google Sheets API pod,但是当我尝试将数据附加到我的电子表格时出现此错误:

Request is missing required authentication credential. Expected OAuth 2 access token, login cookie or other valid authentication credential.

这是我的电子表格代码:

//
//  SpredsheetsController.swift
//  frcscout
//
//  Created by Elliot Scher on 12/21/22
//

import UIKit
import GoogleAPIClientForREST
import GoogleSignIn

class SpreadsheetsController: UIViewController {
    
    let utils = Utils()
    let sheetService = GTLRSheetsService()
        
    override func viewDidLoad() {
        super.viewDidLoad()
        sheetService.authorizer = GIDSignIn.sharedInstance.currentUser?.authentication.fetcherAuthorizer()
    }

    @IBAction func appendDataPressed(_ sender: UIButton) {
        appendData()
    }
    
    @IBAction func specificCellPressed(_ sender: UIButton) {
        sendDataToCell()
    }
    
    @IBAction func readDataPressed(_ sender: UIButton) {
        readData()
    }
    
    @IBAction func readSheetsPressed(_ sender: UIButton) {
        readSheets()
    }
}

extension SpreadsheetsController {
    func appendData() {

        let spreadsheetId = K.sheetID
        let range = "A1:Q"
        let rangeToAppend = GTLRSheets_ValueRange.init();
        let data = ["this", "is", "a", "test"]
        
        rangeToAppend.values = [data]
        
        let query = GTLRSheetsQuery_SpreadsheetsValuesAppend.query(withObject: rangeToAppend, spreadsheetId: spreadsheetId, range: range)
            query.valueInputOption = "USER_ENTERED"
        
            sheetService.executeQuery(query) { (ticket, result, error) in
                if let error = error {
                    print("Error in appending data: \(error)")
                } else {
                    print("Data sent: \(data)")
                }
            }
        }
    
    func sendDataToCell() {
            
            let spreadsheetId = K.sheetID
            let currentRange = "A5:B5" //Any range on the sheet, for instance: A5:B6
            let results = ["this is a test"]
            let rangeToAppend = GTLRSheets_ValueRange.init();
                rangeToAppend.values = [results]
        
            let query = GTLRSheetsQuery_SpreadsheetsValuesUpdate.query(withObject: rangeToAppend, spreadsheetId: spreadsheetId, range: currentRange)
                query.valueInputOption = "USER_ENTERED"
        
                sheetService.executeQuery(query) { (ticket, result, error) in
                    if let error = error {
                        print(error)
                    } else {
                        print("Sending: \(results)")
                    }
                }
    }
    func readData() {
        print("Getting sheet data...")
        
        let spreadsheetId = K.sheetID
        let range = "A1:Q"
        let query = GTLRSheetsQuery_SpreadsheetsValuesGet
            .query(withSpreadsheetId: spreadsheetId, range:range)
        
        sheetService.executeQuery(query) { (ticket, result, error) in
            if let error = error {
                print(error)
                return
            }
            guard let result = result as? GTLRSheets_ValueRange else {
                return
            }
            
            let rows = result.values!
            var stringRows = rows as! [[String]]
            
            for row in stringRows {
                stringRows.append(row)
                print(row)
                }
            if rows.isEmpty {
                print("No data found.")
                return
            }
            print("Number of rows in sheet: \(rows.count)")
        }
    }
    
    func readSheets() {
        print("func findSpreadNameAndSheets executing...")
        
        let spreadsheetId = K.sheetID
        let query = GTLRSheetsQuery_SpreadsheetsGet.query(withSpreadsheetId: spreadsheetId)
        
        sheetService.executeQuery(query) { (ticket, result, error) in
            if let error = error {
                print(error)
            } else {
                let result = result as? GTLRSheets_Spreadsheet
                let sheets = result?.sheets
                if let sheetInfo = sheets {
                    for info in sheetInfo {
                            print("New sheet found: \(String(describing: info.properties?.title))")
                        }
                    }
            }
        }
    }
}

这是我的验证码:

//
//  AuthenticationViewModel.swift
//  frcscout
//
//  Created by Elliot Scher on 12/15/22.
//

import Foundation
import Firebase
import GoogleSignIn

class AuthenticationViewModel: ObservableObject {

    var credential:AuthCredential? = nil
    
    enum SignInState {
        case signedIn
        case signedOut
    }

    @Published var state: SignInState = .signedOut

    func signIn() {
      // 1
        if GIDSignIn.sharedInstance.hasPreviousSignIn() {
            GIDSignIn.sharedInstance.restorePreviousSignIn { [unowned self] user, error in
                authenticateUser(for: user, with: error)
            }
        } else {
            guard let clientID = FirebaseApp.app()?.options.clientID else { return }
            
            let configuration = GIDConfiguration(clientID: clientID)
            
            guard let windowScene = UIApplication.shared.connectedScenes.first as? UIWindowScene else { return }
            guard let rootViewController = windowScene.windows.first?.rootViewController else { return }
            
            GIDSignIn.sharedInstance.signIn(with: configuration, presenting: rootViewController) { [unowned self] user, error in
                authenticateUser(for: user, with: error)
            }
        }
    }
    
    private func authenticateUser(for user: GIDGoogleUser?, with error: Error?) {
        if let error = error {
            print(error.localizedDescription)
            return
        }
      
        guard let authentication = user?.authentication, let idToken = authentication.idToken else { return }
      
        credential = GoogleAuthProvider.credential(withIDToken: idToken, accessToken: authentication.accessToken)
      
        Auth.auth().signIn(with: credential!) { [unowned self] (_, error) in
            if let error = error {
                print(error.localizedDescription)
            } else {
                self.state = .signedIn
            }
        }
    }
    
    func signOut() {
        GIDSignIn.sharedInstance.signOut()
      
        do {
            try Auth.auth().signOut()
        
            state = .signedOut
        } catch {
            print(error.localizedDescription)
        }
    }
    
    func getCredential() -> AuthCredential {
        return credential!
    }
}

我想我需要一个 oauth2 令牌,但我不确定如何从 firebase 获取它。 有人可以帮我解决这个问题吗? 谢谢!!

已解决:

我不得不把这一行:

sheetService.authorizer = GIDSignIn.sharedInstance.currentUser?.authentication.fetcherAuthorizer()

在每个方法的开头。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM