Sample code for 30+ languages & platforms
SQL Server Requires Chilkat v11.0.0+

ebay: Add Digital Signature to HTTP Request

See more eBay Examples

Demonstrates how to add a digital signature to an ebay HTTP request.

Chilkat SQL Server Downloads

SQL Server
-- Important: See this note about string length limitations for strings returned by sp_OAMethod calls.
--
CREATE PROCEDURE ChilkatSample
AS
BEGIN
    DECLARE @hr int
    DECLARE @iTmp0 int
    DECLARE @sTmp0 nvarchar(4000)
    DECLARE @success int
    SELECT @success = 0

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

    --  Note: Ebay provides a Key Management API
    --  See https://developer.ebay.com/api-docs/developer/key-management/overview.html

    --  The following test keys can be used: 
    --  
    --  Ed25519 
    --  
    --  Private Key:
    --  
    --  -----BEGIN PRIVATE KEY-----
    --  MC4CAQAwBQYDK2VwBCIEIJ+DYvh6SEqVTm50DFtMDoQikTmiCqirVv9mWG9qfSnF
    --  -----END PRIVATE KEY-----

    DECLARE @strPrivateKey nvarchar(4000)
    SELECT @strPrivateKey = 'MC4CAQAwBQYDK2VwBCIEIJ+DYvh6SEqVTm50DFtMDoQikTmiCqirVv9mWG9qfSnF'

    --  Public Key:
    --  
    --  -----BEGIN PUBLIC KEY-----
    --  MCowBQYDK2VwAyEAJrQLj5P/89iXES9+vFgrIy29clF9CC/oPPsw3c5D0bs=
    --  -----END PUBLIC KEY-----

    DECLARE @strPublicKey nvarchar(4000)
    SELECT @strPublicKey = 'MCowBQYDK2VwAyEAJrQLj5P/89iXES9+vFgrIy29clF9CC/oPPsw3c5D0bs='

    --  This example assumes you got a JWE for your given private key from the Ebay Key Management REST API.
    --  This JWE is just for example:
    DECLARE @strJwe nvarchar(4000)
    SELECT @strJwe = 'eyJ6aXAiOiJERUYiLCJlbmMiOiJBMjU2R0NNIiwidGFnIjoiSXh2dVRMb0FLS0hlS0Zoa3BxQ05CUSIsImFsZyI6IkEyNTZHQ01LVyIsIml2IjoiaFd3YjNoczk2QzEyOTNucCJ9.2o02pR9SoTF4g_5qRXZm6tF4H52TarilIAKxoVUqjd8.3qaF0KJN-rFHHm_P.AMUAe9PPduew09mANIZ-O_68CCuv6EIx096rm9WyLZnYz5N1WFDQ3jP0RBkbaOtQZHImMSPXIHVaB96RWshLuJsUgCKmTAwkPVCZv3zhLxZVxMXtPUuJ-ppVmPIv0NzznWCOU5Kvb9Xux7ZtnlvLXgwOFEix-BaWNomUAazbsrUCbrp514GIea3butbyxXLNi6R9TJUNh8V2uan-optT1MMyS7eMQnVGL5rYBULk.9K5ucUqAu0DqkkhgubsHHw'

    DECLARE @sbBody int
    EXEC @hr = sp_OACreate 'Chilkat.StringBuilder', @sbBody OUT
    IF @hr <> 0
    BEGIN
        PRINT 'Failed to create ActiveX component'
        RETURN
    END

    EXEC sp_OAMethod @sbBody, 'Append', @success OUT, '{"hello": "world"}'


    PRINT 'Body of request:'
    EXEC sp_OAMethod @sbBody, 'GetAsString', @sTmp0 OUT
    PRINT @sTmp0

    --  -------------------------------------------------
    --  Build the signature base string...

    DECLARE @sbSigBase int
    EXEC @hr = sp_OACreate 'Chilkat.StringBuilder', @sbSigBase OUT

    EXEC sp_OAMethod @sbSigBase, 'Append', @success OUT, '"content-digest": sha-256=:'
    EXEC sp_OAMethod @sbBody, 'GetHash', @sTmp0 OUT, 'sha256', 'base64', 'utf-8'
    EXEC sp_OAMethod @sbSigBase, 'Append', @success OUT, @sTmp0
    EXEC sp_OAMethod @sbSigBase, 'Append', @success OUT, ':' + CHAR(10)

    EXEC sp_OAMethod @sbSigBase, 'Append', @success OUT, '"x-ebay-signature-key": '
    EXEC sp_OAMethod @sbSigBase, 'Append', @success OUT, @strJwe
    EXEC sp_OAMethod @sbSigBase, 'Append', @success OUT, CHAR(10)

    EXEC sp_OAMethod @sbSigBase, 'Append', @success OUT, '"@method": POST' + CHAR(10)

    --  This is the path part of the URL without query params...
    EXEC sp_OAMethod @sbSigBase, 'Append', @success OUT, '"@path": '
    EXEC sp_OAMethod @sbSigBase, 'Append', @success OUT, '/verifysignature'
    EXEC sp_OAMethod @sbSigBase, 'Append', @success OUT, CHAR(10)

    --  The is the domain, such as "api.ebay.com" w/ port if the port is something unusual.
    --  In this example, we're testing against a local docker test server (see the info at https://developer.ebay.com/develop/guides/digital-signatures-for-apis)
    --  Normally, I think it would just be "api.ebay.com" instead of "localhost:8080".
    EXEC sp_OAMethod @sbSigBase, 'Append', @success OUT, '"@authority": '
    EXEC sp_OAMethod @sbSigBase, 'Append', @success OUT, 'localhost:8080'
    EXEC sp_OAMethod @sbSigBase, 'Append', @success OUT, CHAR(10)

    EXEC sp_OAMethod @sbSigBase, 'Append', @success OUT, '"@signature-params": '

    DECLARE @sbSigInput int
    EXEC @hr = sp_OACreate 'Chilkat.StringBuilder', @sbSigInput OUT

    EXEC sp_OAMethod @sbSigInput, 'Append', @success OUT, '("content-digest" "x-ebay-signature-key" "@method" "@path" "@authority")'
    EXEC sp_OAMethod @sbSigInput, 'Append', @success OUT, ';created='

    DECLARE @dt int
    EXEC @hr = sp_OACreate 'Chilkat.CkDateTime', @dt OUT

    EXEC sp_OAMethod @dt, 'SetFromCurrentSystemTime', @success OUT
    DECLARE @unixTimeNow nvarchar(4000)
    EXEC sp_OAMethod @dt, 'GetAsUnixTimeStr', @unixTimeNow OUT, 0
    EXEC sp_OAMethod @sbSigInput, 'Append', @success OUT, @unixTimeNow

    EXEC sp_OAMethod @sbSigBase, 'AppendSb', @success OUT, @sbSigInput

    --  -------------------------------------------------
    --  Sign the signature base string using the Ed25519 private key

    DECLARE @bdPrivKey int
    EXEC @hr = sp_OACreate 'Chilkat.BinData', @bdPrivKey OUT

    EXEC sp_OAMethod @bdPrivKey, 'AppendEncoded', @success OUT, @strPrivateKey, 'base64'

    DECLARE @privKey int
    EXEC @hr = sp_OACreate 'Chilkat.PrivateKey', @privKey OUT

    EXEC sp_OAMethod @privKey, 'LoadAnyFormat', @success OUT, @bdPrivKey, ''
    IF @success = 0
      BEGIN
        EXEC sp_OAGetProperty @privKey, 'LastErrorText', @sTmp0 OUT
        PRINT @sTmp0
        EXEC @hr = sp_OADestroy @sbBody
        EXEC @hr = sp_OADestroy @sbSigBase
        EXEC @hr = sp_OADestroy @sbSigInput
        EXEC @hr = sp_OADestroy @dt
        EXEC @hr = sp_OADestroy @bdPrivKey
        EXEC @hr = sp_OADestroy @privKey
        RETURN
      END

    DECLARE @bdToBeSigned int
    EXEC @hr = sp_OACreate 'Chilkat.BinData', @bdToBeSigned OUT

    EXEC sp_OAMethod @bdToBeSigned, 'AppendSb', @success OUT, @sbSigBase, 'utf-8'

    DECLARE @eddsa int
    EXEC @hr = sp_OACreate 'Chilkat.EdDSA', @eddsa OUT

    DECLARE @sigBase64 nvarchar(4000)
    EXEC sp_OAMethod @eddsa, 'SignBdENC', @sigBase64 OUT, @bdToBeSigned, 'base64', @privKey
    EXEC sp_OAGetProperty @eddsa, 'LastMethodSuccess', @iTmp0 OUT
    IF @iTmp0 = 0
      BEGIN
        EXEC sp_OAGetProperty @eddsa, 'LastErrorText', @sTmp0 OUT
        PRINT @sTmp0
        EXEC @hr = sp_OADestroy @sbBody
        EXEC @hr = sp_OADestroy @sbSigBase
        EXEC @hr = sp_OADestroy @sbSigInput
        EXEC @hr = sp_OADestroy @dt
        EXEC @hr = sp_OADestroy @bdPrivKey
        EXEC @hr = sp_OADestroy @privKey
        EXEC @hr = sp_OADestroy @bdToBeSigned
        EXEC @hr = sp_OADestroy @eddsa
        RETURN
      END


    PRINT 'sigBase64:'

    PRINT @sigBase64

    --  ----------------------------------------------------------
    --  Send the JSON POST

    DECLARE @http int
    EXEC @hr = sp_OACreate 'Chilkat.Http', @http OUT

    EXEC sp_OAMethod @http, 'SetRequestHeader', NULL, 'x-ebay-signature-key', @strJwe

    DECLARE @sbContentDigestHdr int
    EXEC @hr = sp_OACreate 'Chilkat.StringBuilder', @sbContentDigestHdr OUT

    EXEC sp_OAMethod @sbContentDigestHdr, 'Append', @success OUT, 'sha-256=:'
    EXEC sp_OAMethod @sbBody, 'GetHash', @sTmp0 OUT, 'sha256', 'base64', 'utf-8'
    EXEC sp_OAMethod @sbContentDigestHdr, 'Append', @success OUT, @sTmp0
    EXEC sp_OAMethod @sbContentDigestHdr, 'Append', @success OUT, ':'
    EXEC sp_OAMethod @sbContentDigestHdr, 'GetAsString', @sTmp0 OUT
    EXEC sp_OAMethod @http, 'SetRequestHeader', NULL, 'Content-Digest', @sTmp0

    DECLARE @sbSigHdr int
    EXEC @hr = sp_OACreate 'Chilkat.StringBuilder', @sbSigHdr OUT

    EXEC sp_OAMethod @sbSigHdr, 'Append', @success OUT, 'sig1=:'
    EXEC sp_OAMethod @sbSigHdr, 'Append', @success OUT, @sigBase64
    EXEC sp_OAMethod @sbSigHdr, 'Append', @success OUT, ':'
    EXEC sp_OAMethod @sbSigHdr, 'GetAsString', @sTmp0 OUT
    EXEC sp_OAMethod @http, 'SetRequestHeader', NULL, 'Signature', @sTmp0

    EXEC sp_OAMethod @sbSigInput, 'Prepend', @success OUT, 'sig1='
    EXEC sp_OAMethod @sbSigInput, 'GetAsString', @sTmp0 OUT
    EXEC sp_OAMethod @http, 'SetRequestHeader', NULL, 'Signature-Input', @sTmp0

    --  Add this header to make eBay actually check the signature.
    EXEC sp_OAMethod @http, 'SetRequestHeader', NULL, 'x-ebay-enforce-signature', 'true'

    --  Set the OAuth2 access token to add the "Authorization: Bearer <access_token>" to the header.
    EXEC sp_OASetProperty @http, 'AuthToken', 'your_oauth2_access_token'

    --  The signature base string constructed above is valid if we send this POST to "http://localhost:8080/verifysignature"
    --  Normally, you'll send your POST to some api.ebay.com endpoint.
    DECLARE @url nvarchar(4000)
    SELECT @url = 'http://localhost:8080/verifysignature'

    DECLARE @jsonStr nvarchar(4000)
    EXEC sp_OAMethod @sbBody, 'GetAsString', @jsonStr OUT
    DECLARE @resp int
    EXEC @hr = sp_OACreate 'Chilkat.HttpResponse', @resp OUT

    EXEC sp_OAMethod @http, 'HttpStr', @success OUT, 'POST', 'http://localhost:8080/verifysignature', @jsonStr, 'utf-8', 'application/json', @resp
    IF @success = 0
      BEGIN
        EXEC sp_OAGetProperty @http, 'LastErrorText', @sTmp0 OUT
        PRINT @sTmp0
        EXEC @hr = sp_OADestroy @sbBody
        EXEC @hr = sp_OADestroy @sbSigBase
        EXEC @hr = sp_OADestroy @sbSigInput
        EXEC @hr = sp_OADestroy @dt
        EXEC @hr = sp_OADestroy @bdPrivKey
        EXEC @hr = sp_OADestroy @privKey
        EXEC @hr = sp_OADestroy @bdToBeSigned
        EXEC @hr = sp_OADestroy @eddsa
        EXEC @hr = sp_OADestroy @http
        EXEC @hr = sp_OADestroy @sbContentDigestHdr
        EXEC @hr = sp_OADestroy @sbSigHdr
        EXEC @hr = sp_OADestroy @resp
        RETURN
      END


    EXEC sp_OAGetProperty @resp, 'StatusCode', @iTmp0 OUT
    PRINT 'Response status code: ' + @iTmp0

    PRINT 'Response body:'
    EXEC sp_OAGetProperty @resp, 'BodyStr', @sTmp0 OUT
    PRINT @sTmp0

    EXEC @hr = sp_OADestroy @sbBody
    EXEC @hr = sp_OADestroy @sbSigBase
    EXEC @hr = sp_OADestroy @sbSigInput
    EXEC @hr = sp_OADestroy @dt
    EXEC @hr = sp_OADestroy @bdPrivKey
    EXEC @hr = sp_OADestroy @privKey
    EXEC @hr = sp_OADestroy @bdToBeSigned
    EXEC @hr = sp_OADestroy @eddsa
    EXEC @hr = sp_OADestroy @http
    EXEC @hr = sp_OADestroy @sbContentDigestHdr
    EXEC @hr = sp_OADestroy @sbSigHdr
    EXEC @hr = sp_OADestroy @resp


END
GO