Maison  >  Article  >  développement back-end  >  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

王林
王林avant
2024-02-14 12:33:09582parcourir

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

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"
}

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)))
}

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()

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:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer