Google App Engine Go 1.11应用程序无法访问Google Spreadsheets [英] Google App Engine Go 1.11 application can not access Google Spreadsheets

查看:98
本文介绍了Google App Engine Go 1.11应用程序无法访问Google Spreadsheets的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正尝试通过 Google上运行的应用程序通过API访问Google电子表格App Engine Go 1.11标准环境. 不幸的是,该应用程序无法读取此电子表格.

I'm trying to access google spreadsheet via API from the application running on Google App Engine Go 1.11 Standard Environment. Unfortunately, the application cannot read this spreadsheet.

我在 Spreadsheets.Values.Get 致电:

googleapi: Error 403: Request had insufficient authentication scopes., forbidden

示例代码

// Sample app showing issue with GAE -> google spreadsheets
package main

import (
    "context"
    "fmt"
    "log"
    "net/http"
    "os"

    "cloud.google.com/go/compute/metadata"
    "golang.org/x/oauth2/google"
    "google.golang.org/api/sheets/v4"
)

func main() {
    http.HandleFunc("/", indexHandler)

    // [START setting_port]
    port := os.Getenv("PORT")
    if port == "" {
        port = "8080"
        log.Printf("Defaulting to port %s\n", port)
    }

    // let's check app engine instance scopes
    scopes, _ := metadata.Get("instance/service-accounts/default/scopes")
    log.Printf("[DEBUG] metadata scopes: %s.\n", scopes)

    log.Printf("Listening on port %s", port)
    log.Fatal(http.ListenAndServe(fmt.Sprintf(":%s", port), nil))
    // [END setting_port]
}

// indexHandler responds to requests with our greeting.
func indexHandler(w http.ResponseWriter, r *http.Request) {
    ctx := context.Background()
    client, _ := google.DefaultClient(ctx, "https://www.googleapis.com/auth/spreadsheets.readonly")
    srv, err := sheets.New(client)

    // Prints the names and majors of students in a sample spreadsheet:
    // https://docs.google.com/spreadsheets/d/1BxiMVs0XRA5nFMdKvBdBZjgmUUqptlbs74OgvE2upms/edit
    spreadsheetId := "1BxiMVs0XRA5nFMdKvBdBZjgmUUqptlbs74OgvE2upms"
    readRange := "Class Data!A2:E"
    resp, err := srv.Spreadsheets.Values.Get(spreadsheetId, readRange).Do()
    if err != nil {
        log.Fatalf("Unable to retrieve data from sheet: %v\n", err)
    }

    if len(resp.Values) == 0 {
        fmt.Fprintf(w, "No data found.\n")
    } else {
        fmt.Fprintf(w, "Name, Major:\n")
        for _, row := range resp.Values {
            // Print columns A and E, which correspond to indices 0 and 4.
            fmt.Fprintf(w, "%s, %s\n", row[0], row[4])
        }
    }

}

复制步骤:

1)部署应用程序:gcloud app deploy
2)在浏览器中打开(您将得到502):gcloud app browse
3)检查日志:gcloud app logs read

1) deploy app: gcloud app deploy
2) open in a browser (you will get 502): gcloud app browse
3) check logs: gcloud app logs read

2018-12-11 21:44:56 default[20181211t134352]  "GET / HTTP/1.1" 502
2018-12-11 21:44:57 default[20181211t134352]  2018/12/11 21:44:57 [DEBUG] metadata scopes: https://www.googleapis.com/auth/appengine.apis
2018-12-11 21:44:57 default[20181211t134352]  https://www.googleapis.com/auth/cloud-platform
2018-12-11 21:44:57 default[20181211t134352]  https://www.googleapis.com/auth/cloud_debugger
2018-12-11 21:44:57 default[20181211t134352]  https://www.googleapis.com/auth/devstorage.full_control
2018-12-11 21:44:57 default[20181211t134352]  https://www.googleapis.com/auth/logging.write
2018-12-11 21:44:57 default[20181211t134352]  https://www.googleapis.com/auth/monitoring.write
2018-12-11 21:44:57 default[20181211t134352]  https://www.googleapis.com/auth/trace.append
2018-12-11 21:44:57 default[20181211t134352]  https://www.googleapis.com/auth/userinfo.email
2018-12-11 21:44:57 default[20181211t134352]  .
2018-12-11 21:44:57 default[20181211t134352]  2018/12/11 21:44:57 Listening on port 8081
2018-12-11 21:44:58 default[20181211t134352]  2018/12/11 21:44:58 Unable to retrieve data from sheet: googleapi: Error 403: Request had insufficient authentication scopes., forbidden

有人可以帮忙了解如何解决此问题吗?

Could someone please help to understand how to fix it?

示例项目: https://github.com/vistrcm/gae-spreadsheet-issue

推荐答案

在将App Engine与G Suite集成之前,我都曾遇到过这种情况.您需要使用服务帐户密钥.默认值不足以满足要求(我相信是因为它没有私钥,但这可能是错误的).

I've ran into this before as well with App Engine to G Suite integrations. You need to use a service account key. The default one does not suffice (I believe because it does not have a private key, but that might be wrong).

本质上,您将需要在代码中上传密钥,并使用该密钥获得Client(而不是使用默认密钥):

Essentially you will need to upload a key with your code and use that to get a Client (instead of using the default one):

func getOauthClient(serviceAccountKeyPath string) *http.Client {
    ctx := context.Background()
    data, err := ioutil.ReadFile(serviceAccountKeyPath)
    if err != nil {
        log.Fatal(err)
    }
    creds, err := google.CredentialsFromJSON(ctx, data, "https://www.googleapis.com/auth/spreadsheets.readonly")
    if err != nil {
        log.Fatal(err)
    }

    return oauth2.NewClient(ctx, creds.TokenSource)
}

这篇关于Google App Engine Go 1.11应用程序无法访问Google Spreadsheets的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