![]() |
Chilkat HOME Android™ AutoIt C C# C++ Chilkat2-Python CkPython Classic ASP DataFlex Delphi DLL Go Java Node.js Objective-C PHP Extension Perl PowerBuilder PowerShell PureBasic Ruby SQL Server Swift Tcl Unicode C Unicode C++ VB.NET VBScript Visual Basic 6.0 Visual FoxPro Xojo Plugin
(Visual FoxPro) Xero API through an SSH TunnelThis example demonstrates connecting through an SSH Tunnel w/ 2-legged OAuth for a Xero private application. Note: This example requires Chilkat v11.0.0 or greater.
LOCAL lnSuccess LOCAL loTunnel LOCAL lcSshHostname LOCAL lnSshPort LOCAL loRest LOCAL lnBTls LOCAL lnPort LOCAL lnMaxWaitMs LOCAL loChannel LOCAL lcConsumerKey LOCAL lcConsumerSecret LOCAL loPfx LOCAL loPrivKeyFromPfx LOCAL loPrivKeyFromPem LOCAL loOauth1 LOCAL loSbXml LOCAL lnBAutoTrim LOCAL loXml LOCAL lnRecordCount LOCAL i lnSuccess = 0 loTunnel = CreateObject('Chilkat.Socket') lcSshHostname = "sftp.example.com" lnSshPort = 22 * Connect to an SSH server and establish the SSH tunnel: lnSuccess = loTunnel.SshOpenTunnel(lcSshHostname,lnSshPort) IF (lnSuccess = 0) THEN ? loTunnel.LastErrorText RELEASE loTunnel CANCEL ENDIF * Authenticate with the SSH server via a login/password * or with a public key. * This example demonstrates SSH password authentication. lnSuccess = loTunnel.SshAuthenticatePw("mySshLogin","mySshPassword") IF (lnSuccess = 0) THEN ? loTunnel.LastErrorText RELEASE loTunnel CANCEL ENDIF * OK, the SSH tunnel is setup. Now open a channel within the tunnel. * (Any number of channels may be created from the same SSH tunnel. * Multiple channels may coexist at the same time.) * This sample code would typically be placed in a subroutine or function * where the rest object is passed by reference. * It does the OAuth1 setup and makes the initial connection. loRest = CreateObject('Chilkat.Rest') lnBTls = 1 lnPort = 443 lnMaxWaitMs = 7000 * This returns a socket object that is a single channel within the SSH tunnel. loChannel = CreateObject('Chilkat.Socket') lnSuccess = loTunnel.SshNewChannel("api.xero.com",lnPort,lnBTls,lnMaxWaitMs,loChannel) IF (lnSuccess = 0) THEN ? loTunnel.LastErrorText RELEASE loTunnel RELEASE loRest RELEASE loChannel CANCEL ENDIF * Use the connection. (This connection is a TLS running on an SSH channel through an SSH tunnel. * In other words, TLS is wrapped within the SSH tunnel.) lnSuccess = loRest.UseConnection(loChannel,1) IF (lnSuccess <> 1) THEN ? loRest.LastErrorText RELEASE loTunnel RELEASE loRest RELEASE loChannel CANCEL ENDIF * OK, we're connected. * ----------------------------------------------------------------- * Now setup the OAuth1 authenticator.. lcConsumerKey = "XERO_PRIVATE_APP_KEY" lcConsumerSecret = "XERO_PRIVATE_APP_SECRET" * Let's get our private key from our PFX (password protected), or the PEM (unprotected). * You can decide which to use. Either is OK, although I would recommend keeping your * private keys in a PFX and not in an unprotected PEM. loPfx = CreateObject('Chilkat.Pfx') lnSuccess = loPfx.LoadPfxFile("qa_data/certs/xero_private_app/public_privatekey.pfx","PFX_PASSWORD") IF (lnSuccess = 0) THEN ? loPfx.LastErrorText RELEASE loTunnel RELEASE loRest RELEASE loChannel RELEASE loPfx CANCEL ENDIF loPrivKeyFromPfx = CreateObject('Chilkat.PrivateKey') lnSuccess = loPfx.PrivateKeyAt(0,loPrivKeyFromPfx) IF (lnSuccess = 0) THEN ? loPfx.LastErrorText RELEASE loTunnel RELEASE loRest RELEASE loChannel RELEASE loPfx RELEASE loPrivKeyFromPfx CANCEL ENDIF * Or we can load from a PEM.. loPrivKeyFromPem = CreateObject('Chilkat.PrivateKey') lnSuccess = loPrivKeyFromPem.LoadPemFile("qa_data/certs/xero_private_app/privatekey.pem") IF (lnSuccess = 0) THEN ? loPrivKeyFromPem.LastErrorText RELEASE loTunnel RELEASE loRest RELEASE loChannel RELEASE loPfx RELEASE loPrivKeyFromPfx RELEASE loPrivKeyFromPem CANCEL ENDIF * Note: There are many other means for loading a private key, including * from other formats and directly from memory (i.e. not file-based). loOauth1 = CreateObject('Chilkat.OAuth1') loOauth1.ConsumerKey = lcConsumerKey loOauth1.ConsumerSecret = lcConsumerSecret loOauth1.Token = lcConsumerKey loOauth1.TokenSecret = lcConsumerSecret loOauth1.SignatureMethod = "RSA-SHA1" loOauth1.SetRsaKey(loPrivKeyFromPfx) * Install the OAuth1 authenticator. loRest.SetAuthOAuth1(loOauth1,0) ? "OK, the Xero OAuth1 is initialized and the REST object is ready to make REST API calls.." * ----------------------------------------------------------------- * Make a call to verify that OAuth1 through an HTTP proxy works.. * Get the full list of contacts. loSbXml = CreateObject('Chilkat.StringBuilder') lnSuccess = loRest.FullRequestNoBodySb("GET","/api.xro/2.0/Contacts",loSbXml) IF (lnSuccess = 0) THEN ? loRest.LastErrorText RELEASE loTunnel RELEASE loRest RELEASE loChannel RELEASE loPfx RELEASE loPrivKeyFromPfx RELEASE loPrivKeyFromPem RELEASE loOauth1 RELEASE loSbXml CANCEL ENDIF * A 200 response is expected for actual success. IF (loRest.ResponseStatusCode <> 200) THEN ? loSbXml.GetAsString() RELEASE loTunnel RELEASE loRest RELEASE loChannel RELEASE loPfx RELEASE loPrivKeyFromPfx RELEASE loPrivKeyFromPem RELEASE loOauth1 RELEASE loSbXml CANCEL ENDIF * Iterate over the contacts.. lnBAutoTrim = 0 loXml = CreateObject('Chilkat.Xml') loXml.LoadSb(loSbXml,lnBAutoTrim) loXml.SaveXml("qa_cache/xero_contacts.xml") * How many records exist? lnRecordCount = loXml.NumChildrenAt("Contacts") ? "numRecords = " + STR(lnRecordCount) i = 0 DO WHILE i < lnRecordCount loXml.I = i ? "ContactID: " + loXml.GetChildContent("Contacts|Contact[i]|ContactID") i = i + 1 ENDDO RELEASE loTunnel RELEASE loRest RELEASE loChannel RELEASE loPfx RELEASE loPrivKeyFromPfx RELEASE loPrivKeyFromPem RELEASE loOauth1 RELEASE loSbXml RELEASE loXml |
© 2000-2025 Chilkat Software, Inc. All Rights Reserved.