From 73f9a4c10a4fe03a7a27eeaf8c49324668b8197d Mon Sep 17 00:00:00 2001 From: jmelberg Date: Thu, 8 Mar 2018 16:15:30 -0800 Subject: [PATCH 1/3] :seedling: Make responseType configurable --- packages/okta-angular/src/okta/okta.config.ts | 1 + packages/okta-angular/src/okta/okta.service.ts | 2 +- packages/okta-angular/test/e2e/harness/src/app/app.module.ts | 1 + 3 files changed, 3 insertions(+), 1 deletion(-) diff --git a/packages/okta-angular/src/okta/okta.config.ts b/packages/okta-angular/src/okta/okta.config.ts index 8c46dedb2..9b1bd6df0 100644 --- a/packages/okta-angular/src/okta/okta.config.ts +++ b/packages/okta-angular/src/okta/okta.config.ts @@ -18,6 +18,7 @@ export interface OktaConfig { clientId?: string; scope?: string; onAuthRequired?: Function; + responseType?: string; } export const OKTA_CONFIG = new InjectionToken('okta.config.angular'); diff --git a/packages/okta-angular/src/okta/okta.service.ts b/packages/okta-angular/src/okta/okta.service.ts index d7c3dee86..6b145b762 100644 --- a/packages/okta-angular/src/okta/okta.service.ts +++ b/packages/okta-angular/src/okta/okta.service.ts @@ -102,7 +102,7 @@ export class OktaAuthService { */ loginRedirect(additionalParams?: object) { this.oktaAuth.token.getWithRedirect({ - responseType: ['id_token', 'token'], + responseType: (this.config.responseType || 'id_token token').split(' '), // Convert scopes to list of strings scopes: this.config.scope.split(' '), ...additionalParams diff --git a/packages/okta-angular/test/e2e/harness/src/app/app.module.ts b/packages/okta-angular/test/e2e/harness/src/app/app.module.ts index d03d6b21e..a57915d29 100644 --- a/packages/okta-angular/test/e2e/harness/src/app/app.module.ts +++ b/packages/okta-angular/test/e2e/harness/src/app/app.module.ts @@ -74,6 +74,7 @@ const config = { redirectUri: environment.REDIRECT_URI, clientId: environment.CLIENT_ID, scope: 'email', + responseType: 'id_token token', onAuthRequired: onNeedsGlobalAuthenticationGuard }; From 28c694a63dd1e4ba81d67e1515afcef2fbd59507 Mon Sep 17 00:00:00 2001 From: jmelberg Date: Mon, 12 Mar 2018 17:12:44 -0700 Subject: [PATCH 2/3] :white_check_mark: Adds unit tests --- packages/okta-angular/package.json | 4 +- .../test/e2e/harness/package.json | 2 +- .../e2e/harness/src/app/app.component.spec.ts | 55 +++++++++++++++++++ .../test/e2e/harness/src/app/app.module.ts | 10 ++-- .../src/app/sessionToken-login.component.ts | 6 +- 5 files changed, 67 insertions(+), 10 deletions(-) create mode 100644 packages/okta-angular/test/e2e/harness/src/app/app.component.spec.ts diff --git a/packages/okta-angular/package.json b/packages/okta-angular/package.json index 76277b224..d206d5508 100644 --- a/packages/okta-angular/package.json +++ b/packages/okta-angular/package.json @@ -12,7 +12,9 @@ "prestart": "npm run build:dependencies", "prepublish": "npm run ngc", "ngc": "./node_modules/.bin/ngc -p tsconfig.json", - "test": "npm run --prefix test/e2e/harness/ e2e", + "test": "npm run lint && npm run test:unit && npm run test:e2e", + "test:unit": "npm run --prefix test/e2e/harness/ test", + "test:e2e": "npm run --prefix test/e2e/harness/ e2e", "start": "npm run --prefix test/e2e/harness/ start", "docs": "typedoc --options typedoc.json --exclude '{**/*.spec.ts,**/test/**}' ./src/", "lint": "npm run --prefix test/e2e/harness/ lint", diff --git a/packages/okta-angular/test/e2e/harness/package.json b/packages/okta-angular/test/e2e/harness/package.json index 298180673..a13f92f4c 100644 --- a/packages/okta-angular/test/e2e/harness/package.json +++ b/packages/okta-angular/test/e2e/harness/package.json @@ -7,7 +7,7 @@ "start": "npm run env && ng serve --port=3000", "env": "node ./scripts/prebuild.js", "build": "ng build", - "test": "ng test", + "test": "ng test -watch=false", "lint": "ng lint", "e2e": "npm run env && ng e2e -port 3000" }, diff --git a/packages/okta-angular/test/e2e/harness/src/app/app.component.spec.ts b/packages/okta-angular/test/e2e/harness/src/app/app.component.spec.ts new file mode 100644 index 000000000..95f4afaa5 --- /dev/null +++ b/packages/okta-angular/test/e2e/harness/src/app/app.component.spec.ts @@ -0,0 +1,55 @@ +import { TestBed, async, ComponentFixture } from '@angular/core/testing'; +import { RouterTestingModule } from '@angular/router/testing'; +import { AppComponent } from './app.component'; +import { environment } from './../environments/environment'; + +import { + OktaAuthGuard, + OktaAuthModule, + OktaCallbackComponent, + OktaLoginRedirectComponent +} from '@okta/okta-angular'; + +describe('Unit Tests', () => { + let component: AppComponent; + let fixture: ComponentFixture; + + beforeEach(() => { + const config = { + issuer: environment.ISSUER, + redirectUri: environment.REDIRECT_URI, + clientId: environment.CLIENT_ID, + scope: 'email', + responseType: 'id_token' + }; + + TestBed.configureTestingModule({ + imports: [ + RouterTestingModule.withRoutes([{ path: 'foo', redirectTo: '/foo' }]), + OktaAuthModule.initAuth(config) + ], + declarations: [ + AppComponent + ] + }); + }); + + beforeEach(() => { + fixture = TestBed.createComponent(AppComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create the app', async(() => { + expect(component).toBeTruthy(); + })); + + it('should instantiate the OktaAuth object', async(() => { + const config = component.oktaAuth.getOktaConfig(); + expect(config.issuer).toBe(environment.ISSUER); + expect(config.redirectUri).toBe(environment.REDIRECT_URI); + expect(config.clientId).toBe(environment.CLIENT_ID); + expect(config.scope).toBe('email openid'); + expect(config.responseType).toBe('id_token'); + })); +}); diff --git a/packages/okta-angular/test/e2e/harness/src/app/app.module.ts b/packages/okta-angular/test/e2e/harness/src/app/app.module.ts index a57915d29..a619cacf8 100644 --- a/packages/okta-angular/test/e2e/harness/src/app/app.module.ts +++ b/packages/okta-angular/test/e2e/harness/src/app/app.module.ts @@ -31,15 +31,15 @@ import { */ import { ProtectedComponent } from './protected.component'; import { AppComponent } from './app.component'; -import { SessionTokenLogin } from './sessionToken-login.component'; +import { SessionTokenLoginComponent } from './sessionToken-login.component'; export function onNeedsAuthenticationGuard({ oktaAuth, router }) { router.navigate(['/sessionToken-login']); -}; +} export function onNeedsGlobalAuthenticationGuard({ oktaAuth, router }) { router.navigate(['/login']); -}; +} const appRoutes: Routes = [ { @@ -48,7 +48,7 @@ const appRoutes: Routes = [ }, { path: 'sessionToken-login', - component: SessionTokenLogin + component: SessionTokenLoginComponent }, { path: 'implicit/callback', @@ -87,7 +87,7 @@ const config = { declarations: [ AppComponent, ProtectedComponent, - SessionTokenLogin + SessionTokenLoginComponent ], bootstrap: [ AppComponent ] }) diff --git a/packages/okta-angular/test/e2e/harness/src/app/sessionToken-login.component.ts b/packages/okta-angular/test/e2e/harness/src/app/sessionToken-login.component.ts index eb608c767..0da8576d0 100644 --- a/packages/okta-angular/test/e2e/harness/src/app/sessionToken-login.component.ts +++ b/packages/okta-angular/test/e2e/harness/src/app/sessionToken-login.component.ts @@ -16,10 +16,10 @@ import { OktaAuthService } from '@okta/okta-angular'; import OktaAuth from '@okta/okta-auth-js'; @Component({ - selector: 'app-sessionLogin', + selector: 'app-session-login', template: ` - +

` }) -export class SessionTokenLogin { +export class SessionTokenLoginComponent { oktaAuth: OktaAuth; constructor(private okta: OktaAuthService) { From 8bb117d3e38db0173f299fd2d6f8efae5d907cc6 Mon Sep 17 00:00:00 2001 From: jmelberg Date: Wed, 14 Mar 2018 10:56:45 -0700 Subject: [PATCH 3/3] Updated per RD review --- packages/okta-angular/README.md | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/packages/okta-angular/README.md b/packages/okta-angular/README.md index 7087d1ac4..2b75d210c 100644 --- a/packages/okta-angular/README.md +++ b/packages/okta-angular/README.md @@ -37,6 +37,7 @@ The `OktaAuthModule` is the initializer for your OpenID Connect client configura - `clientId` **(required)**: The OpenID Connect `client_id` - `redirectUri` **(required)**: Where the callback is hosted - `scope` *(optional)*: Reserved for custom claims to be returned in the tokens + - `responseType` *(optional)*: Desired token grant types - `onAuthRequired` *(optional)*: Accepts a callback to make a decision when authentication is required. If not supplied, `okta-angular` will redirect directly to Okta for authentication. ```typescript @@ -48,8 +49,8 @@ import { const oktaConfig = { issuer: 'https://{yourOktaDomain}.com/oauth2/default', - redirectUri: 'http://localhost:{port}/implicit/callback', - clientId: '{clientId}' + clientId: '{clientId}', + redirectUri: 'http://localhost:{port}/implicit/callback' } const appRoutes: Routes = [