Sample code for 30+ languages & platforms
Visual FoxPro

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 Visual FoxPro Downloads

Visual FoxPro
LOCAL lnSuccess
LOCAL lcTokenFilePath
LOCAL loJsonToken
LOCAL loHttp
LOCAL lcJsonResponse
LOCAL loOauth2
LOCAL loSbJson

lnSuccess = 0

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

lcTokenFilePath = "qa_data/tokens/googleCalendar.json"

* Get our current access token.
loJsonToken = CreateObject('Chilkat.JsonObject')
lnSuccess = loJsonToken.LoadFile(lcTokenFilePath)
IF (loJsonToken.HasMember("access_token") = 0) THEN
    ? "No access token found."
    RELEASE loJsonToken
    CANCEL
ENDIF

loHttp = CreateObject('Chilkat.Http')
loHttp.AuthToken = loJsonToken.StringOf("access_token")

lcJsonResponse = loHttp.QuickGetStr("https://www.googleapis.com/calendar/v3/users/me/calendarList")
IF (loHttp.LastMethodSuccess <> 1) THEN

    IF (loHttp.LastStatus <> 401) THEN
        ? loHttp.LastErrorText
        ? "----"
        ? loHttp.LastResponseBody
        RELEASE loJsonToken
        RELEASE loHttp
        CANCEL
    ENDIF

    * The access token must've expired. 
    * Refresh the access token and then retry the request.
    loOauth2 = CreateObject('Chilkat.OAuth2')

    loOauth2.TokenEndpoint = "https://www.googleapis.com/oauth2/v4/token"

    * Replace these with actual values.
    loOauth2.ClientId = "GOOGLE-CLIENT-ID"
    loOauth2.ClientSecret = "GOOGLE-CLIENT-SECRET"

    * Get the "refresh_token"
    loOauth2.RefreshToken = loJsonToken.StringOf("refresh_token")

    * Send the HTTP POST to refresh the access token..
    lnSuccess = loOauth2.RefreshAccessToken()
    IF (lnSuccess <> 1) THEN
        ? loOauth2.LastErrorText
        RELEASE loJsonToken
        RELEASE loHttp
        RELEASE loOauth2
        CANCEL
    ENDIF

    * 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.
    loJsonToken.UpdateString("access_token",loOauth2.AccessToken)

    * Save the new JSON access token response to a file.
    loSbJson = CreateObject('Chilkat.StringBuilder')
    loJsonToken.EmitCompact = 0
    loJsonToken.EmitSb(loSbJson)
    loSbJson.WriteFile(lcTokenFilePath,"utf-8",0)

    ? "OAuth2 authorization granted!"
    ? "New Access Token = " + loOauth2.AccessToken

    * re-try the original request.
    loHttp.AuthToken = loOauth2.AccessToken
    lcJsonResponse = loHttp.QuickGetStr("https://www.googleapis.com/calendar/v3/users/me/calendarList")
    IF (loHttp.LastMethodSuccess <> 1) THEN
        ? loHttp.LastErrorText
        RELEASE loJsonToken
        RELEASE loHttp
        RELEASE loOauth2
        RELEASE loSbJson
        CANCEL
    ENDIF

ENDIF

? lcJsonResponse
? "-----------------------------"

RELEASE loJsonToken
RELEASE loHttp
RELEASE loOauth2
RELEASE loSbJson