当前位置: 首页 > 知识库问答 >
问题:

无法获取Oauth2令牌以刷新从存储中检索的令牌

林弘文
2023-03-14

用户授权Google Calendar后,NodeJS服务将代码、AccessToken和RefreshToken保存到存储中。

 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)
 }

我也尝试将代码交换为新的令牌,但没有帮助

400错误的请求响应:{“error”:“invalid_grant”,“error_description”:“auth代码格式错误”}

    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)))
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

}

共有1个答案

尹光辉
2023-03-14

这是一个解组问题。

当从节点保存令牌时,它将过期时间序列化为“expiry_date”,而Go令牌的json表示仅为“expiry”。将对象的其余部分解压缩到oauth2.token对象并将过期时间添加到该对象解决了这个问题。

 类似资料:
  • 我对oauth2中的刷新令牌有点困惑。如它所说的访问令牌限制了黑客可以使用用户凭证的1小时的时间窗口,刷新令牌是万岁令牌,可以用来重新创建访问令牌。 我很困惑,如果有人从cookie中窃取了访问令牌,他也可以窃取刷新令牌,并可以使用刷新令牌创建新的访问令牌,因为我在JQuery中有ajax请求(客户端)

  • 我用JHipster 5.1.0生成了一个UAA服务器。我选择PostgreSQL作为数据库类型。 它连接到我的jhipster注册表,然后我生成了一个微服务和一个网关,如下所示: 启动网关进行用户登录后,它无法获取访问令牌并引发错误: 2018-07-23 17:32:53.378调试7228---[XNIO-2 task-10]c.c.c.a.g.a.AccessControlFilter:访

  • 目前访问类型处于联机状态。当我需要访问驱动器上的文件/文件夹时,我将浏览器重定向到Google URL并获得访问代码: 一切运转良好!但我只需要第一次重定向。 当我谷歌时,在google Drive API文档中,我发现我可以通过浏览器重定向获得刷新令牌,并将其保存在数据库中。(换句话说,我可以使用脱机访问)。 而且每次当我需要从google drive读取数据时,我使用刷新令牌获得访问令牌,而无

  • 我使用python google api客户机库来处理它使用google的Platform.js库从前端获得的的。 在这一点上,我所拥有的只是一个承载令牌。如何将其转换为凭据以便访问驱动器API?

  • 我正在尝试从应用程序服务中获取Google的刷新令牌,但我不能。 日志说 2016-11-04T00:04:25 PID[500]收到的详细请求:获取https://noteappsvr.azurewebsites.net/.auth/login/google?access _ type = offline 2016-11-04t 00:04:25 PID[500]从https://account