Невозможно получить доступ к таблицам Google с учетными данными учетной записи службы с помощью Golang

Я пишу код AWS Lambda для доступа и обновления электронной таблицы с URL-адресом в качестве входных данных с помощью Golang. Пока я могу получить доступ к электронной таблице локально, используя идентификатор клиента OAuth, следуя руководству Google - https://developers.google.com/sheets/api/quickstart/go

Но поскольку я хочу запустить код из AWS Lambda, я хочу выполнить аутентификацию с помощью учетной записи службы Google. Я создал учетную запись службы и получил учетные данные, которые содержат информацию ниже.

{
"type": "service_account",
"project_id": "quickstart-1XXXXXXX806",
"private_key_id": "a1XXXXXXXXXXXXXXXXXXXXX3c3e5d8e",
"private_key": "-----BEGIN PRIVATE KEY-----\nMZ4C8......\nD\n-----END PRIVATE KEY-----\n",
"client_email": "[email protected]",
"client_id": "1XXXXXXXXXXXXXXXXX2",
"auth_uri": "https://accounts.google.com/o/oauth2/auth",
"token_uri": "https://oauth2.googleapis.com/token",
"auth_provider_x509_cert_url": "https://www.googleapis.com/oauth2/v1/certs",
"client_x509_cert_url": "https://www.googleapis.com/robot/v1/metadata/x509/lambda%40quickstart-1573627656806.iam.gserviceaccount.com"

}

Я прочитал много документации, но я не нашел никаких ссылок для доступа к таблицам Google с использованием учетной записи службы Google с использованием кода Golang. Каждый документ ссылается на следующую ссылку Github - https://github.com/googleapis/google-api-go-client Но поскольку я недавно начал работать в Golang, я действительно не понимаю, как это реализовать. После прочтения руководства Google я понимаю, что для учетной записи службы требуется поток, как показано ниже -  введите описание изображения здесь

Но я все еще не могу написать для этого код Голанга. Буду признателен, если кто-нибудь поделится ссылками :)


person Rahul Satal    schedule 15.11.2019    source источник


Ответы (2)


Ответ @ZektorH помог мне завершить этот код. Ниже приведен полный рабочий пример извлечения данных из таблиц Google с помощью учетной записи службы.

package main

import (
    "fmt"
    "log"

    "golang.org/x/oauth2"
    "golang.org/x/oauth2/jwt"
    "google.golang.org/api/sheets/v4"
)


func main() {

    // Create a JWT configurations object for the Google service account
    conf := &jwt.Config{
        Email:        "[email protected]",
        PrivateKey:   []byte("-----BEGIN PRIVATE KEY-----\nxxxxxx\n-----END PRIVATE KEY-----\n"),
        PrivateKeyID: "a1a6xxxxxxxxxxxxxxxxxxxxxxxe5d8e",
        TokenURL:     "https://oauth2.googleapis.com/token",
        Scopes: []string{
            "https://www.googleapis.com/auth/spreadsheets.readonly",
        },
    }

    client := conf.Client(oauth2.NoContext)

    // Create a service object for Google sheets
    srv, err := sheets.New(client)
    if err != nil {
        log.Fatalf("Unable to retrieve Sheets client: %v", err)
    }

    // Change the Spreadsheet Id with yours    
    spreadsheetId := "1BxiMVs0XRA5nFMdKvBdBZjgmUUqptlbs74OgvE2upms"

    // Define the Sheet Name and fields to select
    readRange := "Sheet1!A2:B"

    // Pull the data from the sheet
    resp, err := srv.Spreadsheets.Values.Get(spreadsheetId, readRange).Do()
    if err != nil {
        log.Fatalf("Unable to retrieve data from sheet: %v", err)
    }

    // Display pulled data
    if len(resp.Values) == 0 {
        fmt.Println("No data found.")
    } else {
        fmt.Println("Name, Major:")
        for _, row := range resp.Values {
            fmt.Printf("%s, %s\n", row[0], row[1])
        }
    }
}

Также обратите внимание, что если вы получите сообщение об ошибке, как показано ниже:

googleapi: ошибка 403: у вызывающего абонента нет разрешения, запрещено

то, вероятно, вы не дали своей учетной записи Google разрешение на доступ к этой таблице. Если так-

  • просто зайдите в браузере на лист Google, с которым хотите взаимодействовать.

  • Перейдите к ПОДЕЛИТЬСЯ в правом верхнем углу экрана.

  • Перейдите в расширенные настройки и поделитесь им с адресом электронной почты вашей учетной записи службы, например. [email protected]
person Rahul Satal    schedule 15.11.2019
comment
Спасибо за подсказку, как решить проблему с разрешением, это меня действительно свело с ума. Кроме того, есть лучший способ инициализировать учетные данные, как указано здесь stackoverflow.com/questions/39691100/ - person Christophe Vidal; 09.03.2020

Покопавшись, я нашел некоторую документацию, в котором объясняется, как использовать учетные записи служб на Golang. Существует пример того, как выполнить аутентификацию. с учетными записями служб в документации:

// Your credentials should be obtained from the Google
// Developer Console (https://console.developers.google.com).
conf := &jwt.Config{
    Email: "[email protected]",
    // The contents of your RSA private key or your PEM file
    // that contains a private key.
    // If you have a p12 file instead, you
    // can use `openssl` to export the private key into a pem file.
    //
    //    $ openssl pkcs12 -in key.p12 -passin pass:notasecret -out key.pem -nodes
    //
    // The field only supports PEM containers with no passphrase.
    // The openssl command will convert p12 keys to passphrase-less PEM containers.
    PrivateKey: []byte("-----BEGIN RSA PRIVATE KEY-----..."),
    Scopes: []string{
        "https://www.googleapis.com/auth/bigquery",
        "https://www.googleapis.com/auth/blogger",
    },
    TokenURL: google.JWTTokenURL,
    // If you would like to impersonate a user, you can
    // create a transport with a subject. The following GET
    // request will be made on the behalf of [email protected].
    // Optional.
    Subject: "[email protected]",
}
// Initiate an http.Client, the following GET request will be
// authorized and authenticated on the behalf of [email protected].
client := conf.Client(oauth2.NoContext)
client.Get("...")
person ZektorH    schedule 15.11.2019
comment
Спасибо @ZektorH за то, что поделились примером и ссылками. После изменения параметра Scopes это сработало для меня. Ты действительно спас мне жизнь. - person Rahul Satal; 15.11.2019