Skip to content

Commit ae8be61

Browse files
author
sachin-maheshwari
authored
Merge pull request #99 from topcoder-platform/dev
iframe refresh through lib
2 parents 804c7ed + 1cf4b67 commit ae8be61

File tree

2 files changed

+116
-30
lines changed

2 files changed

+116
-30
lines changed

src/connector-wrapper.js

Lines changed: 31 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -1,32 +1,32 @@
1-
const {createFrame} = require('./iframe')
2-
const {getToken} = require ('./token')
1+
const { createFrame } = require('./iframe')
2+
const { getToken, isTokenExpired } = require('./token')
33

44
let iframe = null
55
let loading = null
66
let url = ''
77
let mock = false
88
let token = ''
99

10-
export function configureConnector({connectorUrl, frameId, mockMode, mockToken}) {
10+
export function configureConnector({ connectorUrl, frameId, mockMode, mockToken }) {
1111
if (mockMode) {
1212
mock = true
1313
token = mockToken
1414
} else if (iframe) {
1515
console.warn('tc-accounts connector can only be configured once, this request has been ignored.')
1616
} else {
1717
iframe = createFrame(frameId, connectorUrl)
18-
url = connectorUrl
19-
20-
loading = new Promise( (resolve) => {
21-
iframe.onload = function() {
18+
url = connectorUrl
19+
20+
loading = new Promise((resolve) => {
21+
iframe.onload = function () {
2222
loading = null
2323
resolve()
2424
}
2525
})
2626
}
2727
}
2828

29-
const proxyCall = function() {
29+
const proxyCall = function () {
3030
if (mock) {
3131
throw new Error('connector is running in mock mode. This method (proxyCall) should not be invoked.')
3232
}
@@ -36,26 +36,33 @@ const proxyCall = function() {
3636
}
3737

3838
function request() {
39-
/*return new Promise( (resolve, reject) => {
40-
function receiveMessage(e) {
41-
const safeFormat = e.data.type === SUCCESS || e.data.type === FAILURE
39+
const token = getToken('v3jwt')
40+
// 65 is offset in seconds, before expiry
41+
if (token && !isTokenExpired(token, 65)) {
42+
return new Promise((resolve, reject) => {
43+
token ? resolve({ token: token }) : reject("v3jwt cookie not found")
44+
})
45+
} else {
46+
return new Promise((resolve, reject) => {
47+
function receiveMessage(e) {
48+
const safeFormat = e.data.type === "SUCCESS" || e.data.type === "FAILURE"
4249
if (safeFormat) {
43-
window.removeEventListener('message', receiveMessage)
44-
if (e.data.type === SUCCESS) resolve(e.data)
45-
if (e.data.type === FAILURE) reject(e.error)
50+
window.removeEventListener('message', receiveMessage)
51+
if (e.data.type === "SUCCESS") {
52+
token ? resolve({ token: token }) : reject("v3jwt cookie not found")
53+
} else {
54+
reject("unable to get refesh token")
55+
}
4656
}
47-
}
57+
}
4858

49-
window.addEventListener('message', receiveMessage)
59+
window.addEventListener('message', receiveMessage)
5060

51-
const payload = Object.assign({}, { type: REQUEST }, params)
61+
const payload = { type: "REFRESH_TOKEN" }
5262

53-
iframe.contentWindow.postMessage(payload, url)
54-
}) */
55-
return new Promise((resolve, reject) => {
56-
const token = getToken('v3jwt')
57-
token ? resolve({ token: token }) : reject("v3jwt cookie not found")
58-
})
63+
iframe.contentWindow.postMessage(payload, url)
64+
})
65+
}
5966
}
6067

6168
if (loading) {
@@ -75,7 +82,7 @@ export function getFreshToken() {
7582
}
7683

7784
return proxyCall()
78-
.then( data => data.token )
85+
.then(data => data.token)
7986
}
8087

8188

web-assets/js/setupAuth0WithRedirect.js

Lines changed: 85 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -69,7 +69,10 @@ const authSetup = function () {
6969
? 'localstorage'
7070
: 'memory',
7171
useRefreshTokens: useRefreshTokens
72-
}).then(_init);
72+
}).then(_init).catch(function (e) {
73+
logger("Error occurred in initializing auth0 object: ", e);
74+
window.location.reload();
75+
});
7376
window.addEventListener("message", receiveMessage, false);
7477
};
7578

