diff --git a/src/connector-wrapper.js b/src/connector-wrapper.js index c25b26e..6622a04 100644 --- a/src/connector-wrapper.js +++ b/src/connector-wrapper.js @@ -1,5 +1,5 @@ -const {createFrame} = require('./iframe') -const {getToken} = require ('./token') +const { createFrame } = require('./iframe') +const { getToken, isTokenExpired } = require('./token') let iframe = null let loading = null @@ -7,7 +7,7 @@ let url = '' let mock = false let token = '' -export function configureConnector({connectorUrl, frameId, mockMode, mockToken}) { +export function configureConnector({ connectorUrl, frameId, mockMode, mockToken }) { if (mockMode) { mock = true token = mockToken @@ -15,10 +15,10 @@ export function configureConnector({connectorUrl, frameId, mockMode, mockToken}) console.warn('tc-accounts connector can only be configured once, this request has been ignored.') } else { iframe = createFrame(frameId, connectorUrl) - url = connectorUrl - - loading = new Promise( (resolve) => { - iframe.onload = function() { + url = connectorUrl + + loading = new Promise((resolve) => { + iframe.onload = function () { loading = null resolve() } @@ -26,7 +26,7 @@ export function configureConnector({connectorUrl, frameId, mockMode, mockToken}) } } -const proxyCall = function() { +const proxyCall = function () { if (mock) { throw new Error('connector is running in mock mode. This method (proxyCall) should not be invoked.') } @@ -36,26 +36,33 @@ const proxyCall = function() { } function request() { - /*return new Promise( (resolve, reject) => { - function receiveMessage(e) { - const safeFormat = e.data.type === SUCCESS || e.data.type === FAILURE + const token = getToken('v3jwt') + // 65 is offset in seconds, before expiry + if (token && !isTokenExpired(token, 65)) { + return new Promise((resolve, reject) => { + token ? resolve({ token: token }) : reject("v3jwt cookie not found") + }) + } else { + return new Promise((resolve, reject) => { + function receiveMessage(e) { + const safeFormat = e.data.type === "SUCCESS" || e.data.type === "FAILURE" if (safeFormat) { - window.removeEventListener('message', receiveMessage) - if (e.data.type === SUCCESS) resolve(e.data) - if (e.data.type === FAILURE) reject(e.error) + window.removeEventListener('message', receiveMessage) + if (e.data.type === "SUCCESS") { + token ? resolve({ token: token }) : reject("v3jwt cookie not found") + } else { + reject("unable to get refesh token") + } } - } + } - window.addEventListener('message', receiveMessage) + window.addEventListener('message', receiveMessage) - const payload = Object.assign({}, { type: REQUEST }, params) + const payload = { type: "REFRESH_TOKEN" } - iframe.contentWindow.postMessage(payload, url) - }) */ - return new Promise((resolve, reject) => { - const token = getToken('v3jwt') - token ? resolve({ token: token }) : reject("v3jwt cookie not found") - }) + iframe.contentWindow.postMessage(payload, url) + }) + } } if (loading) { @@ -75,7 +82,7 @@ export function getFreshToken() { } return proxyCall() - .then( data => data.token ) + .then(data => data.token) } diff --git a/web-assets/js/setupAuth0WithRedirect.js b/web-assets/js/setupAuth0WithRedirect.js index c82235d..6606fdd 100644 --- a/web-assets/js/setupAuth0WithRedirect.js +++ b/web-assets/js/setupAuth0WithRedirect.js @@ -69,7 +69,10 @@ const authSetup = function () { ? 'localstorage' : 'memory', useRefreshTokens: useRefreshTokens - }).then(_init); + }).then(_init).catch(function (e) { + logger("Error occurred in initializing auth0 object: ", e); + window.location.reload(); + }); window.addEventListener("message", receiveMessage, false); }; @@ -90,8 +93,8 @@ const authSetup = function () { } else if (!isLoggedIn() && returnAppUrl) { login(); } else if (qs['error'] && qs['state']) { - logger("Error in executing callback(): ", qs['error_description']); - showLoginError(qs['error_description'], appUrl); + logger("Error in executing callback(): ", qs['error_description']); + showLoginError(qs['error_description'], appUrl); } else { logger("User already logged in", true); postLogin(); @@ -218,7 +221,7 @@ const authSetup = function () { } const isLoggedIn = function () { - var token = getCookie(tcJWTCookie); + var token = getCookie(v3JWTCookie); return token ? !isTokenExpired(token) : false; }; @@ -410,8 +413,8 @@ const authSetup = function () { } /** - * will receive message from iframe - */ + * will receive message from iframe + */ function receiveMessage(e) { logger("received Event:", e); if (e.data && e.data.type && e.origin) { @@ -420,7 +423,83 @@ const authSetup = function () { logout(); } } + if (e.data.type === "REFRESH_TOKEN") { + const token = getCookie(v3JWTCookie); + const failed = { + type: "FAILURE" + }; + const success = { + type: "SUCCESS" + }; + + const informIt = function (payload) { + e.source.postMessage(payload, e.origin); + } + try { + const storeRefreshedToken = function (aObj) { + aObj.getIdTokenClaims().then(function (claims) { + idToken = claims.__raw; + let userActive = false; + Object.keys(claims).findIndex(function (key) { + if (key.includes('active')) { + userActive = claims[key]; + return true; + } + return false; + }); + if (userActive) { + let tcsso = ''; + Object.keys(claims).findIndex(function (key) { + if (key.includes(tcSSOCookie)) { + tcsso = claims[key]; + return true; + } + return false; + }); + logger('Storing refreshed token...', true); + setCookie(tcJWTCookie, idToken, cookieExpireIn); + setCookie(v3JWTCookie, idToken, cookieExpireIn); + setCookie(tcSSOCookie, tcsso, cookieExpireIn); + informIt(success); + } else { + logger("Refeshed token - user active ? ", userActive); + informIt(failed); + } + }).catch(function (err) { + logger("Refeshed token - error in fetching token from auth0: ", err); + informIt(failed); + }); + }; + + const getToken = function (aObj) { + aObj.getTokenSilently({ timeoutInSeconds: 60 }).then(function (token) { + storeRefreshedToken(aObj); + }).catch(function (err) { + logger("receiveMessage: Error in refreshing token through iframe:", err) + informIt(failed); + }); + }; + + // main execution start here + if (token && !isTokenExpired(token)) { + informIt(success); + } else if (!token) { + informIt(failed); + } else { + if (auth0) { + getToken(auth0); + } else { + informIt(failed); + } + } + } catch (e) { + logger("error occured in iframe handler:", e.message); + informIt(failed); + } + } else { + // do nothing + } } function changeWindowMessage() {