From 4533dd72ae4f34c223be76cd0ca25f24fc93e815 Mon Sep 17 00:00:00 2001 From: Kyle Spearrin Date: Sat, 28 Apr 2018 22:43:33 -0400 Subject: [PATCH] reuse access token --- src/services/azure-directory.service.ts | 31 +++++++++++++++++++++++++ 1 file changed, 31 insertions(+) diff --git a/src/services/azure-directory.service.ts b/src/services/azure-directory.service.ts index 553a3e17..dc9bf299 100644 --- a/src/services/azure-directory.service.ts +++ b/src/services/azure-directory.service.ts @@ -21,6 +21,8 @@ export class AzureDirectoryService implements DirectoryService { private client: graph.Client; private dirConfig: AzureConfiguration; private syncConfig: SyncConfiguration; + private accessToken: string; + private accessTokenExpiration: Date; constructor(private configurationService: ConfigurationService) { this.init(); @@ -290,6 +292,13 @@ export class AzureDirectoryService implements DirectoryService { private init() { this.client = graph.Client.init({ authProvider: (done) => { + if (!this.accessTokenIsExpired()) { + done(null, this.accessToken); + } + + this.accessToken = null; + this.accessTokenExpiration = null; + const data = querystring.stringify({ client_id: this.dirConfig.applicationId, client_secret: this.dirConfig.key, @@ -310,6 +319,7 @@ export class AzureDirectoryService implements DirectoryService { res.on('data', (chunk: string) => { const d = JSON.parse(chunk); if (res.statusCode === 200 && d.access_token != null) { + this.setAccessTokenExpiration(d.access_token, d.expires_in); done(null, d.access_token); } else if (d.error != null && d.error_description != null) { done(d.error + ' (' + res.statusCode + '): ' + d.error_description, null); @@ -326,4 +336,25 @@ export class AzureDirectoryService implements DirectoryService { }, }); } + + private accessTokenIsExpired() { + if (this.accessToken == null || this.accessTokenExpiration == null) { + return true; + } + + // expired if less than 2 minutes til expiration + const now = new Date(); + return this.accessTokenExpiration.getTime() - now.getTime() < 120000; + } + + private setAccessTokenExpiration(accessToken: string, expSeconds: number) { + if (accessToken == null || expSeconds == null) { + return; + } + + this.accessToken = accessToken; + const exp = new Date(); + exp.setSeconds(exp.getSeconds() + expSeconds); + this.accessTokenExpiration = exp; + } }