Skip to content

Commit 3ee01e7

Browse files
committed
When refreshing an access_token fails do not create authorization request
Related to: #231
1 parent 5f05443 commit 3ee01e7

File tree

3 files changed

+91
-116
lines changed

3 files changed

+91
-116
lines changed

app/lib/auth/controller.js

+18-52
Original file line numberDiff line numberDiff line change
@@ -238,25 +238,15 @@ module.exports = function(env, clientConfig) {
238238
var idpConfig = getIdPByProviderUrl(oidcProvider);
239239
}
240240

241-
oidc.signin(idpConfig).then((authorization) => {
242-
if(authorization === true) {
243-
logger.error('can not accept new authorization after refresh access_token', {
241+
oidc.refreshAccessToken(idpConfig).then(() => {
242+
verifyAuthentication().then(resolve).catch((error) => {
243+
logger.error('failed refresh access_token', {
244244
category: 'auth',
245+
error: error
245246
});
246247

247-
reject()
248-
} else {
249-
verifyAuthentication().then(() => {
250-
resolve();
251-
}).catch((error) => {
252-
logger.error('failed refresh access_token', {
253-
category: 'auth',
254-
error: error
255-
});
256-
257-
reject(error)
258-
});
259-
}
248+
reject(error);
249+
});
260250
}).catch(reject);
261251
});
262252
}
@@ -322,26 +312,17 @@ module.exports = function(env, clientConfig) {
322312
});
323313
}
324314

