Maison > développement back-end > Golang > Comment configurer le client Golang pour l'API Google Calendar à l'aide d'un compte de service

Comment configurer le client Golang pour l'API Google Calendar à l'aide d'un compte de service

王林
Libérer: 2024-02-14 12:33:09
avant
729 Les gens l'ont consulté

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

Comment configurer le client Golang pour l'API Google Calendar à l'aide d'un compte de service ? Il s'agit d'un problème courant que de nombreux développeurs rencontrent lors de l'utilisation de l'API Google Calendar. Dans cet article, l'éditeur PHP Banana vous présentera en détail comment utiliser un compte de service pour configurer le client Golang afin que vous puissiez interagir en douceur avec l'API Google Calendar. Que vous soyez débutant ou développeur expérimenté, cet article vous fournira des conseils clairs pour vous aider à démarrer rapidement le processus. Explorons ensemble !

Contenu de la question

J'ai vu beaucoup de documentation sur le client Google API pour les utilisateurs, mais très peu sur l'utilisation des comptes de service. Cela ne représente pas l'utilisateur, je veux juste que le client utilise l'API du calendrier avec un identifiant client et un secret client, qui me seront fournis via des variables d'environnement (je ne veux pas démarrer à partir d'un fichier).

Voici ce que j'ai jusqu'à présent :

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()
}
Copier après la connexion

Mais j'obtiens l'erreur suivante :

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"
}
Copier après la connexion

Toute aide ici est grandement appréciée ! Je suis nouveau sur Golang, oauth2 et google api :)

Workaround

La réponse de @tanaike m'a mis sur la bonne voie. Voici ce que j'ai fini par utiliser :

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)))
}
Copier après la connexion

Notez que je n'ai pas eu à configurer la délégation à l'échelle du domaine ni à usurper l'identité des utilisateurs ; après avoir ajouté le compte de service au calendrier, cela a très bien fonctionné.

Après avoir ajouté l'adresse e-mail du compte au calendrier, le compte de service doit encore accepter l'invitation du calendrier. Cela peut être fait par :

entry := calendar.CalendarListEntry{Id: calendarID}
service.CalendarList.Insert(&entry).Do()
Copier après la connexion

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal