This topic provides information about authenticating REST API requests with JSON
Web Token (JWT) authentication.
For code that you can use to authenticate REST API requests, see the SDK for your
language:
For information about generating JWT authentication P12 and PKCS12 keys, see
Create a P12 Certificate for JSON Web Token Authentication.
For information about converting P12 or PKCS12 keys, see Convert P12 or PKCS12 to Another KeyStore Type.




Field Name | Description | Example |
---|---|---|
JWT
Token | With All three components JWT header ,
claim set , and Signature ,
concatenate the components into a valid JWT
authorization token.JWT token = JWT header.Claim
set.signature Combine the header and payload and signature
with periods (.) separating them. | Example: JWT Token = base64url( JWT header ) + “.” +
base64url( Payload ) + “.” + base64url( Signature
) // Sample JWT header eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9 // Sample PayLoad eyJ1c2VySWQiOiJiMDhmODZhZi0zNWRhLTQ4ZjItOGZhYi1jZWYz
OTA0NjYwYmQifQ // Sample signature -xN_h82PHVTCMA9vdoHrcZxH-x5mb11y1537t3rGzcM // Sample JWT Token eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1c2VySWQiOiJiMDhm
ODZhZi0zNWRhLTQ4ZjItOGZhYi1jZWYzOTA0NjYwYmQifQ.-xN_h82PHVTCMA9vdoHrcZxH-x5mb11y1537t3rGzcM |
Field Name | Description | Example |
---|---|---|
x5c | The x5c (X.509 certificate chain) Header
Parameter contains the X.509 public key
certificate or certificate chain corresponding to
the key(.p12) used to digitally sign the
token.This is a required field. | MIICZTCCAc6gAwIBAg…Emj0F35Ew2ek4VezUXnZ/SMLvWEA6DG2sjSFCCuIot3mLJ3lI4AQSQSBSazhQec75Rk= |
alg | The signing algorithm used. This is a required field. | alg:
RS256 |
v-c-merchant-id | Merchant ID assigned in the Business
Center. Required for merchant transactions. Required for partners sending transactions of
behalf of merchants. | v-c-merchant-id:
merchant_id |
Field Name | Description | Example |
---|---|---|
iat | The date and time of message origin. The date
can be in any format for a time zone. Date formatting as defined by
RFC7231: http://tools.ietf.org/html/rfc7231#section-7.1.1.1
This is a required field. |
|
Digest | Digest of JSON payload. The digest is
Base64-encoded. The digest field should not be passed in
the JWT Header for a GET call. | example_payload:
SHA256_hash_of_example_payload = 2b4fee10da8c5e1feaad32b014021e079fe4afcf06af223004af944011a7cb65c # The hash has Base64 encoded Digest header in
RFC3230 defined format
of "Digest: BASE64(SHA256_hash_of_example_payload)“
= tP7hDajF4f6q0ysBQCHgef5K/PBq8iMASvlEARp8tl=Digest:
tP7hDajF4f6q0ysBQCHgef5K/PBq8iMASvlEARp8tl= Code Snippet:
|
digestAlgorithm | The signature algorithm you are using. For
asymmetric keys, use a SHA-256 hash. The digestAlgorithm field should not be
passed in the JWT Header for a GET call. |
|
Field Name | Description | Example |
---|---|---|
JWT
Signature | The JWT header and the claim set created in
previous steps is Base64-encoded. Join the
resulting encoded strings together with a period
(.) in between them. In our pseudo code, this
joined string is assigned to data. To get the JWT signature, the data string
is signed with RS256 with the private key using
the signing algorithm specified in the JWT header.
Signature String is then encoded with
Base64-encoded before creating final token. | data = base64urlEncode( JWT header ) + “.” +
base64urlEncode( Claimset ) signature = RS256Hash( data, private_key )
; signature =
eyJ2LWMtbWVyY2hhbn…WYQNLMOApxv6-DdcJZK4L9mLRc3gFb1kTFvodNEI6M0GeyoFp-b9PNG32TLQITYfWmZEbTZExgQHXGwwqo |
Format/Example |
---|
Encoding and hashing
digest:
Preparing
payload:
|
Generating JWT Token—Header, Payload,
and
Signature:
|
Convert P12 or PKCS12 to Another KeyStore
Type
Use the Java API to convert the PKCS12 file into
another keystore type. Use the Bouncy Castle JCE cryptography
provider to do the conversion. Bouncy Castle JCE understands the
multi certificate PKCS12 format.
The following code snippet
uses the Bouncy Castle JCE API to access and convert the
PKCS12.
private static X509Certificate initializeCertificate(MerchantConfig merchantConfig) throws CertificateException, NoSuchAlgorithmException, IOException, KeyStoreException, UnrecoverableEntryException, ConfigException { if(merchantConfig != null && merchantConfig.getKeyAlias() != null && merchantConfig.getKeyFile() != null) { KeyStore merchantKeyStore = KeyStore.getInstance("PKCS12", new BouncyCastleProvider()); merchantKeyStore.load(new FileInputStream(merchantConfig.getKeyFile()), merchantConfig.getKeyPassword().toCharArray()); String merchantKeyAlias = null; Enumeration enumKeyStore = merchantKeyStore.aliases(); while(enumKeyStore.hasMoreElements()) { merchantKeyAlias = (String)enumKeyStore.nextElement(); if(merchantKeyAlias.contains(merchantConfig.getKeyAlias())) { break; } } PrivateKeyEntry keyEntry = (PrivateKeyEntry)merchantKeyStore.getEntry(merchantKeyAlias, new PasswordProtection(merchantConfig.getKeyPassword().toCharArray())); return (X509Certificate)keyEntry.getCertificate(); } else { throw new ConfigException("merchant config fields missing: key alias, key file"); } } private static RSAPrivateKey initializePrivateKey(MerchantConfig merchantConfig) throws CertificateException, NoSuchAlgorithmException, IOException, KeyStoreException, UnrecoverableEntryException, ConfigException { if(merchantConfig != null && merchantConfig.getKeyAlias() != null && merchantConfig.getKeyFile() != null) { KeyStore merchantKeyStore = KeyStore.getInstance("PKCS12", new BouncyCastleProvider()); merchantKeyStore.load(new FileInputStream(merchantConfig.getKeyFile()), merchantConfig.getKeyPassword().toCharArray()); String merchantKeyAlias = null; Enumeration enumKeyStore = merchantKeyStore.aliases(); while(enumKeyStore.hasMoreElements()) { merchantKeyAlias = (String)enumKeyStore.nextElement(); if(merchantKeyAlias.contains(merchantConfig.getKeyAlias())) { break; } } PrivateKeyEntry keyEntry = (PrivateKeyEntry)merchantKeyStore.getEntry(merchantKeyAlias, new PasswordProtection(merchantConfig.getKeyPassword().toCharArray())); return (RSAPrivateKey)keyEntry.getPrivateKey(); } else { throw new ConfigException("merchant config fields missing: key alias, key file"); } }