@@ -373,24 +373,36 @@ export class OAuthService extends AuthConfig {
373
373
password : string ,
374
374
headers : HttpHeaders = new HttpHeaders ( )
375
375
) : Promise < object > {
376
- if ( ! this . validateUrlForHttps ( this . tokenEndpoint ) ) {
376
+ const parameters = {
377
+ username : userName ,
378
+ password : password ,
379
+ } ;
380
+ return this . fetchTokenUsingGrant ( 'password' , parameters , headers ) ;
381
+ }
382
+
383
+ /**
384
+ * Uses a custom grant type to retrieve tokens.
385
+ * @param grantType Grant type.
386
+ * @param parameters Parameters to pass.
387
+ * @param headers Optional additional HTTP headers.
388
+ */
389
+ public fetchTokenUsingGrant ( grantType : string , parameters : object , headers : HttpHeaders = new HttpHeaders ( ) ) : Promise < TokenResponse > { if ( ! this . validateUrlForHttps ( this . tokenEndpoint ) ) {
377
390
throw new Error (
378
391
'tokenEndpoint must use http, or config value for property requireHttps must allow http'
379
392
) ;
380
393
}
381
394
382
- return new Promise ( ( resolve , reject ) => {
395
+
383
396
/**
384
397
* A `HttpParameterCodec` that uses `encodeURIComponent` and `decodeURIComponent` to
385
398
* serialize and parse URL parameter keys and values.
386
399
*
387
400
* @stable
388
401
*/
389
402
let params = new HttpParams ( { encoder : new WebHttpUrlEncodingCodec ( ) } )
390
- . set ( 'grant_type' , 'password' )
403
+ . set ( 'grant_type' , grantType )
391
404
. set ( 'scope' , this . scope )
392
- . set ( 'username' , userName )
393
- . set ( 'password' , password ) ;
405
+ ;
394
406
395
407
if ( this . useHttpBasicAuthForPasswordFlow ) {
396
408
const header = btoa ( `${ this . clientId } :${ this . dummyClientSecret } ` ) ;
@@ -413,15 +425,18 @@ export class OAuthService extends AuthConfig {
413
425
}
414
426
}
415
427
416
- headers = headers . set (
428
+ // set explicit parameters last, to allow overwriting
429
+ for ( const key of Object . keys ( parameters ) ) {
430
+ params = params . set ( key , parameters [ key ] ) ;
431
+ } headers = headers . set (
417
432
'Content-Type' ,
418
433
'application/x-www-form-urlencoded'
419
434
) ;
420
435
421
- this . http
436
+ returnthis . http
422
437
. post < TokenResponse > ( this . tokenEndpoint , params , { headers} )
423
- . subscribe (
424
- tokenResponse => {
438
+ . toPromise ( )
439
+ . then ( tokenResponse => {
425
440
this . debug ( 'tokenResponse' , tokenResponse ) ;
426
441
this . storeAccessTokenResponse (
427
442
tokenResponse . access_token ,
@@ -430,16 +445,25 @@ export class OAuthService extends AuthConfig {
430
445
tokenResponse . scope
431
446
) ;
432
447
433
- this . eventsSubject . next ( new OAuthSuccessEvent ( 'token_received' ) ) ;
434
- resolve ( tokenResponse ) ;
435
- } ,
436
- err => {
437
- this . logger . error ( 'Error performing password flow' , err ) ;
448
+ if ( tokenResponse . id_token ) {
449
+ return this . processIdToken ( tokenResponse . id_token , tokenResponse . access_token )
450
+ . then ( idTokenResult => {
451
+ this . storeIdToken ( idTokenResult ) ;
452
+ return tokenResponse ;
453
+ } ) ;
454
+ }
455
+
456
+ return tokenResponse ;
457
+ } )
458
+ . then ( tokenResponse => { this . eventsSubject . next ( new OAuthSuccessEvent ( 'token_received' ) ) ;
459
+ return tokenResponse ;
460
+ } )
461
+ . catch ( err => {
462
+ this . logger . error ( `Error performing ${ grantType } flow` , err ) ;
438
463
this . eventsSubject . next ( new OAuthErrorEvent ( 'token_error' , err ) ) ;
439
- reject ( err ) ;
440
- }
441
- ) ;
442
- } ) ;
464
+ throw err ;
465
+ } ) ;
466
+
443
467
}
444
468
445
469
/**
0 commit comments