调用Google Sheets API时遇ACCESS_TOKEN_SCOPE_INSUFFICIENT错误(Golang)
问题:调用Google Sheets API时出现403权限不足错误
我尝试运行一个调用Google Sheets API的简单Golang程序,代码如下:
package main import ( "context" "fmt" "google.golang.org/api/sheets/v4" ) func main() { ctx := context.Background() srv, err := sheets.NewService(ctx) if err != nil { panic(err) } resp, err := srv.Spreadsheets.Values.Get("1HG_cmqALkquc0ud8Pm7GKOhR5IpPSj20q_fFkHBaM5M", "A1").Do() if err != nil { panic(err) } fmt.Println(fmt.Sprintf("%+v", resp.Values)) }
执行步骤:先删除本地的application_default_credentials.json文件,再通过gcloud auth application-default login完成登录,凭证已保存到指定路径,但运行程序时出现以下报错:
$ go run sheets_api.go panic: googleapi: Error 403: Request had insufficient authentication scopes. Details: [ { "@type": "type.googleapis.com/google.rpc.ErrorInfo", "domain": "googleapis.com", "metadata": { "method": "google.apps.sheets.v4.SpreadsheetsService.GetValues", "service": "sheets.googleapis.com" }, "reason": "ACCESS_TOKEN_SCOPE_INSUFFICIENT" } ] More details: Reason: insufficientPermissions, Message: Insufficient Permission goroutine 1 [running]: main.main() /home/johan/20q/cmd/labelserver/sheets_api.go:20 +0x194 exit status 2
该Google表格由我创建,我的账号应有访问权限,请问哪里操作有误?
解决方法
问题核心是认证时未请求足够的API权限范围,gcloud auth application-default login默认权限不包含Google Sheets的读写/只读权限,需手动指定所需scope。
两种解决方式:
方式一:重新登录时指定权限范围
- 先清除旧凭证:
rm ~/.config/gcloud/application_default_credentials.json - 带权限范围重新登录:
# 只读权限用这个 gcloud auth application-default login --scopes=https://www.googleapis.com/auth/spreadsheets.readonly # 需要读写权限的话用这个 gcloud auth application-default login --scopes=https://www.googleapis.com/auth/spreadsheets
- 先清除旧凭证:
方式二:代码中显式指定权限范围
修改创建Service的代码,直接嵌入所需scope,避免后续登录时遗漏:package main import ( "context" "fmt" "google.golang.org/api/option" "google.golang.org/api/sheets/v4" ) func main() { ctx := context.Background() // 显式指定只读权限范围,读写的话换成sheets.SpreadsheetsScope srv, err := sheets.NewService(ctx, option.WithScopes(sheets.SpreadsheetsReadonlyScope)) if err != nil { panic(err) } resp, err := srv.Spreadsheets.Values.Get("1HG_cmqALkquc0ud8Pm7GKOhR5IpPSj20q_fFkHBaM5M", "A1").Do() if err != nil { panic(err) } fmt.Println(fmt.Sprintf("%+v", resp.Values)) }
内容的提问来源于stack exchange,提问作者Johan Wikström
相关产品推荐
相关产品推荐

