Межсерверная аутентификация для чтения и записи Google Sheets - PullRequest
0 голосов
/ 27 января 2019

Я пытаюсь читать и писать в ячейку в Google Sheet.Использование GoogleSignIn у меня работает, но только с использованием аутентификации пользователя (для моего собственного тестирования и обучения).Однако в моем приложении я не хочу, чтобы пользователи входили в систему. Лист предназначен исключительно для чтения и записи самого приложения.

Я нашел этот ресурс Google Cloud иЯ пытаюсь использовать это, но это не написано в Swift.Я также упомянул это (и часами искал и пытался следовать фрагментам в SO и других местах).

У меня есть служебная учетная запись и файл credentials.json, загруженный из Google.Я установил GOOGLE_APPLICATION_CREDENTIALS в AppDelegate.swift следующим образом:

setenv("GOOGLE_APPLICATION_CREDENTIALS","/home/user/Downloads/credentials.json", 1)

В ViewController.swift я импортирую следующим образом:

import GTMSessionFetcher
import GoogleAPIClientForREST
import GoogleSignIn

В viewDidLoad () Iиметь следующий код:

let credentials = ProcessInfo.processInfo.environment["GOOGLE_APPLICATION_CREDENTIALS"]
    print("CREDENTIALS: \(credentials ?? noToken)")  // prints "/home/user/Downloads/credentials.json"

    GIDSignIn.sharedInstance().clientID = "{Google-generated-client-ID_}"
    GIDSignIn.sharedInstance()?.serverClientID = "_{Google-generated-serverClientID}_"
    GIDSignIn.sharedInstance().delegate = self
    GIDSignIn.sharedInstance().uiDelegate = self
    GIDSignIn.sharedInstance().scopes = scopes
    GIDSignIn.sharedInstance().signInSilently()

Вот код входа для аутентификации пользователя.Я пытаюсь преобразовать это в идентификацию приложения, используя данные credentials.json.Как и выше, у меня теперь есть путь к файлу credentials.json в моей переменной credentials .

func sign(_ signIn: GIDSignIn!, didSignInFor user: GIDGoogleUser!,
          withError error: Error!) {
    if let error = error {
        print("\(error.localizedDescription)")
        self.service.authorizer = nil
    } else {
        // Perform any operations on signed in user here.
        let userId = user.userID                  // For client-side use only!
        token = user.authentication.idToken // Safe to send to the server
        let fullName = user.profile.name
        let givenName = user.profile.givenName
        let familyName = user.profile.familyName
        let email = user.profile.email
        // ...
        self.service.authorizer = user.authentication.fetcherAuthorizer()
        print("SIGN IN SUCCESSFUL: \(userId), \(token), \(fullName), \(givenName), \(familyName), \(email)")
    }
}

В другой функции мой фактический код для вызова API Google Sheets выглядит следующим образом:

let spreadsheetId = "_{spreadsheetID}_"
    let range = "Sheet1!A1:F3"
    let query = GTLRSheetsQuery_SpreadsheetsValuesGet.query(withSpreadsheetId: spreadsheetId, range:range)
    service.executeQuery(query,
                         delegate: self,
                         didFinish: #selector(ViewController.displayResultWithTicket(ticket:finishedWithObject:error:))
                        )

Я понимаю, что приведенный выше код предназначен почти для идентификации пользователя.Итог: в Swift, для приложения для iOS, я бы хотел, чтобы мое приложение считывало и записывало в единый Google Sheet под моим контролем без необходимости входа пользователя.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...