You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Go使用Google OAuth2 password授权模式获取Access token返回400错误

问题原因与解决方案

错误产生原因

  • 核心原因:Google OAuth 2.0 服务官方不支持password授权类型(即资源所有者密码凭证授权模式)。该授权模式本身仅适用于客户端与用户高度信任的场景,Google出于账号安全考量已经完全禁用了这种获取访问令牌的方式,因此无论参数配置是否正确,调用google.Endpoint使用PasswordCredentialsToken方法都会触发该报错。
  • 附加问题:你当前的oauth2.Config配置未指定接口所需的权限范围(Scopes),即使后续更换为支持的授权模式,也会出现权限相关报错。

解决办法

你需要获取应用内商品列表,属于服务端调用Google Play Developer API的场景,推荐使用服务账号(Service Account)授权模式,操作步骤如下:

  1. 登录Google Cloud控制台,创建对应项目的服务账号,下载JSON格式的密钥文件
  2. 登录Google Play开发者控制台,给上述服务账号授予应用内商品的查看权限
  3. 替换原有授权逻辑,使用服务账号JWT方式获取访问令牌,示例代码如下:
import (
    "context"
    "os"
    "log"
    "golang.org/x/oauth2/google"
    "google.golang.org/api/androidpublisher/v3"
)

// 加载服务账号密钥文件
serviceAccountKey, err := os.ReadFile("你的服务账号密钥文件路径.json")
if err != nil {
    log.Fatalf("读取密钥文件失败: %v", err)
}

// 配置JWT,指定Google Play Developer API的权限scope
conf, err := google.JWTConfigFromJSON(serviceAccountKey, androidpublisher.AndroidpublisherScope)
if err != nil {
    log.Fatalf("初始化JWT配置失败: %v", err)
}

// 获取有效访问令牌
token, err := conf.TokenSource(context.Background()).Token()
if err != nil {
    log.Fatalf("获取令牌失败: %v", err)
}

log.Printf("获取到的令牌: %+v", token)

如果是有用户交互的场景,可以改用OAuth 2.0授权码模式,引导用户在浏览器完成授权后获取令牌。

内容的提问来源于stack exchange,提问作者김정진

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.12 16:51:03