Heim > Backend-Entwicklung > Golang > 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

王林
Freigeben: 2024-02-14 12:33:09
nach vorne
624 Leute haben es durchsucht

如何使用服务帐户为 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()
}
Nach dem Login kopieren

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"
}
Nach dem Login kopieren

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)))
}
Nach dem Login kopieren

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()
Nach dem Login kopieren

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!

Quelle:stackoverflow.com
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage