Heim  >  Artikel  >  Backend-Entwicklung  >  So richten Sie den Golang-Client für die Google Kalender-API mithilfe eines Dienstkontos ein

So richten Sie den Golang-Client für die Google Kalender-API mithilfe eines Dienstkontos ein

王林
王林nach vorne
2024-02-14 12:33:09540Durchsuche

如何使用服务帐户为 Google Calendar API 设置 golang 客户端

Wie richte ich den Golang-Client für die Google Kalender-API mithilfe eines Dienstkontos ein? Dies ist ein häufiges Problem, auf das viele Entwickler bei der Verwendung der Google Kalender-API stoßen. In diesem Artikel stellt Ihnen der PHP-Editor Banana ausführlich vor, wie Sie mithilfe eines Dienstkontos den Golang-Client konfigurieren, damit Sie reibungslos mit der Google Calendar API interagieren können. Unabhängig davon, ob Sie Anfänger oder erfahrener Entwickler sind, bietet Ihnen dieser Artikel eine klare Anleitung, die Ihnen den schnellen Einstieg in den Prozess erleichtert. Lasst uns gemeinsam erkunden!

Frageninhalt

Ich habe viel Dokumentation zum Google API-Client für Benutzer gesehen, aber nur sehr wenig über die Verwendung von Dienstkonten. Dies stellt nicht den Benutzer dar, ich möchte lediglich, dass der Client die Kalender-API mit einer Client-ID und einem Client-Geheimnis verwendet, die mir über Umgebungsvariablen bereitgestellt werden (ich möchte nicht mit einer Datei beginnen).

Das habe ich bisher:

package main

import (
  "context"

  clientcredentials "golang.org/x/oauth2/clientcredentials"
  google "golang.org/x/oauth2/google"
  calendar "google.golang.org/api/calendar/v3"
  apioption "google.golang.org/api/option"
)

func main() {
  config := &clientcredentials.config{
    clientid:     "<my_id>",
    clientsecret: "-----begin private key-----\n...",
    tokenurl:     google.endpoint.tokenurl,
  }
  ctx := context.background()
  client := config.client(ctx)
  service, _ := calendar.newservice(ctx, apioption.withhttpclient(client))
  
  calendarlist, err := service.calendarlist.list().do()
}

Aber ich erhalte die folgende Fehlermeldung:

Get "https://www.googleapis.com/calendar/v3/users/me/calendarList?alt=json&prettyPrint=false": oauth2: cannot fetch token: 400 Bad Request
Response: {
  "error": "unsupported_grant_type",
  "error_description": "Invalid grant_type: client_credentials"
}

Jede Hilfe hier ist sehr willkommen! Ich bin neu bei Golang, Oauth2 und Google API :)

Workaround

@tanaikes Antwort hat mich auf den richtigen Weg gebracht. Dies ist, was ich letztendlich verwendet habe:

package main

import (
    "context"
    "encoding/json"
    "fmt"

    googleoauth "golang.org/x/oauth2/google"
    calendar "google.golang.org/api/calendar/v3"
    apioption "google.golang.org/api/option"
)

var service *calendar.service

// note that some of the fields are optional:
type googleauthconfig struct {
    type                string `json:"type"`
    projectid           string `json:"project_id,omitempty"`
    clientemail         string `json:"client_email"`
    clientid            string `json:"client_id,omitempty"`
    clientsecret        string `json:"private_key"`
    clientsecretid      string `json:"private_key_id,omitempty"`
    authurl             string `json:"auth_uri,omitempty"`
    tokenurl            string `json:"token_uri,omitempty"`
    authprovidercerturl string `json:"auth_provider_x509_cert_url,omitempty"`
    clientcerturl       string `json:"client_x509_cert_url,omitempty"`
}

func main() {
    authconfig := googleauthconfig{
        type:         "service_account",
        clientemail:  "<a href="https://www.php.cn/link/89fee0513b6668e555959f5dc23238e9" class="__cf_email__" data-cfemail="82e3e1e1edf7ecf6b3b0b1c2f2f0ede8e7e1f6afb6b7b4acebe3eface5f1e7f0f4ebe1e7e3e1e1edf7ecf6ace1edef">[email&#160;protected]</a>",
        clientid:     "1234",
        clientsecret: "-----begin private key-----\n...\n-----end private key-----\n",
        authurl:      googleoauth.endpoint.authurl,
        tokenurl:     googleoauth.endpoint.tokenurl,
    }
    authconfigjson, err := json.marshal(authconfig)

    ctx := context.background()
    service, err = calendar.newservice(ctx, apioption.withcredentialsjson([]byte(authconfigjson)))
}

Beachten Sie, dass ich nach dem Hinzufügen des Dienstkontos zum Kalender keine domänenweite Delegation konfigurieren oder mich als Benutzer ausgeben musste; es hat einwandfrei funktioniert.

Nachdem die E-Mail-Adresse des Kontos zum Kalender hinzugefügt wurde, muss das Dienstkonto die Kalendereinladung noch annehmen. Dies kann erfolgen durch:

entry := calendar.CalendarListEntry{Id: calendarID}
service.CalendarList.Insert(&entry).Do()

Das obige ist der detaillierte Inhalt vonSo richten Sie den Golang-Client für die Google Kalender-API mithilfe eines Dienstkontos ein. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:stackoverflow.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen