Sample code for 30+ languages & platforms
Objective-C

Automatically Refresh Token for 401 Unauthorized

See more Google Calendar Examples

Demonstrates how to automatically refresh an access token (without user interaction) when the token expires and a 401 Unauthorized response is received.

Chilkat Objective-C Downloads

Objective-C
#import <NSString.h>
#import <CkoJsonObject.h>
#import <CkoHttp.h>
#import <CkoOAuth2.h>
#import <CkoStringBuilder.h>

BOOL success = NO;

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

NSString *tokenFilePath = @"qa_data/tokens/googleCalendar.json";

// Get our current access token.
CkoJsonObject *jsonToken = [[CkoJsonObject alloc] init];
success = [jsonToken LoadFile: tokenFilePath];
if ([jsonToken HasMember: @"access_token"] == NO) {
    NSLog(@"%@",@"No access token found.");
    return;
}

CkoHttp *http = [[CkoHttp alloc] init];
http.AuthToken = [jsonToken StringOf: @"access_token"];

NSString *jsonResponse = [http QuickGetStr: @"https://www.googleapis.com/calendar/v3/users/me/calendarList"];
if (http.LastMethodSuccess != YES) {

    if ([http.LastStatus intValue] != 401) {
        NSLog(@"%@",http.LastErrorText);
        NSLog(@"%@",@"----");
        NSLog(@"%@",http.LastResponseBody);
        return;
    }

    // The access token must've expired. 
    // Refresh the access token and then retry the request.
    CkoOAuth2 *oauth2 = [[CkoOAuth2 alloc] init];

    oauth2.TokenEndpoint = @"https://www.googleapis.com/oauth2/v4/token";

    // Replace these with actual values.
    oauth2.ClientId = @"GOOGLE-CLIENT-ID";
    oauth2.ClientSecret = @"GOOGLE-CLIENT-SECRET";

    // Get the "refresh_token"
    oauth2.RefreshToken = [jsonToken StringOf: @"refresh_token"];

    // Send the HTTP POST to refresh the access token..
    success = [oauth2 RefreshAccessToken];
    if (success != YES) {
        NSLog(@"%@",oauth2.LastErrorText);
        return;
    }

    // The response contains a new access token, but we must keep
    // our existing refresh token for when we need to refresh again in the future.
    [jsonToken UpdateString: @"access_token" value: oauth2.AccessToken];

    // Save the new JSON access token response to a file.
    CkoStringBuilder *sbJson = [[CkoStringBuilder alloc] init];
    jsonToken.EmitCompact = NO;
    [jsonToken EmitSb: sbJson];
    [sbJson WriteFile: tokenFilePath charset: @"utf-8" emitBom: NO];

    NSLog(@"%@",@"OAuth2 authorization granted!");
    NSLog(@"%@%@",@"New Access Token = ",oauth2.AccessToken);

    // re-try the original request.
    http.AuthToken = oauth2.AccessToken;
    jsonResponse = [http QuickGetStr: @"https://www.googleapis.com/calendar/v3/users/me/calendarList"];
    if (http.LastMethodSuccess != YES) {
        NSLog(@"%@",http.LastErrorText);
        return;
    }

}

NSLog(@"%@",jsonResponse);
NSLog(@"%@",@"-----------------------------");