当访问令牌在GO中过期时,如何使用Google刷新令牌?

时间:2018-10-15 22:16:05

标签: go oauth-2.0 google-oauth

我是初次使用Google服务,并且目前正在尝试从gmail API中读取电子邮件。但是,我陷入了访问令牌过期的情况。

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

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

1 个答案:

答案 0 :(得分:0)

oauth2.Config具有可以自动刷新令牌的功能。

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

在此处传递您的旧令牌,updatedToken将反映更新的访问令牌和有效期