Sample code for 30+ languages & platforms
PowerBuilder

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 PowerBuilder Downloads

PowerBuilder
integer li_rc
integer li_Success
string ls_TokenFilePath
oleobject loo_JsonToken
oleobject loo_Http
string ls_JsonResponse
oleobject loo_Oauth2
oleobject loo_SbJson

li_Success = 0

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

ls_TokenFilePath = "qa_data/tokens/googleCalendar.json"

// Get our current access token.
loo_JsonToken = create oleobject
li_rc = loo_JsonToken.ConnectToNewObject("Chilkat.JsonObject")
if li_rc < 0 then
    destroy loo_JsonToken
    MessageBox("Error","Connecting to COM object failed")
    return
end if
li_Success = loo_JsonToken.LoadFile(ls_TokenFilePath)
if loo_JsonToken.HasMember("access_token") = 0 then
    Write-Debug "No access token found."
    destroy loo_JsonToken
    return
end if

loo_Http = create oleobject
li_rc = loo_Http.ConnectToNewObject("Chilkat.Http")

loo_Http.AuthToken = loo_JsonToken.StringOf("access_token")

ls_JsonResponse = loo_Http.QuickGetStr("https://www.googleapis.com/calendar/v3/users/me/calendarList")
if loo_Http.LastMethodSuccess <> 1 then

    if loo_Http.LastStatus <> 401 then
        Write-Debug loo_Http.LastErrorText
        Write-Debug "----"
        Write-Debug loo_Http.LastResponseBody
        destroy loo_JsonToken
        destroy loo_Http
        return
    end if

    // The access token must've expired. 
    // Refresh the access token and then retry the request.
    loo_Oauth2 = create oleobject
    li_rc = loo_Oauth2.ConnectToNewObject("Chilkat.OAuth2")

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

    // Replace these with actual values.
    loo_Oauth2.ClientId = "GOOGLE-CLIENT-ID"
    loo_Oauth2.ClientSecret = "GOOGLE-CLIENT-SECRET"

    // Get the "refresh_token"
    loo_Oauth2.RefreshToken = loo_JsonToken.StringOf("refresh_token")

    // Send the HTTP POST to refresh the access token..
    li_Success = loo_Oauth2.RefreshAccessToken()
    if li_Success <> 1 then
        Write-Debug loo_Oauth2.LastErrorText
        destroy loo_JsonToken
        destroy loo_Http
        destroy loo_Oauth2
        return
    end if

    // 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.
    loo_JsonToken.UpdateString("access_token",loo_Oauth2.AccessToken)

    // Save the new JSON access token response to a file.
    loo_SbJson = create oleobject
    li_rc = loo_SbJson.ConnectToNewObject("Chilkat.StringBuilder")

    loo_JsonToken.EmitCompact = 0
    loo_JsonToken.EmitSb(loo_SbJson)
    loo_SbJson.WriteFile(ls_TokenFilePath,"utf-8",0)

    Write-Debug "OAuth2 authorization granted!"
    Write-Debug "New Access Token = " + loo_Oauth2.AccessToken

    // re-try the original request.
    loo_Http.AuthToken = loo_Oauth2.AccessToken
    ls_JsonResponse = loo_Http.QuickGetStr("https://www.googleapis.com/calendar/v3/users/me/calendarList")
    if loo_Http.LastMethodSuccess <> 1 then
        Write-Debug loo_Http.LastErrorText
        destroy loo_JsonToken
        destroy loo_Http
        destroy loo_Oauth2
        destroy loo_SbJson
        return
    end if

end if

Write-Debug ls_JsonResponse
Write-Debug "-----------------------------"


destroy loo_JsonToken
destroy loo_Http
destroy loo_Oauth2
destroy loo_SbJson