@@ -90,8 +93,8 @@ const authSetup = function () {
9093
} else if (!isLoggedIn() && returnAppUrl) {
9194
login();
9295
} else if (qs['error'] && qs['state']) {
93-
logger("Error in executing callback(): ", qs['error_description']);
94-
showLoginError(qs['error_description'], appUrl);
96+
logger("Error in executing callback(): ", qs['error_description']);
97+
showLoginError(qs['error_description'], appUrl);
9598
} else {
9699
logger("User already logged in", true);
97100
postLogin();
@@ -218,7 +221,7 @@ const authSetup = function () {
218221
}
219222

220223
const isLoggedIn = function () {
221-
var token = getCookie(tcJWTCookie);
224+
var token = getCookie(v3JWTCookie);
222225
return token ? !isTokenExpired(token) : false;
223226
};
224227

@@ -410,8 +413,8 @@ const authSetup = function () {
410413
}
411414

412415
/**
413-
* will receive message from iframe
414-
*/
416+
* will receive message from iframe
417+
*/
415418
function receiveMessage(e) {
416419
logger("received Event:", e);
417420
if (e.data && e.data.type && e.origin) {
@@ -420,7 +423,83 @@ const authSetup = function () {
420423
logout();
421424
}
422425
}
426+
if (e.data && e.data.type && e.data.type === "REFRESH_TOKEN") {
427+
const token = getCookie(v3JWTCookie);
428+
const failed = {
429+
type: "FAILURE"
430+
};
431+
const success = {
432+
type: "SUCCESS"
433+
};
434+
435+
const informIt = function (payload) {
436+
e.source.postMessage(payload, e.origin);
437+
}
438+
try {
439+
const storeRefreshedToken = function (aObj) {
440+
aObj.getIdTokenClaims().then(function (claims) {
441+
idToken = claims.__raw;
442+
let userActive = false;
443+
Object.keys(claims).findIndex(function (key) {
444+
if (key.includes('active')) {
445+
userActive = claims[key];
446+
return true;
447+
}
448+
return false;
449+
});
450+
if (userActive) {
451+
let tcsso = '';
452+
Object.keys(claims).findIndex(function (key) {
453+
if (key.includes(tcSSOCookie)) {
454+
tcsso = claims[key];
455+
return true;
456+
}
457+
return false;
458+
});
459+
logger('Storing refreshed token...', true);
460+
setCookie(tcJWTCookie, idToken, cookieExpireIn);
461+
setCookie(v3JWTCookie, idToken, cookieExpireIn);
462+
setCookie(tcSSOCookie, tcsso, cookieExpireIn);
463+
informIt(success);
464+
} else {
465+
logger("Refeshed token - user active ? ", userActive);
466+
informIt(failed);
467+
}
468+
}).catch(function (err) {
469+
logger("Refeshed token - error in fetching token from auth0: ", err);
470+
informIt(failed);
471+
});
472+
};
473+
474+
const getToken = function (aObj) {
475+
aObj.getTokenSilently({ timeoutInSeconds: 60 }).then(function (token) {
476+
storeRefreshedToken(aObj);
477+
}).catch(function (err) {
478+
logger("receiveMessage: Error in refreshing token through iframe:", err)
479+
informIt(failed);
480+
});
423481

482+
};
483+
484+
// main execution start here
485+
if (token && !isTokenExpired(token)) {
486+
informIt(success);
487+
} else if (!token) {
488+
informIt(failed);
489+
} else {
490+
if (auth0) {
491+
getToken(auth0);
492+
} else {
493+
informIt(failed);
494+
}
495+
}
496+
} catch (e) {
497+
logger("error occured in iframe handler:", e.message);
498+
informIt(failed);
499+
}
500+
} else {
501+
// do nothing
502+
}
424503
}
425504

426505
function changeWindowMessage() {

0 commit comments

Comments
 (0)