315+
//TODO pixtron - iss-168 unify verifyNewLogin and verifyAuthentication
316+
//TODO pixtron - we can remove these? clientConfig.set('oidcProvider', undefined);
325317
function oidcAuth(idpConfig) {
326318
return new Promise(function(resolve, reject) {
327-
oidc.signin(idpConfig).then((authorization) => {
328-
if(authorization === true) {
329-
verifyNewLogin().then(resolve).catch((error) => {
330-
clientConfig.set('oidcProvider', undefined);
331-
logger.error('failed to authorize via oidc', {category: 'auth', error});
332-
333-
reject(error)
334-
});
335-
} else {
336-
verifyAuthentication().then(() => {
337-
resolve(false);
338-
}).catch((error) => {
339-
clientConfig.set('oidcProvider', undefined);
340-
logger.error('failed signin via oidc', {category: 'auth', error});
319+
oidc.signin(idpConfig).then(() => {
320+
verifyNewLogin().then(resolve).catch((error) => {
321+
clientConfig.set('oidcProvider', undefined);
322+
logger.error('failed to authorize via oidc', {category: 'auth', error});
341323

342-
reject(error)
343-
});
344-
}
324+
reject(error)
325+
});
345326
}).catch(reject);
346327
});
347328
}
@@ -382,29 +363,14 @@ module.exports = function(env, clientConfig) {
382363
return reject(err);
383364
}
384365

385-
switch(clientConfig.get('authMethod')) {
366+
var authMethod = clientConfig.get('authMethod');
367+
switch(authMethod) {
386368
case 'oidc':
387-
var oidcProvider = clientConfig.get('oidcProvider');
388-
389-
if(oidcProvider === undefined) {
390-
logger.info('login no oidc provider, open startup configuration', {category: 'auth'});
391-
startup().then(resolve).catch(reject);
392-
} else {
393-
var idpConfig = getIdPByProviderUrl(oidcProvider);
394-
oidcAuth(idpConfig).then(resolve).catch((err) => {
395-
logger.info('oidc login failed, open startup configuration', {
396-
category: 'auth',
397-
error: err
398-
});
399-
400-
startup().then(resolve).catch(reject);
401-
});
402-
}
403-
break;
404369
case 'token':
405370
refreshAccessToken().then(resolve).catch((error) => {
406-
logger.info('token login failed, open startup configuration', {
371+
logger.info('login failed, open startup configuration', {
407372
category: 'auth',
373+
authMethod: authMethod,
408374
error: err
409375
});
410376

app/lib/oidc/controller.js

+72-63
Original file line numberDiff line numberDiff line change
@@ -29,17 +29,7 @@ module.exports = function (env, clientConfig) {
2929
_signin(idp)
3030
.then(result => resolve(result))
3131
.catch(err => {
32-
if(err.message &&
33-
(
34-
/ENOTFOUND|ETIMEDOUT|ENETUNREACH|EHOSTUNREACH|ECONNREFUSED|EHOSTDOWN|ESOCKETTIMEDOUT|ECONNRESET/.test(err.message)
35-
||
36-
err.message === 'Error: socket hang up'
37-
)
38-
) {
39-
err = new OidcError(err.message, 'E_BLN_OIDC_NETWORK');
40-
}
41-
42-
reject(err);
32+
reject(_checkForNetworkErrors(err));
4333
})
4434
});
4535
}
@@ -50,60 +40,15 @@ module.exports = function (env, clientConfig) {
5040
fetchServiceConfiguration().then(config => {
5141
configuration = config;
5242
initIdp();
53-
var oidcAuth = clientConfig.get('oidcProvider');
54-
55-
if(oidcAuth) {
56-
clientConfig.retrieveSecret('refreshToken').then((secret) => {
57-
logger.info('found refreshToken, trying to request new access token', {
58-
category: 'openid-connect'
59-
});
60-
61-
makeAccessTokenRequest(configuration, secret).then((response) => {
62-
_storeSecrets(response)
63-
.then(() => {
64-
clientConfig.set('accessTokenExpires', response.issuedAt + response.expiresIn);
65-
resolve();
66-
})
67-
.catch(err => {
68-
logger.error('Could not store accessToken', {catgory: 'openid-connect', err});
69-
reject(err);
70-
});
71-
}).catch((error) => {
72-
logger.info('failed to retrieve accessToken, request new refreshToken', {category: 'openid-connect', error});
73-
74-
makeAuthorizationRequest()
75-
.then(() => {
76-
resolve(true);
77-
})
78-
.catch((error) => {
79-
logger.error('failed to retrieve refreshToken', {
80-
category: 'openid-connect',
81-
error: error
82-
});
83-
84-
reject(error);
85-
});
86-
});
87-
}).catch((error) => {
88-
logger.error('failed to read refreshToken from secret store', {
89-
category: 'openid-connect',
90-
error: error
91-
});
9243

93-
reject(error);
44+
makeAuthorizationRequest().then(resolve).catch((error) => {
45+
logger.error('failed to retrieve refreshToken', {
46+
category: 'openid-connect',
47+
error: error
9448
});
95-
} else {
96-
makeAuthorizationRequest().then((respone) => {
97-
resolve(true);
98-
}).catch((error) => {
99-
logger.error('failed to retrieve refreshToken', {
100-
category: 'openid-connect',
101-
error: error
102-
});
10349

104-
reject(error);
105-
});
106-
}
50+
reject(error);
51+
});
10752
}).catch(reject); //catch fetchServiceConfiguration
10853
});
10954
}
@@ -241,6 +186,55 @@ module.exports = function (env, clientConfig) {
241186
});
242187
}
243188

189+
function refreshAccessToken(idp) {
190+
return new Promise(function(resolve, reject) {
191+
_refreshAccessToken(idp)
192+
.then(resolve)
193+
.catch(err => {
194+
reject(_checkForNetworkErrors(err));
195+
})
196+
});
197+
}
198+
199+
function _refreshAccessToken(idp) {
200+
idpConfig = idp;
201+
return new Promise((resolve, reject) => {
202+
fetchServiceConfiguration().then(config => {
203+
configuration = config;
204+
initIdp();
205+
206+
clientConfig.retrieveSecret('refreshToken').then((secret) => {
207+
logger.info('found refreshToken, trying to request new access token', {
208+
category: 'openid-connect'
209+
});
210+
211+
makeAccessTokenRequest(configuration, secret).then((response) => {
212+
_storeSecrets(response)
213+
.then(() => {
214+
clientConfig.set('accessTokenExpires', response.issuedAt + response.expiresIn);
215+
resolve();
216+
})
217+
.catch(err => {
218+
logger.error('Could not store accessToken', {catgory: 'openid-connect', err});
219+
reject(err);
220+
});
221+
}).catch((error) => {
222+
logger.info('failed to refresh accessToken', {category: 'openid-connect', error});
223+
224+
reject(error);
225+
});
226+
}).catch((error) => {
227+
logger.error('failed to read refreshToken from secret store', {
228+
category: 'openid-connect',
229+
error: error
230+
});
231+
232+
reject(error);
233+
});
234+
}).catch(reject);
235+
});
236+
}
237+
244238
function makeRevokeTokenRequest(configuration, refreshToken) {
245239
let options = {
246240
token: refreshToken,
@@ -298,8 +292,23 @@ module.exports = function (env, clientConfig) {
298292
return Promise.all(promises)
299293
}
300294

295+
function _checkForNetworkErrors(err) {
296+
if(err.message &&
297+
(
298+
/ENOTFOUND|ETIMEDOUT|ENETUNREACH|EHOSTUNREACH|ECONNREFUSED|EHOSTDOWN|ESOCKETTIMEDOUT|ECONNRESET/.test(err.message)
299+
||
300+
err.message === 'Error: socket hang up'
301+
)
302+
) {
303+
err = new OidcError(err.message, 'E_BLN_OIDC_NETWORK');
304+
}
305+
306+
return err;
307+
}
308+
301309
return {
302310
signin,
303-
revokeToken
311+
revokeToken,
312+
refreshAccessToken,
304313
};
305314
};

app/ui/startup/controller.js

+1-1
Original file line numberDiff line numberDiff line change
@@ -114,7 +114,7 @@ module.exports = function(env, clientConfig) {
114114
||
115115
!clientConfig.isActiveInstance()
116116
||
117-
instance.getInstance(clientConfig) === null
117+
instance.getInstance(clientConfig.get('username'), clientConfig.get('blnUrl'), clientConfig.get('context')) === null
118118
);
119119
}
120120

0 commit comments

Comments
 (0)