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
相关产品推荐
相关产品推荐

