Objective-C
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
#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(@"%@",@"-----------------------------");