PowerBuilder
PowerBuilder
Google Drive Refresh Access Token
Demonstrates how to automatically refresh the access token when it expires.Chilkat PowerBuilder Downloads
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