Sample code for 30+ languages & platforms
React Native Requires Chilkat v11.5.0+

Box: Get a Service Account Token with JWT

See more Box Examples

Use the encrypted private key in a Box application configuration file to sign a short-lived assertion and exchange it for an access token. Configure and authorize a JWT Server app first. The enterprise subject obtains the service-account token.

See the Box API guide for setup and the complete workflow.

Chilkat React Native Downloads

React Native
import { HttpCurl, JsonObject, Jwt, PrivateKey, Prng } from '@chilkat/react-native'

async function chilkatExample() {
  let success = false;

  // Requires Chilkat 11.5.0 or later and a previously unlocked Chilkat bundle.
  // See Global Unlock Sample.
  // Guide: Box API Guide.

  success = false;

  const config = new JsonObject();
  try {
    config.loadFile('qa_data/tokens/box_jwt_config.json');
  } catch {
    console.log(config.lastErrorText);
    return;
  }

  const key = new PrivateKey();
  try {
    key.loadEncryptedPem(config.stringOf('boxAppSettings.appAuth.privateKey'), config.stringOf('boxAppSettings.appAuth.passphrase'));
  } catch {
    console.log(key.lastErrorText);
    return;
  }

  const header = new JsonObject();
  header.updateString('alg', 'RS256');
  header.updateString('typ', 'JWT');
  header.updateString('kid', config.stringOf('boxAppSettings.appAuth.publicKeyID'));
  const jwt = new Jwt();
  const prng = new Prng();
  let nonce: string;
  try {
    nonce = prng.genRandom(32, 'hex');
  } catch {
    console.log(prng.lastErrorText);
    return;
  }

  const claims = new JsonObject();
  claims.updateString('iss', config.stringOf('boxAppSettings.clientID'));
  claims.updateString('sub', config.stringOf('enterpriseID'));
  claims.updateString('box_sub_type', 'enterprise');
  claims.updateString('aud', 'https://api.box.com/oauth2/token');
  claims.updateString('jti', nonce);
  claims.updateInt('exp', jwt.genNumericDate(45));
  let assertion: string;
  try {
    assertion = jwt.createJwtPk(header.emit(), claims.emit(), key);
  } catch {
    console.log(jwt.lastErrorText);
    return;
  }

  const curl = new HttpCurl();
  curl.setVar('client_id', config.stringOf('boxAppSettings.clientID'));
  curl.setVar('client_secret', config.stringOf('boxAppSettings.clientSecret'));
  curl.setVar('assertion', assertion);
  curl.clearTargetOutput('*');
  curl.clearVar('access_token');
  curl.addTargetOutput('access_token', 'access_token');
  success = true;
  try {
    await curl.doYourThingAsync('curl -X POST "https://api.box.com/oauth2/token" --data-urlencode "grant_type=urn:ietf:params:oauth:grant-type:jwt-bearer" --data-urlencode "client_id={{client_id}}" --data-urlencode "client_secret={{client_secret}}" --data-urlencode "assertion={{assertion}}"');
  } catch {
    success = false;
  }
  if ((!success) || (curl.statusCode !== 200)) {
    console.log(`Box request failed. HTTP status: ${curl.statusCode}`);
    console.log(`Failure reason: ${curl.failReason}`);
    return;
  }

  if (!curl.varDefined('!')) {
    console.log('Expected response fields are missing.');
    return;
  }

  // Reuse the token in this HttpCurl instance. JWT tokens are renewed by making
  // a new assertion/token request, not by using a refresh token.
  console.log('JWT access token obtained.');
}