Sample code for 30+ languages & platforms
PowerBuilder

Google Drive Refresh Access Token

Demonstrates how to automatically refresh the access token when it expires.

Chilkat PowerBuilder Downloads

PowerBuilder
integer li_rc
long li_Success
oleobject loo_Json
string ls_TokenFilePath
oleobject loo_Oauth2
oleobject loo_Rest
long li_BAutoReconnect
string ls_JsonResponse
oleobject loo_Fac

li_Success = 0

li_Success = 1

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

//  This example uses a previously obtained access token having permission for the 
//  Google Drive scope.

//  The access token (and refresh token) was previously saved to a JSON file with this format:
//  See Get Google Drive OAuth2 Access Token

//  {
//    "access_token": "ya29.Gls-BsdxTWuenChv ... yzVIrXikkLxu5T6dy4I6GjADFardoz4Lruw",
//    "expires_in": 3600,
//    "refresh_token": "1/tMBJ ... 27D-Hk6rpQYBA",
//    "scope": "https://www.googleapis.com/auth/drive",
//    "token_type": "Bearer"
//  }

loo_Json = create oleobject
li_rc = loo_Json.ConnectToNewObject("Chilkat.JsonObject")
if li_rc < 0 then
    destroy loo_Json
    MessageBox("Error","Connecting to COM object failed")
    return
end if
ls_TokenFilePath = "qa_data/tokens/googleDrive.json"
loo_Json.LoadFile(ls_TokenFilePath)

loo_Oauth2 = create oleobject
li_rc = loo_Oauth2.ConnectToNewObject("Chilkat.OAuth2")

loo_Oauth2.AccessToken = loo_Json.StringOf("access_token")
loo_Oauth2.RefreshToken = loo_Json.StringOf("refresh_token")

loo_Rest = create oleobject
li_rc = loo_Rest.ConnectToNewObject("Chilkat.Rest")

//  Connect using TLS.
li_BAutoReconnect = 1
li_Success = loo_Rest.Connect("www.googleapis.com",443,1,li_BAutoReconnect)

//  Provide the authentication credentials (i.e. the access token)
loo_Rest.SetAuthOAuth2(loo_Oauth2)

//  We'll test with a simple request to empty trash.
//  If our access token expired, we'll get a 401 response..
ls_JsonResponse = loo_Rest.FullRequestNoBody("DELETE","/drive/v3/files/trash")
if loo_Rest.LastMethodSuccess <> 1 then
    Write-Debug loo_Rest.LastErrorText
    destroy loo_Json
    destroy loo_Oauth2
    destroy loo_Rest
    return
end if

//  If the access token expired, we'll get a 401 response status with this response body:
//  {
//   "error": {
//    "errors": [
//     {
//      "domain": "global",
//      "reason": "authError",
//      "message": "Invalid Credentials",
//      "locationType": "header",
//      "location": "Authorization"
//     }
//    ],
//    "code": 401,
//    "message": "Invalid Credentials"
//   }
//  }
if loo_Rest.ResponseStatusCode = 401 then

    Write-Debug "Refreshing access token..."

    loo_Oauth2.AuthorizationEndpoint = "https://accounts.google.com/o/oauth2/v2/auth"
    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"
    loo_Oauth2.Scope = "https://www.googleapis.com/auth/drive"

    //  Use OAuth2 to refresh the access token.
    li_Success = loo_Oauth2.RefreshAccessToken()
    if li_Success <> 1 then
        Write-Debug loo_Oauth2.LastErrorText
        destroy loo_Json
        destroy loo_Oauth2
        destroy loo_Rest
        return
    end if

    //  Save the new access token to our XML file (so we can refresh it again when needed).
    loo_Json.UpdateString("access_token",loo_Oauth2.AccessToken)

    loo_Fac = create oleobject
    li_rc = loo_Fac.ConnectToNewObject("Chilkat.FileAccess")

    loo_Fac.WriteEntireTextFile(ls_TokenFilePath,loo_Json.Emit(),"utf-8",0)

    Write-Debug "Access Token Refreshed!"

    //  Retry the request with the new access token..
    ls_JsonResponse = loo_Rest.FullRequestNoBody("DELETE","/drive/v3/files/trash")
    if loo_Rest.LastMethodSuccess <> 1 then
        Write-Debug loo_Rest.LastErrorText
        destroy loo_Json
        destroy loo_Oauth2
        destroy loo_Rest
        destroy loo_Fac
        return
    end if

end if

//  A successful response will have a status code equal to 204 and the response body is empty.
//  (If not successful, then there should be a JSON response body with information..)
if loo_Rest.ResponseStatusCode <> 204 then
    Write-Debug "response status code = " + string(loo_Rest.ResponseStatusCode)
    Write-Debug "response status text = " + loo_Rest.ResponseStatusText
    Write-Debug "response header: " + loo_Rest.ResponseHeader
    Write-Debug "response JSON: " + ls_JsonResponse
    destroy loo_Json
    destroy loo_Oauth2
    destroy loo_Rest
    destroy loo_Fac
    return
end if

Write-Debug "Trash Emptied!"


destroy loo_Json
destroy loo_Oauth2
destroy loo_Rest
destroy loo_Fac