gpt4 book ai didi

go - 访问 token 在 GO 中过期时如何使用谷歌刷新 token ?

转载 作者:数据小太阳 更新时间:2023-10-29 03:21:38 24 4
gpt4 key购买 nike

我刚开始使用 Google 服务,目前正在尝试从 gmail API 读取电子邮件。但是,当访问 token 过期时,我陷入了这种情况。

我有第一次身份验证的刷新 token ,但是,一些线程说访问 token 在过期时会自动刷新。但是我的没有。我不知道我哪里错了。这是我目前的代码。

// get saved token from database / anywhere else
func getCachedToken() *oauth2.Token {
token := new(oauth2.Token)
token.AccessToken = "xxxxxxxx"
token.RefreshToken = "xxxxxx"
token.TokenType = "Bearer"
return token
}

func refreshToken(config *oauth2.Config, token *oauth2.Token) *http.Client {
return config.Client(context.Background(), token)
}

// Retrieve a token, saves the token, then returns the generated client.
func getClient(config *oauth2.Config) *http.Client {
tok := getTokenFromWeb(config)
fmt.Println(tok.RefreshToken)
fmt.Println(tok.AccessToken)
fmt.Println(tok.Expiry)
fmt.Println(tok.TokenType)
return config.Client(context.Background(), tok)
}

func main() (string, error) {
b, err := ioutil.ReadFile("credentials.json")
if err != nil {
log.Fatalf("Unable to read client secret file: %v", err)
}

// If modifying these scopes, delete your previously saved token.json.
config, err := google.ConfigFromJSON(b, gmail.GmailReadonlyScope, gmail.GmailSendScope, gauth.UserinfoEmailScope, gauth.UserinfoProfileScope)
if err != nil {
log.Fatalf("Unable to parse client secret file to config: %v", err)
}
token := getCachedToken()
accessToken := token.AccessToken
client := refreshToken(config, token)
if err != nil {
log.Fatalf("Unable to retrieve oauth client: %v", err)
}
if accessToken != token.AccessToken {
fmt.Println(token.RefreshToken)
fmt.Println(token.AccessToken)
fmt.Println(token.Expiry)
fmt.Println(token.TokenType)
} //THE TOKEN IS NOT CHANGED HERE WHEN THE ACCESS TOKEN EXPIRED
srv, err := gmail.New(client)
if err != nil {
log.Fatalf("Unable to retrieve Gmail client: %v", err)
}

user := "me"

profile, err := srv.Users.GetProfile(user).Do()
if err != nil {
fmt.Println(err)
}
fmt.Println(profile.MessagesTotal)

return "test", nil
}

最佳答案

oauth2.Config 有自动刷新token的功能。

updatedToken,err := config.TokenSource(context.TODO(), token).Token()

在那里传递你的旧 token ,updatedToken 将反射(reflect)更新的访问 token 和到期时间

关于go - 访问 token 在 GO 中过期时如何使用谷歌刷新 token ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52825464/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com