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

使用golang.org/x/oauth2包遇Token过期且未设刷新令牌问题求助

解决Go OAuth2中"Token expired and refresh token is not set"错误

我正在开发需要OAuth认证的HTTP API,使用Go的oauth2包。初始运行正常,但一段时间后出现错误:

Token expired and refresh token is not set.

我的配置代码如下:

userCfg := &oauth2.Config{
    ClientID:     a.ClientID,
    ClientSecret: a.ClientSecret,
    Endpoint: oauth2.Endpoint{
        TokenURL:  a.ProviderURL,
        AuthStyle: oauth2.AuthStyleInParams, // basic auth is not supported by Ping
    },
}

问题核心

这个错误的本质是OAuth流程没有获取到刷新令牌(refresh token),或者获取后未正确存储并传递给oauth2客户端,导致访问令牌过期后无法自动刷新。

解决步骤

  • 添加offline_access权限范围
    绝大多数OAuth2提供商(包括Ping)要求显式指定offline_access scope,才会返回refresh token。修改配置添加该scope:

    userCfg := &oauth2.Config{
        ClientID:     a.ClientID,
        ClientSecret: a.ClientSecret,
        Scopes:       []string{"offline_access", "你的其他业务scope"}, // 新增offline_access
        Endpoint: oauth2.Endpoint{
            TokenURL:  a.ProviderURL,
            AuthStyle: oauth2.AuthStyleInParams,
        },
    }
    
  • 持久化存储并复用Token对象
    首次通过Exchange或TokenSource获取令牌时,得到的oauth2.Token包含RefreshToken字段,必须将这个对象持久化(比如存入数据库、文件)。后续请求时,用存储的Token创建自动刷新的TokenSource:

    // 从存储中读取保存的Token
    savedToken := &oauth2.Token{
        AccessToken:  "已保存的访问令牌",
        RefreshToken: "已保存的刷新令牌",
        Expiry:       time.Unix(令牌过期时间戳, 0),
    }
    
    // 创建支持自动刷新的TokenSource
    ts := userCfg.TokenSource(context.Background(), savedToken)
    // 生成具备自动刷新能力的HTTP客户端
    client := oauth2.NewClient(context.Background(), ts)
    
  • 检查Ping Identity应用配置
    登录Ping控制台,确认你的应用已开启允许返回refresh token的选项,部分提供商需要手动启用该权限。

内容的提问来源于stack exchange,提问作者Kashif Khan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 11:22:16