gpt4 book ai didi

go - 无法让 Oauth2 TokenSource 刷新从存储中检索到的 token

转载 作者:行者123 更新时间:2023-12-01 22:28:06 27 4
gpt4 key购买 nike

用户授权 Google 日历后,NodeJS 服务会保存 代码、AccessToken 和 RefreshToken 到一个存储。

尝试使用相同的 token 访问使用 Go 编写的不同后端服务的用户日历。
当 AccessToken 有效时,数据是可访问的,但是当 AccessToken 过期时,无法获取 config.Exchange() 或 config.TokenSource() 以提供新的 token ,即使 token 有效,在尝试访问事件时也是如此,得到错误:

Error 401: Invalid Credentials, authError exit status 1


 tok, err := config.TokenSource(ctx, token).Token() // token is previous valid token
if err != nil {
log.Fatalf("Unable to retrieve token from web: %v", err)
}

还尝试用代码交换新 token ,但无济于事

400 Bad Request Response: { "error": "invalid_grant", "error_description": "Malformed auth code." }


    tok, err := config.Exchange(context.TODO(), in)
if err != nil {
log.Fatalf("Unable to retrieve token from web: %v", err)
}

尝试使用 calendar.NewService 访问
srv, _ := calendar.NewService(ctx, option.WithTokenSource(config.TokenSource(ctx, tok)))

如何获得可以离线访问的 token ,而无需用户干预来自其他服务?

更新:将 token 存储到 Redis - RedisJSON 但仍不会获得新的 AccessToken。这是我传递有效 token 的完整功能。它仅在 AccessToken 到期之前有效。
func GetGoogleCalendarEvents(token *oauth2.Token, userid string) *calendar.Events {
tok := &oauth2.Token{}
var config *oauth2.Config
ctx := context.Background()

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

config, err = google.ConfigFromJSON(b, calendar.CalendarScope) //calendar.CalendarScope)
if err != nil {
log.Fatalf("Unable to parse client secret file to config: %v", err)
}

tok = token

if token.Expiry.Before(time.Now()) {

tokenSource := config.TokenSource(ctx, token) //oauth2.NoContext

newToken, err := tokenSource.Token()
if err != nil {
log.Fatalln(err)
}

if tok.AccessToken != newToken.AccessToken {
SetAuthCredToCache(userid, tok)
tok = newToken
fmt.Println(newToken)
}
}

fmt.Println(tok.Expiry, tok.Valid(), tok.Type(), tok.RefreshToken, tok.TokenType)

srv, _ := calendar.NewService(ctx, option.WithTokenSource(config.TokenSource(ctx, tok)))

t := time.Now().Format(time.RFC3339)

events, err := srv.Events.List("primary").ShowDeleted(true).
SingleEvents(true).TimeMin(t).OrderBy("startTime").Do()

if err != nil {
log.Fatalf("Unable to retrieve next ten of the user's events: %v", err)
}
return events

}

最佳答案

这是一个解码问题。

从 Node 保存 token 时,它将到期时间序列化为 “到期日期” Go Token 的 json 表示形式为 “到期” .将对象的其余部分解码为 oauth2.Token 对象并向该对象添加到期时间解决了该问题。

关于go - 无法让 Oauth2 TokenSource 刷新从存储中检索到的 token ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58534830/

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