@@ -91,21 +91,26 @@ module.exports = function(env, clientConfig) {
91
91
}
92
92
93
93
function _doBasicAuth ( username , password ) {
94
- clientConfig . set ( 'authMethod' , 'basic' ) ;
95
- clientConfig . set ( 'username' , username ) ;
96
-
97
94
return new Promise ( function ( resolve , reject ) {
98
- clientConfig . storeSecret ( 'password' , password ) . then ( ( ) => {
99
- verifyAuthentication ( ) . then ( resolve ) . catch ( ( error ) => {
100
- logger . error ( 'failed signin via basic auth' , {
95
+ var config = {
96
+ authMethod : 'basic' ,
97
+ username,
98
+ password
99
+ } ;
100
+
101
+ verifyAuthentication ( config ) . then ( ( ) => {
102
+ clientConfig . set ( 'authMethod' , 'basic' ) ;
103
+
104
+ clientConfig . storeSecret ( 'password' , password ) . then ( resolve ) . catch ( ( error ) => {
105
+ logger . error ( 'failed store secret in keystore' , {
101
106
category : 'auth' ,
102
107
error : error
103
108
} ) ;
104
109
105
110
reject ( error ) ;
106
111
} ) ;
107
112
} ) . catch ( ( error ) => {
108
- logger . error ( 'failed store secret in keystore ' , {
113
+ logger . error ( 'failed signin via basic auth ' , {
109
114
category : 'auth' ,
110
115
error : error
111
116
} ) ;
@@ -116,9 +121,6 @@ module.exports = function(env, clientConfig) {
116
121
}
117
122
118
123
function _doTokenAuth ( username , password , code ) {
119
- clientConfig . set ( 'authMethod' , 'token' ) ;
120
- clientConfig . set ( 'username' , username ) ;
121
-
122
124
return new Promise ( function ( resolve , reject ) {
123
125
var apiUrl = clientConfig . get ( 'apiUrl' ) . replace ( '/v1' , '/v2' ) ;
124
126
@@ -156,18 +158,23 @@ module.exports = function(env, clientConfig) {
156
158
157
159
switch ( response . statusCode ) {
158
160
case 200 :
159
- _storeAuthTokens ( body )
160
- . then ( ( ) => {
161
- verifyAuthentication ( ) . then ( resolve ) . catch ( ( error ) => {
162
- logger . error ( 'failed signin via token auth' , {
163
- category : 'auth' ,
164
- error : error
165
- } ) ;
161
+ var config = {
162
+ authMethod : 'token' ,
163
+ accessToken : body . access_token
164
+ } ;
166
165
167
- reject ( error ) ;
168
- } ) ;
169
- } )
170
- . catch ( reject ) ;
166
+ verifyAuthentication ( config ) . then ( ( ) => {
167
+ clientConfig . set ( 'authMethod' , 'token' ) ;
168
+
169
+ _storeAuthTokens ( body ) . then ( resolve ) . catch ( reject ) ;
170
+ } ) . catch ( ( error ) => {
171
+ logger . error ( 'failed signin via token auth' , {
172
+ category : 'auth' ,
173
+ error : error
174
+ } ) ;
175
+
176
+ reject ( error ) ;
177
+ } ) ;
171
178
break ;
172
179
case 403 :
173
180
if ( body . error === 'Balloon\\App\\Idp\\Exception\\MultiFactorAuthenticationRequired' ) {
@@ -187,6 +194,31 @@ module.exports = function(env, clientConfig) {
187
194
} ) ;
188
195
}
189
196
197
+ function _storeOidcAuthTokens ( response ) {
198
+ return new Promise ( ( resolve , reject ) => {
199
+ if ( ! response . accessToken ) {
200
+ logger . error ( 'access token not set in oidc response' , { category : 'auth' } ) ;
201
+ return reject ( new Error ( 'Response does not contain accessToken' ) ) ;
202
+ }
203
+
204
+ var promises = [ ] ;
205
+
206
+ promises . push ( clientConfig . storeSecret ( 'accessToken' , response . accessToken ) ) ;
207
+
208
+ if ( response . refreshToken ) {
209
+ promises . push ( clientConfig . storeSecret ( 'refreshToken' , response . refreshToken ) )
210
+ }
211
+
212
+ Promise . all ( promises ) . then ( ( ) => {
213
+ logger . debug ( 'Stored oidc tokens' , { category : 'auth' } ) ;
214
+ resolve ( ) ;
215
+ } ) . catch ( ( err ) => {
216
+ logger . error ( 'Could not store oidc tokens' , { category : 'auth' , err} ) ;
217
+ reject ( err ) ;
218
+ } ) ;
219
+ } ) ;
220
+ }
221
+
190
222
function _storeAuthTokens ( body ) {
191
223
return new Promise ( function ( resolve , reject ) {
192
224
if ( ! body . access_token ) {
@@ -238,12 +270,20 @@ module.exports = function(env, clientConfig) {
238
270
var idpConfig = getIdPByProviderUrl ( oidcProvider ) ;
239
271
}
240
272
241
- oidc . refreshAccessToken ( idpConfig ) . then ( ( ) => {
242
- verifyAuthentication ( ) . then ( resolve ) . catch ( ( error ) => {
243
- logger . error ( 'failed refresh access_token' , {
244
- category : 'auth' ,
245
- error : error
246
- } ) ;
273
+ oidc . refreshAccessToken ( idpConfig ) . then ( response => {
274
+ var config = {
275
+ authMethod : 'oidc' ,
276
+ accessToken : response . accessToken
277
+ } ;
278
+
279
+ verifyAuthentication ( config ) . then ( ( ) => {
280
+ clientConfig . set ( 'authMethod' , 'oidc' ) ;
281
+ clientConfig . set ( 'oidcProvider' , idpConfig . providerUrl ) ;
282
+ clientConfig . set ( 'accessTokenExpires' , response . issuedAt + response . expiresIn ) ;
283
+
284
+ _storeOidcAuthTokens ( response ) . then ( resolve ) . catch ( reject ) ;
285
+ } ) . catch ( ( error ) => {
286
+ logger . error ( 'failed refresh access_token' , { category : 'auth' , error : error } ) ;
247
287
248
288
reject ( error ) ;
249
289
} ) ;
@@ -285,21 +325,26 @@ module.exports = function(env, clientConfig) {
285
325
286
326
switch ( response . statusCode ) {
287
327
case 200 :
288
- _storeAuthTokens ( body )
289
- . then ( ( ) => {
290
- verifyAuthentication ( ) . then ( resolve ) . catch ( ( error ) => {
291
- logger . error ( 'verify auth after refresh access token failed' , {
292
- category : 'auth' ,
293
- error : error
294
- } ) ;
295
-
296
- reject ( error ) ;
297
- } ) ;
298
- } )
299
- . catch ( reject ) ;
328
+ var config = {
329
+ authMethod : 'token' ,
330
+ accessToken : body . access_token
331
+ } ;
332
+
333
+ verifyAuthentication ( config ) . then ( ( ) => {
334
+ clientConfig . set ( 'authMethod' , 'token' ) ;
335
+ _storeAuthTokens ( body ) . then ( resolve ) . catch ( reject ) ;
336
+ } ) . catch ( ( error ) => {
337
+ logger . error ( 'verify auth after refresh access token failed' , {
338
+ category : 'auth' ,
339
+ error : error
340
+ } ) ;
341
+
342
+ reject ( error ) ;
343
+ } ) ;
300
344
break ;
301
345
case 400 :
302
346
default :
347
+ logger . info ( 'refresh token failed' , { category : 'auth' , body} ) ;
303
348
reject ( new Error ( body . error_description ) ) ;
304
349
break ;
305
350
}
@@ -315,9 +360,19 @@ module.exports = function(env, clientConfig) {
315
360
//TODO pixtron - we can remove these? clientConfig.set('oidcProvider', undefined);
316
361
function oidcAuth ( idpConfig ) {
317
362
return new Promise ( function ( resolve , reject ) {
318
- oidc . signin ( idpConfig ) . then ( ( ) => {
319
- verifyAuthentication ( ) . then ( resolve ) . catch ( ( error ) => {
320
- clientConfig . set ( 'oidcProvider' , undefined ) ;
363
+ oidc . signin ( idpConfig ) . then ( ( result ) => {
364
+ var config = {
365
+ authMethod : 'oidc' ,
366
+ accessToken : result . accessToken
367
+ } ;
368
+
369
+ verifyAuthentication ( config ) . then ( ( ) => {
370
+ clientConfig . set ( 'authMethod' , 'oidc' ) ;
371
+ clientConfig . set ( 'oidcProvider' , idpConfig . providerUrl ) ;
372
+ clientConfig . set ( 'accessTokenExpires' , result . issuedAt + result . expiresIn ) ;
373
+
374
+ _storeOidcAuthTokens ( result ) . then ( resolve ) . catch ( reject ) ;
375
+ } ) . catch ( ( error ) => {
321
376
logger . error ( 'failed to authorize via oidc' , { category : 'auth' , error} ) ;
322
377
323
378
reject ( error )
@@ -351,18 +406,24 @@ module.exports = function(env, clientConfig) {
351
406
logger . info ( 'login initialized' , { category : 'auth' } ) ;
352
407
353
408
return new Promise ( function ( resolve , reject ) {
354
- verifyAuthentication ( ) . then ( resolve ) . catch ( ( err ) => {
355
- logger . info ( 'login failed' , {
356
- category : 'auth' ,
357
- error : err
358
- } ) ;
409
+ var authMethod = clientConfig . get ( 'authMethod' ) ;
410
+ var config = { authMethod } ;
411
+
412
+ if ( authMethod === 'basic' ) {
413
+ config . username = clientConfig . get ( 'username' ) ;
414
+ config . password = clientConfig . getSecret ( ) ;
415
+ } else {
416
+ config . accessToken = clientConfig . getSecret ( ) ;
417
+ }
418
+
419
+ verifyAuthentication ( config ) . then ( resolve ) . catch ( ( err ) => {
420
+ logger . info ( 'login failed' , { category : 'auth' , error : err , authMethod} ) ;
359
421
360
422
if ( err . code && [ 'E_BLN_API_REQUEST_UNAUTHORIZED' , 'E_BLN_API_REQUEST_MFA_REQUIRED' ] . includes ( err . code ) === false ) {
361
423
// assume there is a network problem, should retry later
362
424
return reject ( err ) ;
363
425
}
364
426
365
- var authMethod = clientConfig . get ( 'authMethod' ) ;
366
427
switch ( authMethod ) {
367
428
case 'oidc' :
368
429
case 'token' :
@@ -398,19 +459,17 @@ module.exports = function(env, clientConfig) {
398
459
return undefined ;
399
460
}
400
461
401
- function verifyAuthentication ( ) {
462
+ function verifyAuthentication ( config ) {
402
463
//resolves with boolean true if a new instance was created (aka never seen user)
403
464
return new Promise ( function ( resolve , reject ) {
404
- var config = clientConfig . getAll ( true ) ;
405
-
406
- if ( ( [ 'oidc' , 'token' ] . includes ( config . authMethod ) && ! config . accessToken ) || ( config . authMethod === 'basic' && ! config . password ) ) {
465
+ if ( ( [ 'oidc' , 'token' ] . includes ( config . authMethod ) && ! config . accessToken ) || ( config . authMethod === 'basic' && ( ! config . password || ! config . username ) ) ) {
407
466
logger . error ( 'can not verify credentials, no secret available' , { category : 'auth' } ) ;
408
467
reject ( new Error ( 'Secret not set' ) ) ;
409
468
}
410
469
411
470
logger . info ( 'verifying new user credentials with whoami call' , { category : 'auth' , authMethod : config . authMethod , username : config . username } ) ;
412
471
413
- whoami ( ) . then ( username => {
472
+ whoami ( config ) . then ( username => {
414
473
var url = clientConfig . get ( 'blnUrl' ) ;
415
474
var context = clientConfig . get ( 'context' ) ;
416
475
@@ -427,19 +486,17 @@ module.exports = function(env, clientConfig) {
427
486
} ) ;
428
487
}
429
488
430
- function whoami ( ) {
489
+ function whoami ( config ) {
431
490
return new Promise ( ( resolve , reject ) => {
432
- var config = clientConfig . getAll ( true ) ;
433
491
config . version = globalConfig . get ( 'version' ) ;
492
+ config . apiUrl = clientConfig . get ( 'apiUrl' ) ;
434
493
435
494
var sync = fullSyncFactory ( config , logger ) ;
436
495
437
496
sync . blnApi . whoami ( function ( error , username ) {
438
497
if ( error ) {
439
498
logger . info ( 'whoami failed' , { category : 'auth' , error, username} ) ;
440
499
441
- clientConfig . set ( 'loggedin' , false ) ;
442
-
443
500
if ( error . code && isNetworkError ( error ) ) {
444
501
error = new AuthError ( error . message , 'E_BLN_AUTH_NETWORK' ) ;
445
502
} else if ( error . code && error . code !== 'E_BLN_API_REQUEST_UNAUTHORIZED' ) {
@@ -450,7 +507,6 @@ module.exports = function(env, clientConfig) {
450
507
} else {
451
508
logger . info ( 'whoami successfull' , { category : 'auth' , username} ) ;
452
509
453
- clientConfig . set ( 'loggedin' , true ) ;
454
510
resolve ( username ) ;
455
511
}
456
512
} ) ;
0 commit comments