Golang使用golang.org/x/oauth2对接Github OAuth2未获取refresh token问题
问题原因
- GitHub OAuth2 服务默认颁发长期无过期时间的 Access Token,该模式下不会返回 Refresh Token,也没有过期时间字段,所以你拿到的 RefreshToken 和 Expiry 自然为空。
- 若你已经开启了令牌过期功能,但发起授权跳转时未携带
prompt=consent参数,GitHub 也不会返回 Refresh Token,golang.org/x/oauth2库解析不到返回的过期时间标识就会保留 Expiry 为空值。
解决方案
1. 开启OAuth应用令牌过期配置
登录GitHub账号进入对应OAuth应用的设置页,找到「Expire user authorization tokens」选项,勾选后保存配置。开启后新颁发的Access Token默认有效期为8小时,同时会配套返回Refresh Token。
2. 构造授权链接时追加强制授权参数
在调用AuthCodeURL生成用户跳转的授权链接时,通过oauth2.SetAuthURLParam方法添加prompt=consent参数,示例代码如下:
// 生成授权跳转链接的代码调整示例 authURL := GithubOauthConfig.AuthCodeURL(RandomState, oauth2.SetAuthURLParam("prompt", "consent"))
该参数会强制GitHub每次都弹出用户授权确认页,只有用户主动确认授权后才会返回Refresh Token字段。
3. 重新走授权流程验证
调整完成后,先把账号中该应用的历史授权记录完全移除,重新发起授权流程,此时调用Exchange方法拿到的oauth2.Token就会正常填充RefreshToken和Expiry字段。
内容的提问来源于stack exchange,提问作者Thytu
相关产品推荐
相关产品推荐

