Sample code for 30+ languages & platforms
Objective-C

PRODA Get OAuth2 Access Token using JWT

See more PRODA Examples

Demonstrates how to get an OAuth2 access token for the PRODA Australian Government Online Services using a JWT.

Chilkat Objective-C Downloads

Objective-C
#import <CkoPrivateKey.h>
#import <CkoJwt.h>
#import <CkoJsonObject.h>
#import <NSString.h>
#import <CkoHttp.h>
#import <CkoHttpRequest.h>
#import <CkoHttpResponse.h>

BOOL success = NO;

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

//  First create a JWT to be sent in the POST to https://vnd.proda.humanservices.gov.au/mga/sps/oauth/oauth20/token

CkoPrivateKey *privKey = [[CkoPrivateKey alloc] init];

//  Load an RSA private key from a PEM file.
//  Chilkat provides alternative methods to load from other formats, or to load from a string or binary data.
success = [privKey LoadEncryptedPemFile: @"qa_data/pem/rsa_passwd.pem" password: @"passwd"];
if (success == NO) {
    NSLog(@"%@",privKey.LastErrorText);
    return;
}

CkoJwt *jwt = [[CkoJwt alloc] init];

//  Build the JOSE header
CkoJsonObject *jose = [[CkoJsonObject alloc] init];
//  Use RS256.  Pass the string "RS384" or "RS512" to use RSA with SHA-384 or SHA-512.
success = [jose AppendString: @"alg" value: @"RS256"];
success = [jose AppendString: @"typ" value: @"JWT"];
success = [jose AppendString: @"kid" value: @"test-device"];

//  Now build the JWT claims (also known as the payload)
CkoJsonObject *claims = [[CkoJsonObject alloc] init];
success = [claims AppendString: @"iss" value: @"9646844092"];
success = [claims AppendString: @"sub" value: @"test-device"];
success = [claims AppendString: @"aud" value: @"https://proda.humanservices.gov.au"];

//  Set the timestamp of when the JWT was created to now.
int curDateTime = [[jwt GenNumericDate: [NSNumber numberWithInt: 0]] intValue];
success = [claims AddIntAt: [NSNumber numberWithInt: -1] name: @"iat" value: [NSNumber numberWithInt: curDateTime]];

//  Set the timestamp defining an expiration time (end time) for the token
//  to be now + 1 hour (3600 seconds)
success = [claims AddIntAt: [NSNumber numberWithInt: -1] name: @"exp" value: [NSNumber numberWithInt: (curDateTime + 3600)]];

//  Produce the smallest possible JWT:
jwt.AutoCompact = YES;

//  Create the JWT token.  This is where the RSA signature is created.
NSString *jwtToken = [jwt CreateJwtPk: [jose Emit] payload: [claims Emit] key: privKey];

//  ---------------------------------------------------------------------
//  Build and send the POST, which should look something like this:

//  POST https://vnd.proda.humanservices.gov.au/mga/sps/oauth/oauth20/token HTTP/1.1
//  Content-Type: application/x-www-form-urlencoded
//  Content-Length: 666
//  Host: vnd.proda.humanservices.gov.au
//  
//  grant_type=urn%3Aietf%3Aparams%3Aoauth%3Agrant-type%3Ajwt-bearer&assertion=<jwt>&client_id=VendorClient03

CkoHttp *http = [[CkoHttp alloc] init];

CkoHttpRequest *req = [[CkoHttpRequest alloc] init];
req.HttpVerb = @"POST";
req.ContentType = @"application/x-www-form-urlencoded";

//  Add the request params.
[req AddParam: @"grant_type" value: @"urn:ietf:params:oauth:grant-type:jwt-bearer"];
[req AddParam: @"assertion" value: jwtToken];
[req AddParam: @"client_id" value: @"VendorClient03"];

CkoHttpResponse *resp = [[CkoHttpResponse alloc] init];
success = [http HttpReq: @"https://vnd.proda.humanservices.gov.au/mga/sps/oauth/oauth20/token" request: req response: resp];
if (success == NO) {
    NSLog(@"%@",http.LastErrorText);
    return;
}

NSLog(@"%@%d",@"Response status code = ",[resp.StatusCode intValue]);
NSLog(@"%@",@"Response body:");
NSLog(@"%@",resp.BodyStr);