|
|
(JavaScript) POP3 Auto-Refresh Office365 Access Token
Demonstrates how to automatically recover from an expired OAuth2 access token when OAuth2 authentication fails in the POP3 protocol. If the server responds with "-ERR Authentication failure: unknown user name or bad password.", then we refresh the access token and retry.
var success = false;
// This example requires the Chilkat API to have been previously unlocked.
// See Global Unlock Sample for sample code.
var mailman = new CkMailMan();
mailman.MailHost = "outlook.office365.com";
mailman.MailPort = 995;
mailman.PopSsl = true;
// Use your O365 email address here.
mailman.PopUsername = "OFFICE365_EMAIL_ADDRESS";
// When using OAuth2 authentication, leave the password empty.
mailman.PopPassword = "";
// Load our previously obtained OAuth2 access token.
var jsonToken = new CkJsonObject();
success = jsonToken.LoadFile("qa_data/tokens/office365.json");
if (success == false) {
console.log(jsonToken.LastErrorText);
return;
}
mailman.OAuth2AccessToken = jsonToken.StringOf("access_token");
// Make the TLS connection to the outlook.office365.com POP3 server.
success = mailman.Pop3Connect();
if (success !== true) {
console.log(mailman.LastErrorText);
return;
}
// Authenticate using XOAUTH2
success = mailman.Pop3Authenticate();
if (success !== true) {
// If we're still connected to the mail server, then it means the server sent a non-success response,
// Such as: -ERR Authentication failure: unknown user name or bad password.
if (mailman.IsPop3Connected == true) {
// Refresh the OAuth2 access token, and if successful, save the new (refreshed) access token and try authenticating again.
var oauth2 = new CkOAuth2();
// Use your actual Directory (tenant) ID instead of "112d7ed6-71bf-4eba-a866-738364321bfc"
oauth2.TokenEndpoint = "https://login.microsoftonline.com/112d7ed6-71bf-4eba-a866-738364321bfc/oauth2/v2.0/token";
// Replace these with your Azure App Registration's actual values.
oauth2.ClientId = "CLIENT_ID";
oauth2.ClientSecret = "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 !== true) {
console.log(oauth2.LastErrorText);
return;
}
console.log("New access token: " + oauth2.AccessToken);
console.log("New refresh token: " + oauth2.RefreshToken);
// Update the JSON with the new tokens.
jsonToken.UpdateString("access_token",oauth2.AccessToken);
jsonToken.UpdateString("refresh_token",oauth2.RefreshToken);
// Save the new JSON access token response to a file.
var sbJson = new CkStringBuilder();
jsonToken.EmitCompact = false;
jsonToken.EmitSb(sbJson);
sbJson.WriteFile("qa_data/tokens/office365.json","utf-8",false);
console.log("New Access Token = " + oauth2.AccessToken);
// Update the mailman with the new access token.
mailman.OAuth2AccessToken = oauth2.AccessToken;
// Retry the authentication.
success = mailman.Pop3Authenticate();
if (success == false) {
console.log(mailman.LastErrorText);
return;
}
}
else {
console.log(mailman.LastErrorText);
return;
}
}
// Find out how many emails are on the server..
var numEmails = mailman.CheckMail();
if (numEmails < 0) {
console.log(mailman.LastErrorText);
return;
}
// Examine the POP3 session log:
console.log(mailman.Pop3SessionLog);
// The POP3 session log will look something like this:
// **** Connected to outlook.office365.com:995
// < +OK The Microsoft Exchange POP3 service is ready. [QwBIADIAUABSADEANgBDAEEAMAAwADEAMgAuAG4AYQBtAHAAcgBkADEANgAuAHAAcgBvAGQALgBvAHUAdABsAG8AbwBrAC4AYwBvAG0A]
// > AUTH XOAUTH2
// < +
// > <base64 string in XOAUTH2 format>
// < -ERR Authentication failure: unknown user name or bad password.
// > AUTH XOAUTH2
// < +
// > <base64 string in XOAUTH2 format>
// < +OK User successfully authenticated.
// > STAT
// < +OK 248 46637086
// End the POP3 session and close the connection to the GMail server.
success = mailman.Pop3EndSession();
if (success !== true) {
console.log(mailman.LastErrorText);
return;
}
console.log("Finished.");
|