英文:
OAuth token expired and refresh token is not set
问题
我正在为一些HTTP API编写代码,需要使用OAuth。我正在使用OAuth Package。一开始它是正常工作的,但是过一段时间后我开始收到错误信息:
> 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
},
}
英文:
I am working on some HTTP APIs for which I need OAuth. I am using OAuth Package. It works at first but after some time I start getting error
> Token expired and refresh token is not set.
Here is my config
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
},
}
答案1
得分: 2
我看到有人说添加Scopes: []string{"offline_access"}
可以解决这个问题。但是我添加、部署和测试需要花费很多时间,所以我只想知道这是否是正确的答案,还是我需要做其他的事情。
英文:
I see somewhere that adding Scopes: []string{"offline_access"}
can resolve this issue. It takes a lot of time for me to actually add something and then deploy and test. So i just want to know if it's the correct answer or do I need to do something else.
答案2
得分: 1
我自己解决了这个问题,我添加了一个检查,如果接收到的令牌过期错误,那么我会重新请求令牌,而不是将错误发送回去,否则我会返回错误。
refreshErr := "oauth2: 令牌已过期且刷新令牌未设置"
// 使用令牌源检索配置的令牌或新令牌
token, err := a.tokenSource.Token()
if err != nil && strings.Contains(err.Error(), refreshErr) {
// 更新令牌源
a.tokenSource, err = a.getUserToken()
if err != nil {
return "", err
}
// 获取新令牌
token, err = a.tokenSource.Token()
if err != nil {
return "", err
}
} else if err != nil { // 刷新令牌错误以外的其他错误
return "", err
}
你可以在代码中将refreshErr
定义为一个常量。
英文:
I fixed the problem on my own, I put a check that if a received token expires error then instead of sending the error back, I request the token again else I return the error.
refreshErr := "oauth2: token expired and refresh token is not set"
// use token source to retrieve the configured token or a new token
token, err := a.tokenSource.Token()
if err != nil && strings.Contains(err.Error(), refreshErr) {
// update the token source
a.tokenSource, err = a.getUserToken()
if err != nil {
return "", err
}
// get the new token
token, err = a.tokenSource.Token()
if err != nil {
return "", err
}
} else if err != nil { // some other error than refresh token error
return "", err
}
You can define the refreshErr
as a constant in your code.
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论