C
C
Refresh Expiring OAuth2 Access Token for Azure Registered App
See more OAuth2 Examples
Shows how to renew an Azure App's access token using the refresh token when it's near expiration.Chilkat C Downloads
#include <C_CkJsonObject.h>
#include <C_CkDateTime.h>
#include <C_CkOAuth2.h>
#include <C_CkFileAccess.h>
void ChilkatSample(void)
{
BOOL success;
HCkJsonObject json;
HCkDateTime dtExpire;
HCkOAuth2 oauth2;
HCkFileAccess fac;
success = FALSE;
// We previously obtained an access token and saved the JSON to a file using this example:
// Get OAuth2 Access Token for Azure Registered App
// This example will examine the JSON and expiration date, and if near expiration will
// refresh the access token.
json = CkJsonObject_Create();
success = CkJsonObject_LoadFile(json,"qa_data/tokens/_myAzureApp.json");
if (success != TRUE) {
printf("Failed to load the access token.\n");
CkJsonObject_Dispose(json);
return;
}
// The contents of the JSON look like this:
// {
// "token_type": "Bearer",
// "scope": "User.Read Mail.ReadWrite Mail.Send",
// "expires_in": 3600,
// "ext_expires_in": 0,
// "access_token": "EwBAA8l6B...",
// "refresh_token": "MCRMdbe6Cd...",
// "id_token": "eyJ0eXAiOiJ...",
// "expires_on": "1494112119"
// }
// The "expires_on" value is a Unix time.
dtExpire = CkDateTime_Create();
CkDateTime_SetFromUnixTime(dtExpire,FALSE,CkJsonObject_IntOf(json,"expires_on"));
// If this date/time expires within 10 minutes of the current system time, refresh the token.
if (CkDateTime_ExpiresWithin(dtExpire,10,"minutes") != TRUE) {
printf("No need to refresh, the access token won't expire within the next 10 minutes.\n");
CkJsonObject_Dispose(json);
CkDateTime_Dispose(dtExpire);
return;
}
// OK, we need to refresh the access token..
oauth2 = CkOAuth2_Create();
// Note: The endpoint depends on the Azure App Registration.
// See How to Choose the Correct Endpoints for your Azure App Registration
CkOAuth2_putTokenEndpoint(oauth2,"https://login.microsoftonline.com/common/oauth2/v2.0/token");
// Use your client ID.
CkOAuth2_putClientId(oauth2,"CLIENT_ID");
// Get the existing refresh token.
CkOAuth2_putRefreshToken(oauth2,CkJsonObject_stringOf(json,"refresh_token"));
// Send the HTTP POST to refresh the access token.
success = CkOAuth2_RefreshAccessToken(oauth2);
if (success == FALSE) {
printf("%s\n",CkOAuth2_lastErrorText(oauth2));
CkJsonObject_Dispose(json);
CkDateTime_Dispose(dtExpire);
CkOAuth2_Dispose(oauth2);
return;
}
printf("OAuth2 authorization granted!\n");
printf("Access Token = %s\n",CkOAuth2_accessToken(oauth2));
// Get the full JSON response:
CkJsonObject_Load(json,CkOAuth2_accessTokenResponse(oauth2));
CkJsonObject_putEmitCompact(json,FALSE);
// If an "expires_on" member does not exist, then add the JSON member by
// getting the current system date/time and adding the "expires_in" seconds.
// This way we'll know when the token expires.
if (CkJsonObject_HasMember(json,"expires_on") != TRUE) {
CkDateTime_SetFromCurrentSystemTime(dtExpire);
CkDateTime_AddSeconds(dtExpire,CkJsonObject_IntOf(json,"expires_in"));
CkJsonObject_AppendString(json,"expires_on",CkDateTime_getAsUnixTimeStr(dtExpire,FALSE));
}
printf("%s\n",CkJsonObject_emit(json));
// Save the new access token JSON to a file for future requests.
fac = CkFileAccess_Create();
CkFileAccess_WriteEntireTextFile(fac,"qa_data/tokens/_myAzureApp.json",CkJsonObject_emit(json),"utf-8",FALSE);
CkJsonObject_Dispose(json);
CkDateTime_Dispose(dtExpire);
CkOAuth2_Dispose(oauth2);
CkFileAccess_Dispose(fac);
}