React Native Requires Chilkat v11.5.0+
React Native
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
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.');
}