Chilkat • HOME • Android™ • Classic ASP • C • C++ • C# • Mono C# • .NET Core C# • C# UWP/WinRT • DataFlex • Delphi ActiveX • Delphi DLL • Visual FoxPro • Java • Lianja • MFC • Objective-C • Perl • PHP ActiveX • PHP Extension • PowerBuilder • PowerShell • PureBasic • CkPython • Chilkat2-Python • Ruby • SQL Server • Swift 2 • Swift 3,4,5... • Tcl • Unicode C • Unicode C++ • Visual Basic 6.0 • VB.NET • VB.NET UWP/WinRT • VBScript • Xojo Plugin • Node.js • Excel • Go
(Excel) ING Open Banking OAuth2 Client CredentialsDemonstrates how to get an access token for the ING Open Banking APIs using client credentials. For more information, see https://developer.ing.com/openbanking/get-started/openbanking
' This example requires the Chilkat API to have been previously unlocked. ' See Global Unlock Sample for sample code. Dim cert As Chilkat.Cert Set cert = Chilkat.NewCert success = cert.LoadFromFile("qa_data/certs_and_keys/ING/example_client_tls.cer") If (success = False) Then Debug.Print cert.LastErrorText Exit Sub End If Dim bdPrivKey As Chilkat.BinData Set bdPrivKey = Chilkat.NewBinData success = bdPrivKey.LoadFile("qa_data/certs_and_keys/ING/example_client_tls.key") If (success = False) Then Debug.Print "Failed to load example_client_tls.key" Exit Sub End If ' The OAuth 2.0 client_id for these certificates is e77d776b-90af-4684-bebc-521e5b2614dd. ' Please note down this client_id since you will need it in the next steps to call the API. Dim privKey As Chilkat.PrivateKey Set privKey = Chilkat.NewPrivateKey success = privKey.LoadAnyFormat(bdPrivKey,"") If (success = False) Then Debug.Print privKey.LastErrorText Exit Sub End If ' Associate the private key with the certificate. success = cert.SetPrivateKey(privKey) If (success = False) Then Debug.Print cert.LastErrorText Exit Sub End If Dim http As Chilkat.Http Set http = Chilkat.NewHttp success = http.SetSslClientCert(cert) If (success = False) Then Debug.Print http.LastErrorText Exit Sub End If ' Calculate the Digest and add the "Digest" header. Do the equivalent of this: ' payload="grant_type=client_credentials" ' payloadDigest=`echo -n "$payload" | openssl dgst -binary -sha256 | openssl base64` ' digest=SHA-256=$payloadDigest Dim crypt As Chilkat.Crypt2 Set crypt = Chilkat.NewCrypt2 crypt.HashAlgorithm = "SHA256" crypt.EncodingMode = "base64" payload = "grant_type=client_credentials" payloadDigest = crypt.HashStringENC(payload) ' Calculate the current date/time and add the Date header. ' reqDate=$(LC_TIME=en_US.UTF-8 date -u "+%a, %d %b %Y %H:%M:%S GMT") Dim dt As Chilkat.CkDateTime Set dt = Chilkat.NewCkDateTime Dim success As Boolean success = dt.SetFromCurrentSystemTime() ' The desire date/time format is the "RFC822" format. http.SetRequestHeader "Date",dt.GetAsRfc822(False) ' Calculate signature for signing your request ' Duplicate the following code: ' httpMethod="post" ' reqPath="/oauth2/token" ' signingString="(request-target): $httpMethod $reqPath ' date: $reqDate ' digest: $digest" ' signature=`printf "$signingString" | openssl dgst -sha256 -sign "${certPath}example_client_signing.key" -passin "pass:changeit" | openssl base64 -A` httpMethod = "POST" reqPath = "/oauth2/token" Dim sbStringToSign As Chilkat.StringBuilder Set sbStringToSign = Chilkat.NewStringBuilder success = sbStringToSign.Append("(request-target): ") success = sbStringToSign.Append(httpMethod) success = sbStringToSign.ToLowercase() success = sbStringToSign.Append(" ") success = sbStringToSign.AppendLine(reqPath,False) success = sbStringToSign.Append("date: ") success = sbStringToSign.AppendLine(dt.GetAsRfc822(False),False) success = sbStringToSign.Append("digest: SHA-256=") success = sbStringToSign.Append(payloadDigest) Dim signingPrivKey As Chilkat.PrivateKey Set signingPrivKey = Chilkat.NewPrivateKey success = signingPrivKey.LoadPemFile("qa_data/certs_and_keys/ING/example_client_signing.key") If (success = False) Then Debug.Print signingPrivKey.LastErrorText Exit Sub End If Dim rsa As Chilkat.Rsa Set rsa = Chilkat.NewRsa success = rsa.ImportPrivateKeyObj(signingPrivKey) If (success = False) Then Debug.Print rsa.LastErrorText Exit Sub End If rsa.EncodingMode = "base64" b64Signature = rsa.SignStringENC(sbStringToSign.GetAsString(),"SHA256") Dim sbAuthHdrVal As Chilkat.StringBuilder Set sbAuthHdrVal = Chilkat.NewStringBuilder success = sbAuthHdrVal.Append("Signature keyId=""e77d776b-90af-4684-bebc-521e5b2614dd"",") success = sbAuthHdrVal.Append("algorithm=""rsa-sha256"",") success = sbAuthHdrVal.Append("headers=""(request-target) date digest"",") success = sbAuthHdrVal.Append("signature=""") success = sbAuthHdrVal.Append(b64Signature) success = sbAuthHdrVal.Append("""") Dim sbDigestHdrVal As Chilkat.StringBuilder Set sbDigestHdrVal = Chilkat.NewStringBuilder success = sbDigestHdrVal.Append("SHA-256=") success = sbDigestHdrVal.Append(payloadDigest) ' Do the following CURL statement: ' curl -i -X POST "${httpHost}${reqPath}" \ ' -H 'Accept: application/json' \ ' -H 'Content-Type: application/x-www-form-urlencoded' \ ' -H "Digest: ${digest}" \ ' -H "Date: ${reqDate}" \ ' -H "authorization: Signature keyId=\"$keyId\",algorithm=\"rsa-sha256\",headers=\"(request-target) date digest\",signature=\"$signature\"" \ ' -d "${payload}" \ ' --cert "${certPath}tlsCert.crt" \ ' --key "${certPath}tlsCert.key" Dim req As Chilkat.HttpRequest Set req = Chilkat.NewHttpRequest req.AddParam "grant_type","client_credentials" req.AddHeader "Accept","application/json" req.AddHeader "Date",dt.GetAsRfc822(False) req.AddHeader "Digest",sbDigestHdrVal.GetAsString() req.AddHeader "Authorization",sbAuthHdrVal.GetAsString() Set resp = http.PostUrlEncoded("https://api.sandbox.ing.com/oauth2/token",req) If (http.LastMethodSuccess = False) Then Debug.Print http.LastErrorText Exit Sub End If ' If successful, the status code = 200 Debug.Print "Response Status Code: "; resp.StatusCode Debug.Print resp.BodyStr Dim json As Chilkat.JsonObject Set json = Chilkat.NewJsonObject success = json.Load(resp.BodyStr) json.EmitCompact = False Debug.Print json.Emit() ' A successful response contains an access token such as: ' { ' "access_token": "eyJhbGc ... bxI_SoPOBH9xmoM", ' "expires_in": 905, ' "scope": "payment-requests:view payment-requests:create payment-requests:close greetings:view virtual-ledger-accounts:fund-reservation:create virtual-ledger-accounts:fund-reservation:delete virtual-ledger-accounts:balance:view", ' "token_type": "Bearer", ' "keys": [ ' { ' "kty": "RSA", ' "n": "3l3rdz4...04VPkdV", ' "e": "AQAB", ' "use": "sig", ' "alg": "RS256", ' "x5t": "3c396700fc8cd709cf9cb5452a22bcde76985851" ' } ' ], ' "client_id": "e77d776b-90af-4684-bebc-521e5b2614dd" ' } ' Use this online tool to generate parsing code from sample JSON: ' Generate Parsing Code from JSON access_token = json.StringOf("access_token") expires_in = json.IntOf("expires_in") scope = json.StringOf("scope") token_type = json.StringOf("token_type") client_id = json.StringOf("client_id") i = 0 count_i = json.SizeOfArray("keys") Do While i < count_i json.I = i kty = json.StringOf("keys[i].kty") n = json.StringOf("keys[i].n") e = json.StringOf("keys[i].e") use = json.StringOf("keys[i].use") alg = json.StringOf("keys[i].alg") x5t = json.StringOf("keys[i].x5t") i = i + 1 Loop ' This example will save the JSON containing the access key to a file so that ' a subsequent example can load it and then use the access key for a request, such as to create a payment request. success = json.WriteFile("qa_data/tokens/ing_access_token.json") |
© 2000-2022 Chilkat Software, Inc. All Rights Reserved.