Sample code for 30+ languages & platforms
Visual FoxPro

Get Google API Access Token using JSON Private Key using NIST Time Server Date/Time

Demonstrates how to get a Google API access token using a JSON service account private key, using the NIST time server date/time rather than the local system date/time.

Chilkat Visual FoxPro Downloads

Visual FoxPro
LOCAL lnSuccess
LOCAL loSocket
LOCAL lnMaxWaitMs
LOCAL lnUseTls
LOCAL lnBigEndian
LOCAL loDt
LOCAL lnBLocalTime
LOCAL loFac
LOCAL lcJsonKey
LOCAL loGAuth
LOCAL lnUnixTime
LOCAL loTlsSock

lnSuccess = 0

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

* First, let's get the current date/time from time-c.nist.gov
loSocket = CreateObject('Chilkat.Socket')

* Connect to an NIST time server and read the current date/time
lnMaxWaitMs = 8000
lnUseTls = 0
lnSuccess = loSocket.Connect("time-c.nist.gov",37,lnUseTls,lnMaxWaitMs)
IF (lnSuccess <> 1) THEN
    ? loSocket.LastErrorText
    RELEASE loSocket
    CANCEL
ENDIF

* The time server will send a big-endian 32-bit integer representing
* the number of seconds since since 00:00 (midnight) 1 January 1900 GMT.
* The ReceiveInt32 method will receive a 4-byte integer, but returns
* 1 or 0 to indicate success.  If successful, the integer
* is obtained via the ReceivedInt property.
lnBigEndian = 1
lnSuccess = loSocket.ReceiveInt32(lnBigEndian)
IF (lnSuccess <> 1) THEN
    ? loSocket.LastErrorText
    RELEASE loSocket
    CANCEL
ENDIF

loDt = CreateObject('Chilkat.CkDateTime')
loDt.SetFromNtpTime(loSocket.ReceivedInt)

* Show the current local date/time
lnBLocalTime = 1
? "Current local date/time: " + loDt.GetAsRfc822(lnBLocalTime)

lnMaxWaitMs = 10
loSocket.Close(lnMaxWaitMs)

* ------------------------------------------------------------------------
* OK, we have the current date/time.  We'll use it to set the IAT property
* in the code below.

* First load the JSON key into a string.
loFac = CreateObject('Chilkat.FileAccess')
lcJsonKey = loFac.ReadEntireTextFile("qa_data/googleApi/ChilkatTest-ab2ecd52ef98.json","utf-8")
IF (loFac.LastMethodSuccess <> 1) THEN
    ? loFac.LastErrorText
    RELEASE loSocket
    RELEASE loDt
    RELEASE loFac
    CANCEL
ENDIF

* A JSON private key should look like this:

* 	{
* 	  "type": "service_account",
* 	  "project_id": "chilkattest-1350",
* 	  "private_key_id": "fa2e36ee26986eab628b59868af8bec1d1c64c38",
* 	  "private_key": "-----BEGIN PRIVATE KEY-----\nMIIEvgIjFa...28N64N2n1E4FYzBZjSdy\n-----END PRIVATE KEY-----\n",
* 	  "client_email": "598922945226-00rb0ppfg0sndajo6bhvd4v17jtj2d3a@developer.gserviceaccount.com",
* 	  "client_id": "598922945226-00rb0ppfg0snd9jo7bhvd4v17jtj2d3a.apps.googleusercontent.com",
* 	  "auth_uri": "https://accounts.google.com/o/oauth2/auth",
* 	  "token_uri": "https://accounts.google.com/o/oauth2/token",
* 	  "auth_provider_x509_cert_url": "https://www.googleapis.com/oauth2/v1/certs",
* 	  "client_x509_cert_url": "https://www.googleapis.com/robot/v1/metadata/x509/598922945226-00rb0ppfg0sndajo6bhvd4v17jtj2d3a%40developer.gserviceaccount.com"
* 	}

loGAuth = CreateObject('Chilkat.AuthGoogle')
loGAuth.JsonKey = lcJsonKey

* Choose a scope.
loGAuth.Scope = "https://www.googleapis.com/auth/cloud-platform"

* Request an access token that is valid for this many seconds.
loGAuth.ExpireNumSeconds = 3600

* If the application is requesting delegated access:
* The email address of the user for which the application is requesting delegated access,
* then set the email address here. (Otherwise leave it empty.)
loGAuth.SubEmailAddress = ""

* ------------------------------------------------------------------------
* Set the IAT using the date/time from the NIST time server.
lnUnixTime = loDt.GetAsUnixTime(0)
? "unixTime = " + STR(lnUnixTime)
loGAuth.Iat = lnUnixTime

* Connect to www.googleapis.com using TLS (TLS 1.2 is the default.)
* The Chilkat socket object is used so that the connection can be established
* through proxies or an SSH tunnel if desired.
loTlsSock = CreateObject('Chilkat.Socket')
lnSuccess = loTlsSock.Connect("www.googleapis.com",443,1,5000)
IF (lnSuccess <> 1) THEN
    ? loTlsSock.LastErrorText
    RELEASE loSocket
    RELEASE loDt
    RELEASE loFac
    RELEASE loGAuth
    RELEASE loTlsSock
    CANCEL
ENDIF

* Send the request to obtain the access token.
lnSuccess = loGAuth.ObtainAccessToken(loTlsSock)
IF (lnSuccess <> 1) THEN
    ? loGAuth.LastErrorText
    RELEASE loSocket
    RELEASE loDt
    RELEASE loFac
    RELEASE loGAuth
    RELEASE loTlsSock
    CANCEL
ENDIF

* Examine the access token:
? "Access Token: " + loGAuth.AccessToken

RELEASE loSocket
RELEASE loDt
RELEASE loFac
RELEASE loGAuth
RELEASE loTlsSock