Xbase++ Requires Chilkat v11.0.0+
Xbase++
Validate a Google ID Token
See more OAuth2 Examples
Demonstrates how to verify the signature of a Google id token.Chilkat Xbase++ Downloads
LOCAL nSuccess
LOCAL oHttp
LOCAL cJwkStr
LOCAL oJson
LOCAL oJsonToken
LOCAL oSbIdToken
LOCAL cSig_b64Url
LOCAL cHeaderPlusPayload
LOCAL oRsa
LOCAL oJsonKey
LOCAL oPubKey
LOCAL nNumKeys
LOCAL i
LOCAL nBVerified
nSuccess := 0
// This example requires the Chilkat API to have been previously unlocked.
// See Global Unlock Sample for sample code.
oHttp := CreateObject("Chilkat.Http")
// First get the public key we'll be needing..
cJwkStr := oHttp:QuickGetStr("https://www.googleapis.com/oauth2/v3/certs")
IF (oHttp:LastMethodSuccess == 0)
? oHttp:LastErrorText
oHttp:destroy()
RETURN
ENDIF
// We have the following:
// {
// "keys": [
// {
// "kid": "e8732db06287515556213b80acbcfd08cfb302a9",
// "n": "4RIrO30287Wsq3gqXCMkUYMVAeI3H8...w2mbMNEBQ",
// "kty": "RSA",
// "e": "AQAB",
// "alg": "RS256",
// "use": "sig"
// },
// {
// "kid": "8462a71da4f6d611fc0fecf0fc4ba9c37d65e6cd",
// "e": "AQAB",
// "n": "xT_ngLZNmT5GBtJZeTB...Ft4gK0eoFi0d3l8bcw",
// "alg": "RS256",
// "use": "sig",
// "kty": "RSA"
// }
// ]
// }
oJson := CreateObject("Chilkat.JsonObject")
nSuccess := oJson:Load(cJwkStr)
// -------------------------------------------------
// Load the following..
// {
// "access_token": "ya29.a0...0f",
// "expires_in": 3599,
// "scope": "openid https://www.googleapis.com/auth/userinfo.email",
// "token_type": "Bearer",
// "id_token": "eyJhb...o5nQ"
// }
oJsonToken := CreateObject("Chilkat.JsonObject")
nSuccess := oJsonToken:LoadFile("qa_data/tokens/google_sample_id_token.json")
IF (nSuccess == 0)
? "Failed to load the JSON file..."
oHttp:destroy()
oJson:destroy()
oJsonToken:destroy()
RETURN
ENDIF
// Get the id_token;
oSbIdToken := CreateObject("Chilkat.StringBuilder")
nSuccess := oSbIdToken:Append(oJsonToken:StringOf("id_token"))
// Get the signature in base64url format.
// The header + payload remains in sbIdToken.
cSig_b64Url := oSbIdToken:GetAfterFinal(".", 1)
cHeaderPlusPayload := oSbIdToken:GetAsString()
? cSig_b64Url
? cHeaderPlusPayload
// ---------------------------------------------
// Try validating with each cert's public key.
// Hopefully one will be the key that verifies.
oRsa := CreateObject("Chilkat.Rsa")
oRsa:EncodingMode := "base64url"
oJsonKey := CreateObject("Chilkat.JsonObject")
oPubKey := CreateObject("Chilkat.PublicKey")
nNumKeys := oJson:SizeOfArray("keys")
i := 0
DO WHILE i < nNumKeys
oJson:I := i
oJson:ObjectOf2("keys[i]", oJsonKey)
nSuccess := oPubKey:LoadFromString(oJsonKey:Emit())
IF (nSuccess == 0)
? oPubKey:LastErrorText
oHttp:destroy()
oJson:destroy()
oJsonToken:destroy()
oSbIdToken:destroy()
oRsa:destroy()
oJsonKey:destroy()
oPubKey:destroy()
RETURN
ENDIF
? Str(i)
? oPubKey:GetPem(1)
nSuccess := oRsa:UsePublicKey(oPubKey)
nBVerified := oRsa:VerifyStringENC(cHeaderPlusPayload, "sha256", cSig_b64Url)
? "bVerified = " + Str(nBVerified)
i := i + 1
ENDDO
// The output is:
// 0
// -----BEGIN RSA PUBLIC KEY-----
// MIIBCgKCAQEA4RIrO30287Wsq3gqXCMkUYMVAeI3H8LVE6IXR1krdFeGnZLiGUPw
// cbkeVpXf3lmJdsStOg+jijces2DZCfPyIBiQuLYfxxmAZE6ErJ0QJFg1stwli2Pz
// 9ncYhFoqi8pXr7kEzEJBTzX4thuw56ydbGsshSEznPXoerCJOc7UI2+n0wFCWQ4Y
// LHbh/PrWt4vdadyUUUW/QpQHXQLdD8q/Qwqdj0O9zlJE7R6Elw2E9EqnHyIGu1hm
// LxhqrTru1M18SUhONYbVskV/BCEdVKs//X96849HorWQDCAgVMWfGsdMVq55FAdJ
// 680N5UmQDRynIZ4+PeNGN4S9iw2mbMNEBQIDAQAB
// -----END RSA PUBLIC KEY-----
//
// bVerified = True
// 1
// -----BEGIN RSA PUBLIC KEY-----
// MIIBCgKCAQEAxT/ngLZNmT5GBdkLtJZjNeTB+8B5yWgrq/e5eMZ1hrZhcmLK+dSn
// IkpOPV8/OekV67EnQ7I4II2rcNJnHGrGKZziXO3XN2gtUHE+mBJC99oULSbX/QwB
// Kz7gC/IBPq9EuxTt6Oq6fPkVQ9DbRIgWJSEGBF/KRaNl3kyAlIZfpY7XgHyJTTv8
// E7yAcYKPR+36gzdl+ps0sDLKzUuAtZNq8llK0u80z6AtAUIYwWdkEhM9upy6keKI
// TasIxcsO7M6kZPINUSbh6t5VAm8FuqRmxpgg+9c9/GQSGd89InVypoVzWLQ+wOGg
// 5G4H6JqIgtj0TRFt4gK0eoFi2U0d3l8bcwIDAQAB
// -----END RSA PUBLIC KEY-----
//
// bVerified = False
oHttp:destroy()
oJson:destroy()
oJsonToken:destroy()
oSbIdToken:destroy()
oRsa:destroy()
oJsonKey:destroy()
oPubKey:destroy()