Skip to content

Commit 25241e2

Browse files
Emit "expired" events when autoRefresh is disabled (#37)
Resolves: OKTA-97005
1 parent 71aaf7f commit 25241e2

File tree

4 files changed

+51
-14
lines changed

4 files changed

+51
-14
lines changed

lib/TokenManager.js

+16-11
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,10 @@ var cookieStorage = {
1414
}
1515
};
1616

17+
function emitExpired(tokenMgmtRef, key, token) {
18+
tokenMgmtRef.emitter.emit('expired', key, token);
19+
}
20+
1721
function clearRefreshTimeout(tokenMgmtRef, key) {
1822
clearTimeout(tokenMgmtRef.refreshTimeouts[key]);
1923
delete tokenMgmtRef.refreshTimeouts[key];
@@ -37,7 +41,12 @@ function setRefreshTimeout(sdk, tokenMgmtRef, storage, key, token) {
3741
refreshWait = 0;
3842
}
3943
var refreshTimeout = setTimeout(function() {
40-
return refresh(sdk, tokenMgmtRef, storage, key);
44+
if (tokenMgmtRef.autoRefresh) {
45+
return refresh(sdk, tokenMgmtRef, storage, key);
46+
} else if (token.expiresAt * 1000 < Date.now()) {
47+
remove(tokenMgmtRef, storage, key);
48+
emitExpired(tokenMgmtRef, key, token);
49+
}
4150
}, refreshWait);
4251

4352
// Clear any existing timeout
@@ -62,11 +71,7 @@ function setRefreshTimeoutAll(sdk, tokenMgmtRef, storage) {
6271
continue;
6372
}
6473
var token = tokenStorage[key];
65-
if (tokenMgmtRef.autoRefresh) {
66-
setRefreshTimeout(sdk, tokenMgmtRef, storage, key, token);
67-
} else if (token.expiresAt * 1000 < Date.now()) {
68-
tokenMgmtRef.emitter.emit('expired', key, token);
69-
}
74+
setRefreshTimeout(sdk, tokenMgmtRef, storage, key, token);
7075
}
7176
}
7277

@@ -80,9 +85,7 @@ function add(sdk, tokenMgmtRef, storage, key, token) {
8085
}
8186
tokenStorage[key] = token;
8287
storage.setTokenStorage(tokenStorage);
83-
if (tokenMgmtRef.autoRefresh) {
84-
setRefreshTimeout(sdk, tokenMgmtRef, storage, key, token);
85-
}
88+
setRefreshTimeout(sdk, tokenMgmtRef, storage, key, token);
8689
}
8790

8891
function get(storage, key) {
@@ -137,8 +140,8 @@ function refresh(sdk, tokenMgmtRef, storage, key) {
137140
})
138141
.fail(function(err) {
139142
if (err.name === 'OAuthError') {
140-
tokenMgmtRef.emitter.emit('expired', key, token);
141143
remove(tokenMgmtRef, storage, key);
144+
emitExpired(tokenMgmtRef, key, token);
142145
}
143146
refreshDeferred.reject(err);
144147
})
@@ -169,7 +172,9 @@ function clear(tokenMgmtRef, storage) {
169172
function TokenManager(sdk, options) {
170173
options = options || {};
171174
options.storage = options.storage || 'localStorage';
172-
options.autoRefresh = options.autoRefresh || true;
175+
if (!options.autoRefresh && options.autoRefresh !== false) {
176+
options.autoRefresh = true;
177+
}
173178

174179
var storage;
175180
switch(options.storage) {

test/spec/tokenManager.js

+29-1
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,8 @@ define(function(require) {
1111
clientId: 'NPSfOkH5eZrTy8PMDlvx',
1212
redirectUri: 'https://auth-js-test.okta.com/redirect',
1313
tokenManager: {
14-
storage: options.type
14+
storage: options.type,
15+
autoRefresh: options.autoRefresh
1516
}
1617
});
1718
}
@@ -349,6 +350,33 @@ define(function(require) {
349350
})
350351
.fin(done);
351352
});
353+
354+
it('emits "expired" on existing tokens even when autoRefresh is disabled', function(done) {
355+
util.warpToUnixTime(tokens.standardIdTokenClaims.iat);
356+
localStorage.setItem('okta-token-storage', JSON.stringify({
357+
'test-idToken': tokens.standardIdTokenParsed
358+
}));
359+
var client = setupSync({ autoRefresh: false });
360+
client.tokenManager.on('expired', function(key, token) {
361+
expect(key).toEqual('test-idToken');
362+
expect(token).toEqual(tokens.standardIdTokenParsed);
363+
expect(client.tokenManager.get('test-idToken')).toBeUndefined();
364+
done();
365+
});
366+
util.warpByTicksToUnixTime(tokens.standardIdTokenParsed.expiresAt + 1);
367+
});
368+
369+
it('emits "expired" on new tokens even when autoRefresh is disabled', function(done) {
370+
util.warpToUnixTime(tokens.standardIdTokenClaims.iat);
371+
var client = setupSync({ autoRefresh: false });
372+
client.tokenManager.add('test-idToken', tokens.standardIdTokenParsed);
373+
client.tokenManager.on('expired', function(key, token) {
374+
expect(key).toEqual('test-idToken');
375+
expect(token).toEqual(tokens.standardIdTokenParsed);
376+
done();
377+
});
378+
util.warpByTicksToUnixTime(tokens.standardIdTokenParsed.expiresAt + 1);
379+
});
352380
});
353381

354382
describe('localStorage', function() {

test/util/oauthUtil.js

+1-2
Original file line numberDiff line numberDiff line change
@@ -133,8 +133,7 @@ define(function(require) {
133133
}
134134

135135
if (opts.fastForwardToTime) {
136-
var ticks = (opts.fastForwardToTime * 1000) - Date.now();
137-
jasmine.clock().tick(ticks);
136+
util.warpByTicksToUnixTime(opts.fastForwardToTime);
138137
}
139138

140139
return promise

test/util/util.js

+5
Original file line numberDiff line numberDiff line change
@@ -281,6 +281,11 @@ define(function(require) {
281281
jasmine.clock().mockDate(new Date());
282282
};
283283

284+
util.warpByTicksToUnixTime = function (unixTime) {
285+
var ticks = (unixTime * 1000) - Date.now();
286+
jasmine.clock().tick(ticks);
287+
};
288+
284289
util.parseUri = function (uri) {
285290
var split = uri.split('?');
286291
return {

0 commit comments

Comments
 (0)