From ac41765b8b3af768c1f8f0d309d9c7f9efb1d2b3 Mon Sep 17 00:00:00 2001 From: Dmitry Nehaychik <4dmitr@gmail.com> Date: Thu, 5 Jul 2018 15:26:22 +0300 Subject: [PATCH] fix(auth): fix token parceler suppressing `getClassByName` errors (#548) Closes #528 --- .../services/token/token-parceler.spec.ts | 111 +++++++++++------- .../auth/services/token/token-parceler.ts | 15 ++- 2 files changed, 81 insertions(+), 45 deletions(-) diff --git a/src/framework/auth/services/token/token-parceler.spec.ts b/src/framework/auth/services/token/token-parceler.spec.ts index f5d220fb37..0df2a1b682 100644 --- a/src/framework/auth/services/token/token-parceler.spec.ts +++ b/src/framework/auth/services/token/token-parceler.spec.ts @@ -22,54 +22,85 @@ describe('token-parceler', () => { const wrappedNonExisting = `{"name":"non-existing","value":"${simpleToken.getValue()}"}`; const wrappedInvalid = `{"name":"non-existing"`; - beforeEach(() => { - TestBed.configureTestingModule({ - providers: [ - { provide: NB_AUTH_FALLBACK_TOKEN, useValue: NbAuthSimpleToken }, - { provide: NB_AUTH_TOKENS, useValue: [NbAuthSimpleToken, NbAuthJWTToken] }, - NbAuthTokenParceler, - ], + describe('default configuration', () => { + beforeEach(() => { + TestBed.configureTestingModule({ + providers: [ + { provide: NB_AUTH_FALLBACK_TOKEN, useValue: NbAuthSimpleToken }, + { provide: NB_AUTH_TOKENS, useValue: [NbAuthSimpleToken, NbAuthJWTToken] }, + NbAuthTokenParceler, + ], + }); }); - }); beforeEach(async(inject( - [NbAuthTokenParceler], - (_tokenParceler) => { - tokenParceler = _tokenParceler; - }, - ))); - - it('wraps simple', () => { - expect(tokenParceler.wrap(simpleToken)) - .toEqual(wrappedSimple); - }); + [NbAuthTokenParceler], + (_tokenParceler) => { + tokenParceler = _tokenParceler; + }, + ))); - it('wraps jwt', () => { - expect(tokenParceler.wrap(jwtToken)) - .toEqual(wrappedJWT); - }); + it('wraps simple', () => { + expect(tokenParceler.wrap(simpleToken)) + .toEqual(wrappedSimple); + }); - it('unwraps simple', () => { - expect(tokenParceler.unwrap(wrappedSimple)) - .toEqual(simpleToken); - }); + it('wraps jwt', () => { + expect(tokenParceler.wrap(jwtToken)) + .toEqual(wrappedJWT); + }); - it('unwraps jwt', () => { - expect(tokenParceler.unwrap(wrappedJWT)) - .toEqual(jwtToken); - }); + it('unwraps simple', () => { + expect(tokenParceler.unwrap(wrappedSimple)) + .toEqual(simpleToken); + }); - it('unwraps non existing', () => { - expect(tokenParceler.unwrap(wrappedNonExisting)) - .toEqual(simpleToken); - }); + it('unwraps jwt', () => { + expect(tokenParceler.unwrap(wrappedJWT)) + .toEqual(jwtToken); + }); + + it('unwraps non existing', () => { + expect(tokenParceler.unwrap(wrappedNonExisting)) + .toEqual(simpleToken); + }); - it('unwraps invalid', () => { - const token = tokenParceler.unwrap(wrappedInvalid); - expect(token.getName()) - .toEqual(simpleToken.getName()); - expect(token.getValue()) - .toEqual(''); + it('unwraps invalid', () => { + const token = tokenParceler.unwrap(wrappedInvalid); + expect(token.getName()) + .toEqual(simpleToken.getName()); + expect(token.getValue()) + .toEqual(''); + }); }); + describe('fail configuration', () => { + beforeEach(() => { + TestBed.configureTestingModule({ + providers: [ + { provide: NB_AUTH_FALLBACK_TOKEN, useValue: NbAuthSimpleToken }, + { provide: NB_AUTH_TOKENS, useValue: [] }, + NbAuthTokenParceler, + ], + }); + }); + + beforeEach(async(inject( + [NbAuthTokenParceler], + (_tokenParceler) => { + tokenParceler = _tokenParceler; + }, + ))); + + it('unwraps jwt to fallback simple as none provided', () => { + + const token = tokenParceler.unwrap(wrappedJWT); + expect(token.getName()) + .toEqual(simpleToken.getName()); + + expect(token.getValue()) + .toEqual(jwtToken.getValue()); + }); + + }); }); diff --git a/src/framework/auth/services/token/token-parceler.ts b/src/framework/auth/services/token/token-parceler.ts index 58411658ee..82e6b60151 100644 --- a/src/framework/auth/services/token/token-parceler.ts +++ b/src/framework/auth/services/token/token-parceler.ts @@ -28,15 +28,13 @@ export class NbAuthTokenParceler { } unwrap(value: string): NbAuthToken { - let tokenClass: NbAuthTokenClass; + let tokenClass: NbAuthTokenClass = this.fallbackClass; let tokenValue = ''; - try { - const tokenPack: NbTokenPack = JSON.parse(value); + const tokenPack: NbTokenPack = this.parseTokenPack(value); + if (tokenPack) { tokenClass = this.getClassByName(tokenPack.name) || this.fallbackClass; tokenValue = tokenPack.value; - } catch (e) { - tokenClass = this.fallbackClass } return nbAuthCreateToken(tokenClass, tokenValue); @@ -46,4 +44,11 @@ export class NbAuthTokenParceler { protected getClassByName(name): NbAuthTokenClass { return this.tokenClasses.find((tokenClass: NbAuthTokenClass) => tokenClass.NAME === name); } + + protected parseTokenPack(value): NbTokenPack { + try { + return JSON.parse(value); + } catch (e) { } + return null; + } }