Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Bagaimana untuk menyediakan klien golang untuk API Kalendar Google menggunakan akaun perkhidmatan

Bagaimana untuk menyediakan klien golang untuk API Kalendar Google menggunakan akaun perkhidmatan

王林
王林ke hadapan
2024-02-14 12:33:09538semak imbas

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

Bagaimana untuk menyediakan klien golang untuk API Kalendar Google menggunakan akaun perkhidmatan? Ini adalah masalah biasa yang dihadapi oleh ramai pembangun apabila menggunakan API Kalendar Google. Dalam artikel ini, editor PHP Banana akan memperkenalkan anda secara terperinci cara menggunakan akaun perkhidmatan untuk mengkonfigurasi klien golang supaya anda boleh berinteraksi dengan API Kalendar Google dengan lancar. Sama ada anda seorang pemula atau pembangun yang berpengalaman, artikel ini akan memberikan anda panduan yang jelas untuk membantu anda memulakan proses dengan cepat. Mari kita meneroka bersama-sama!

Kandungan soalan

Saya telah melihat banyak dokumentasi tentang klien google api untuk pengguna, tetapi sangat sedikit tentang menggunakan akaun perkhidmatan. Ini tidak mewakili pengguna, saya hanya mahu klien menggunakan api kalendar dengan id klien dan rahsia klien, yang akan diberikan kepada saya melalui pembolehubah persekitaran (saya tidak mahu bermula dari fail).

Ini yang saya ada setakat ini:

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

Tetapi saya mendapat ralat berikut:

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

Sebarang bantuan di sini amat dihargai! Saya baru mengenali golang, oauth2 dan google api :)

Penyelesaian

Jawapan @tanaike membawa saya ke landasan yang betul. Inilah yang akhirnya saya gunakan:

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

Perhatikan bahawa saya tidak perlu mengkonfigurasi perwakilan seluruh domain atau menyamar sebagai pengguna selepas menambahkan akaun perkhidmatan pada kalendar, ia berfungsi dengan baik.

Selepas menambah e-mel akaun pada kalendar, akaun perkhidmatan masih perlu menerima jemputan kalendar. Ini boleh dilakukan dengan:

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

Atas ialah kandungan terperinci Bagaimana untuk menyediakan klien golang untuk API Kalendar Google menggunakan akaun perkhidmatan. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Artikel ini dikembalikan pada:stackoverflow.com. Jika ada pelanggaran, sila hubungi admin@php.cn Padam