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

Google Workplace API OAuth2生产环境无Refresh Token问题排查求助

问题排查:生产环境Google OAuth2无法获取Refresh Token

核心原因分析

本地环境正常但生产环境无Refresh Token,常见原因是用户已完成过相同Scope的授权,Google默认不再返回Refresh Token,结合你的代码,具体排查点如下:

1. 缺少强制重新授权的Prompt参数

Google OAuth2协议规定:当用户已授权过相同的Scope集合,后续的授权请求默认不会返回Refresh Token,除非明确要求用户重新确认授权。你的代码中生成授权URL时仅指定了AccessTypeOffline,未添加prompt=consent参数,导致生产环境中重复授权的用户无法获取Refresh Token。

代码修改建议

修改GetConsentUrl方法中的授权URL生成逻辑:

func (g *GoogleWorkplaceApi) GetConsentUrl() string {
    var gConfig = &oauth2.Config{}
    gConfig.ClientID = g.GoogleClientID
    gConfig.ClientSecret = g.GoogleClientSecrete
    gConfig.Endpoint = google.Endpoint
    fmt.Println("g.BaseUrl", g.BaseUrl)
    gConfig.Scopes = []string{gmail.GmailModifyScope, calendar.CalendarScope}
    gConfig.RedirectURL = g.BaseUrl + "/google-api/callback"
    // 添加prompt=consent参数,强制用户重新授权以获取Refresh Token
    url := gConfig.AuthCodeURL("state-token", oauth2.AccessTypeOffline, oauth2.SetAuthURLParam("prompt", "consent"))
    fmt.Println(url)
    return url
}

2. 再次确认生产环境的Redirect URI细节

虽然你已确认URI一致,但仍需检查:

  • 生产环境的BaseUrl是否包含正确的协议(http/https),Google Cloud配置的Redirect URI必须与代码中拼接的完全一致(包括协议、域名、路径)
  • 避免URI末尾出现多余的斜杠,或路径拼写错误

3. 检查OAuth同意屏幕的发布状态

如果你的Google Cloud项目OAuth同意屏幕处于测试状态,仅允许添加的测试用户授权,且Refresh Token会在7天后过期。若生产环境使用的是未添加的外部用户,可能导致授权流程异常,建议将同意屏幕发布为正式状态。

4. 确认AccessTypeOffline参数的有效性

确保在Exchange方法中同样传递了oauth2.AccessTypeOffline参数,你的代码中已经包含此逻辑,这部分无需修改,但需确认参数未被遗漏。

内容的提问来源于stack exchange,提问作者raj.dev

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.01 06:33:14