Sample code for 30+ languages & platforms
Go

Automatically Refresh Token for 401 Unauthorized

See more Google Calendar Examples

Demonstrates how to automatically refresh an access token (without user interaction) when the token expires and a 401 Unauthorized response is received.

Chilkat Go Downloads

Go
    success := false

    // This example requires the Chilkat API to have been previously unlocked.
    // See Global Unlock Sample for sample code.

    tokenFilePath := "qa_data/tokens/googleCalendar.json"

    // Get our current access token.
    jsonToken := chilkat.NewJsonObject()
    success = jsonToken.LoadFile(tokenFilePath)
    if jsonToken.HasMember("access_token") == false {
        fmt.Println("No access token found.")
        jsonToken.DisposeJsonObject()
        return
    }

    http := chilkat.NewHttp()
    http.SetAuthToken(jsonToken.StringOf("access_token"))

    jsonResponse := http.QuickGetStr("https://www.googleapis.com/calendar/v3/users/me/calendarList")
    if http.LastMethodSuccess() != true {

        if http.LastStatus() != 401 {
            fmt.Println(http.LastErrorText())
            fmt.Println("----")
            fmt.Println(http.LastResponseBody())
            jsonToken.DisposeJsonObject()
            http.DisposeHttp()
            return
        }

        // The access token must've expired. 
        // Refresh the access token and then retry the request.
        oauth2 := chilkat.NewOAuth2()

        oauth2.SetTokenEndpoint("https://www.googleapis.com/oauth2/v4/token")

        // Replace these with actual values.
        oauth2.SetClientId("GOOGLE-CLIENT-ID")
        oauth2.SetClientSecret("GOOGLE-CLIENT-SECRET")

        // Get the "refresh_token"
        oauth2.SetRefreshToken(jsonToken.StringOf("refresh_token"))

        // Send the HTTP POST to refresh the access token..
        success = oauth2.RefreshAccessToken()
        if success != true {
            fmt.Println(oauth2.LastErrorText())
            jsonToken.DisposeJsonObject()
            http.DisposeHttp()
            oauth2.DisposeOAuth2()
            return
        }

        // The response contains a new access token, but we must keep
        // our existing refresh token for when we need to refresh again in the future.
        jsonToken.UpdateString("access_token",oauth2.AccessToken())

        // Save the new JSON access token response to a file.
        sbJson := chilkat.NewStringBuilder()
        jsonToken.SetEmitCompact(false)
        jsonToken.EmitSb(sbJson)
        sbJson.WriteFile(tokenFilePath,"utf-8",false)

        fmt.Println("OAuth2 authorization granted!")
        fmt.Println("New Access Token = ", oauth2.AccessToken())

        // re-try the original request.
        http.SetAuthToken(oauth2.AccessToken())
        jsonResponse = http.QuickGetStr("https://www.googleapis.com/calendar/v3/users/me/calendarList")
        if http.LastMethodSuccess() != true {
            fmt.Println(http.LastErrorText())
            jsonToken.DisposeJsonObject()
            http.DisposeHttp()
            oauth2.DisposeOAuth2()
            sbJson.DisposeStringBuilder()
            return
        }

    }

    fmt.Println(*jsonResponse)
    fmt.Println("-----------------------------")

    jsonToken.DisposeJsonObject()
    http.DisposeHttp()
    oauth2.DisposeOAuth2()
    sbJson.DisposeStringBuilder()