使用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_accessscope,才会返回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
相关产品推荐
相关产品推荐

