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

王林
Lepaskan: 2024-02-14 12:33:09
ke hadapan
583 orang telah melayarinya

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

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"
}
Salin selepas log masuk

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)))
}
Salin selepas log masuk

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()
Salin selepas log masuk

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!

sumber:stackoverflow.com
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan