diff --git a/front-end/src/app/app-routing.module.ts b/front-end/src/app/app-routing.module.ts index 355e983c2e..2992755f09 100644 --- a/front-end/src/app/app-routing.module.ts +++ b/front-end/src/app/app-routing.module.ts @@ -5,12 +5,14 @@ import { TwoFactorLoginComponent } from './login/two-factor-login/two-factor-log import { ConfirmTwoFactorComponent } from './login/confirm-two-factor/confirm-two-factor.component'; import { LayoutComponent } from './layout/layout.component'; import { DashboardComponent } from './dashboard/dashboard.component'; +import { LoginGuard } from './shared/guards/login-page.guard'; const routes: Routes = [ { path: '', component: LoginComponent, pathMatch: 'full', + canActivate:[LoginGuard], }, { path: 'twoFactLogin', component: TwoFactorLoginComponent }, { path: 'confirm-2f', component: ConfirmTwoFactorComponent }, diff --git a/front-end/src/app/dashboard/dashboard.component.spec.ts b/front-end/src/app/dashboard/dashboard.component.spec.ts index d187c72de0..ea73d3777f 100644 --- a/front-end/src/app/dashboard/dashboard.component.spec.ts +++ b/front-end/src/app/dashboard/dashboard.component.spec.ts @@ -1,19 +1,47 @@ -import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing'; import { HttpClientTestingModule } from '@angular/common/http/testing'; +import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing'; +import { BrowserAnimationsModule } from '@angular/platform-browser/animations'; import { RouterTestingModule } from '@angular/router/testing'; +import { Store } from '@ngrx/store'; +import { provideMockStore } from '@ngrx/store/testing'; +import { UserLoginData } from 'app/shared/models/user.model'; +import { userLoggedInAction } from 'app/store/login.actions'; +import { selectUserLoginData } from 'app/store/login.selectors'; +import { environment } from 'environments/environment'; import { CookieService } from 'ngx-cookie-service'; +import { PanelModule } from 'primeng/panel'; import { DashboardComponent } from './dashboard.component'; -xdescribe('DashboardComponent', () => { +describe('DashboardComponent', () => { let component: DashboardComponent; let fixture: ComponentFixture; + let cookieService: CookieService; + let store: Store; beforeEach( waitForAsync(() => { + const userLoginData: UserLoginData = { + committee_id: 'C00000000', + email: 'email@fec.com', + is_allowed: true, + token: 'jwttokenstring', + }; + TestBed.configureTestingModule({ - imports: [HttpClientTestingModule, RouterTestingModule], + imports: [ + HttpClientTestingModule, + RouterTestingModule, + PanelModule, + BrowserAnimationsModule, + ], declarations: [DashboardComponent], - providers: [CookieService], + providers: [ + CookieService, + provideMockStore({ + initialState: { fecfile_online_userLoginData: userLoginData }, + selectors: [{ selector: selectUserLoginData, value: userLoginData }], + }), + ], }).compileComponents(); }) ); @@ -22,9 +50,41 @@ xdescribe('DashboardComponent', () => { fixture = TestBed.createComponent(DashboardComponent); component = fixture.componentInstance; fixture.detectChanges(); + cookieService = TestBed.inject(CookieService); + store = TestBed.inject(Store); }); - xit('should create', () => { + it('should create', () => { expect(component).toBeTruthy(); }); + + it('#dispatchUserLoggedInFromCookies happy path', () => { + const testCommitteeId = "testCommitteeId"; + const testEmail = "testEmail"; + const testIsAllowed = true; + const testToken = null; + + const expectedUserLoginData: UserLoginData = { + committee_id: testCommitteeId, + email: testEmail, + is_allowed: testIsAllowed, + token: testToken + } + spyOn(cookieService, 'check').and.returnValue(true); + spyOn(cookieService, 'get').and.callFake((name: string) => { + if (name === environment.ffapiCommitteeIdCookieName) { + return testCommitteeId; + } + if (name === environment.ffapiEmailCookieName) { + return testEmail; + } + throw Error("fail!"); + }); + spyOn(store, 'dispatch'); + + component.dispatchUserLoggedInFromCookies(); + expect(store.dispatch).toHaveBeenCalledWith( + userLoggedInAction({ payload: expectedUserLoginData })); + }); + }); diff --git a/front-end/src/app/dashboard/dashboard.component.ts b/front-end/src/app/dashboard/dashboard.component.ts index 7c07ad89a4..b9b78a00fa 100644 --- a/front-end/src/app/dashboard/dashboard.component.ts +++ b/front-end/src/app/dashboard/dashboard.component.ts @@ -1,8 +1,40 @@ -import { Component } from '@angular/core'; +import { Component, OnInit } from '@angular/core'; +import { Store } from '@ngrx/store'; +import { UserLoginData } from 'app/shared/models/user.model'; +import { userLoggedInAction } from 'app/store/login.actions'; +import { environment } from 'environments/environment'; +import { CookieService } from 'ngx-cookie-service'; @Component({ selector: 'app-dashboard', templateUrl: './dashboard.component.html', // styleUrls: ['./dashboard.component.scss'], }) -export class DashboardComponent {} +export class DashboardComponent implements OnInit { + + constructor( + private store: Store, + private cookieService: CookieService + ) { } + + ngOnInit(): void { + this.dispatchUserLoggedInFromCookies(); + } + + dispatchUserLoggedInFromCookies() { + if (this.cookieService.check(environment.ffapiCommitteeIdCookieName)) { + const userLoginData: UserLoginData = { + committee_id: this.cookieService.get( + environment.ffapiCommitteeIdCookieName), + email: this.cookieService.get( + environment.ffapiEmailCookieName), + is_allowed: true, + token: null + } + this.cookieService.delete(environment.ffapiCommitteeIdCookieName) + this.cookieService.delete(environment.ffapiEmailCookieName) + this.store.dispatch(userLoggedInAction({ payload: userLoginData })); + } + } + +} diff --git a/front-end/src/app/login/login/login.component.html b/front-end/src/app/login/login/login.component.html index 61041df2b6..7306c8fd7d 100644 --- a/front-end/src/app/login/login/login.component.html +++ b/front-end/src/app/login/login/login.component.html @@ -125,6 +125,10 @@ +   or   + diff --git a/front-end/src/app/login/login/login.component.scss b/front-end/src/app/login/login/login.component.scss index ded4705648..ecebdd78b5 100644 --- a/front-end/src/app/login/login/login.component.scss +++ b/front-end/src/app/login/login/login.component.scss @@ -175,6 +175,11 @@ .login__btn:hover { background-color: #c80505; } + .login-dot-gov-button { + @extend .login__btn; + width: 240px; + margin-left: 0px; + } .logged-out-msg { font-size: 1em; font-weight: bold; diff --git a/front-end/src/app/login/login/login.component.spec.ts b/front-end/src/app/login/login/login.component.spec.ts index cc97c043a7..fa9485ec87 100644 --- a/front-end/src/app/login/login/login.component.spec.ts +++ b/front-end/src/app/login/login/login.component.spec.ts @@ -1,13 +1,40 @@ +import { HttpClientTestingModule } from '@angular/common/http/testing'; import { ComponentFixture, TestBed } from '@angular/core/testing'; - +import { ReactiveFormsModule } from '@angular/forms'; +import { RouterTestingModule } from '@angular/router/testing'; +import { provideMockStore } from '@ngrx/store/testing'; +import { UserLoginData } from 'app/shared/models/user.model'; +import { selectUserLoginData } from 'app/store/login.selectors'; +import { environment } from '../../../environments/environment'; import { LoginComponent } from './login.component'; + describe('LoginComponent', () => { let component: LoginComponent; let fixture: ComponentFixture; + const userLoginData: UserLoginData = { + committee_id: 'C00000000', + email: 'email@fec.com', + is_allowed: true, + token: 'jwttokenstring', + }; + beforeEach(async () => { + window.onbeforeunload = jasmine.createSpy(); await TestBed.configureTestingModule({ + imports: [ + HttpClientTestingModule, + RouterTestingModule, + ReactiveFormsModule, + ], + providers: [ + { provide: Window, useValue: window }, + provideMockStore({ + initialState: { fecfile_online_userLoginData: userLoginData }, + selectors: [{ selector: selectUserLoginData, value: userLoginData }], + }), + ], declarations: [LoginComponent], }).compileComponents(); }); @@ -18,7 +45,13 @@ describe('LoginComponent', () => { fixture.detectChanges(); }); - xit('should create', () => { + it('should create', () => { expect(component).toBeTruthy(); }); + + xit('navigateToLoginDotGov should href environment location', () => { + component.navigateToLoginDotGov(); + expect(window.location.href).toEqual(environment.loginDotGovAuthUrl); + }); + }); diff --git a/front-end/src/app/login/login/login.component.ts b/front-end/src/app/login/login/login.component.ts index ea1b25468c..8d7ca23693 100644 --- a/front-end/src/app/login/login/login.component.ts +++ b/front-end/src/app/login/login/login.component.ts @@ -1,11 +1,13 @@ import { Component, OnInit } from '@angular/core'; import { FormBuilder, FormGroup, Validators } from '@angular/forms'; import { Router } from '@angular/router'; +import { Store } from '@ngrx/store'; +import { UserLoginData } from 'app/shared/models/user.model'; +import { userLoggedOutAction } from 'app/store/login.actions'; import { environment } from '../../../environments/environment'; -import { LoginService } from '../../shared/services/login.service'; import { AuthService } from '../../shared/services/AuthService/auth.service'; +import { LoginService } from '../../shared/services/login.service'; import { SessionService } from '../../shared/services/SessionService/session.service'; -import { UserLoginData } from 'app/shared/models/user.model'; @Component({ selector: 'app-login', @@ -23,13 +25,15 @@ export class LoginComponent implements OnInit { public titleF!: string; public titleR!: string; public show!: boolean; + public loginDotGovAuthUrl: string | null = null; constructor( private fb: FormBuilder, private loginService: LoginService, private authService: AuthService, private router: Router, - private sessionService: SessionService + private sessionService: SessionService, + private store: Store, ) { this.frm = this.fb.group({ commiteeId: ['', Validators.required], @@ -45,7 +49,9 @@ export class LoginComponent implements OnInit { this.appTitle = environment.appTitle; this.titleF = this.appTitle.substring(0, 3); this.titleR = this.appTitle.substring(3); - this.loginService.logOut(); + this.loginService.clearUserLoggedInCookies(); + this.store.dispatch(userLoggedOutAction()); + this.loginDotGovAuthUrl = environment.loginDotGovAuthUrl; } /** @@ -104,4 +110,8 @@ export class LoginComponent implements OnInit { showPassword() { this.show = !this.show; } + + navigateToLoginDotGov() { + window.location.href = this.loginDotGovAuthUrl || ""; + } } diff --git a/front-end/src/app/shared/guards/login-page.guard.spec.ts b/front-end/src/app/shared/guards/login-page.guard.spec.ts new file mode 100644 index 0000000000..f4458c44bd --- /dev/null +++ b/front-end/src/app/shared/guards/login-page.guard.spec.ts @@ -0,0 +1,60 @@ +import { HttpClientTestingModule } from '@angular/common/http/testing'; +import { TestBed } from '@angular/core/testing'; +import { Router } from '@angular/router'; +import { RouterTestingModule } from '@angular/router/testing'; +import { provideMockStore } from '@ngrx/store/testing'; +import { UserLoginData } from 'app/shared/models/user.model'; +import { ApiService } from 'app/shared/services/api.service'; +import { selectUserLoginData } from 'app/store/login.selectors'; +import { LoginGuard } from './login-page.guard'; + + +describe('LoginGuard', () => { + let guard: LoginGuard; + let apiService: ApiService; + let router: Router; + + const userLoginData: UserLoginData = { + committee_id: 'C00000000', + email: 'email@fec.com', + is_allowed: true, + token: 'jwttokenstring', + }; + + beforeEach(() => { + TestBed.configureTestingModule({ + imports: [HttpClientTestingModule, RouterTestingModule], + providers: [ + ApiService, + provideMockStore({ + initialState: { fecfile_online_userLoginData: userLoginData }, + selectors: [{ selector: selectUserLoginData, value: userLoginData }], + }), + ], + }); + guard = TestBed.inject(LoginGuard); + apiService = TestBed.inject(ApiService); + router = TestBed.inject(Router); + }); + + it('should be created', () => { + expect(guard).toBeTruthy(); + }); + + it('should reroute to dashboard if logged in', () => { + spyOn(apiService, 'isAuthenticated').and.returnValue(true); + const navigateSpy = spyOn(router, 'navigate'); + const retval = guard.canActivate() + expect(navigateSpy).toHaveBeenCalledWith(['dashboard']); + expect(retval).toEqual(false); + }); + + it('should allow activate if not logged in', () => { + spyOn(apiService, 'isAuthenticated').and.returnValue(false); + const navigateSpy = spyOn(router, 'navigate'); + const retval = guard.canActivate() + expect(navigateSpy).not.toHaveBeenCalled(); + expect(retval).toEqual(true); + }); + +}); diff --git a/front-end/src/app/shared/guards/login-page.guard.ts b/front-end/src/app/shared/guards/login-page.guard.ts new file mode 100644 index 0000000000..e6af67f5b8 --- /dev/null +++ b/front-end/src/app/shared/guards/login-page.guard.ts @@ -0,0 +1,20 @@ +import { Injectable } from '@angular/core'; +import { CanActivate, Router, UrlTree } from '@angular/router'; +import { ApiService } from 'app/shared/services/api.service'; +import { Observable } from 'rxjs'; + +@Injectable({ + providedIn: 'root' +}) +export class LoginGuard implements CanActivate { + constructor(private apiService: ApiService, private router: Router) { } + canActivate(): Observable | Promise | boolean | UrlTree { + if (this.apiService.isAuthenticated()) { + this.router.navigate(['dashboard']); + return false; + } else { + return true; + } + } + +} diff --git a/front-end/src/app/shared/services/api.service.spec.ts b/front-end/src/app/shared/services/api.service.spec.ts index b7dda44cdd..e9ff51d292 100644 --- a/front-end/src/app/shared/services/api.service.spec.ts +++ b/front-end/src/app/shared/services/api.service.spec.ts @@ -1,5 +1,5 @@ -import { TestBed } from '@angular/core/testing'; import { HttpClientTestingModule } from '@angular/common/http/testing'; +import { TestBed } from '@angular/core/testing'; import { provideMockStore } from '@ngrx/store/testing'; import { UserLoginData } from 'app/shared/models/user.model'; import { selectUserLoginData } from 'app/store/login.selectors'; @@ -32,4 +32,10 @@ describe('ApiService', () => { it('should be created', () => { expect(service).toBeTruthy(); }); + + it('isAuthenticated should return true with committee_id set', () => { + const retval = service.isAuthenticated(); + expect(retval).toBeTrue(); + }); + }); diff --git a/front-end/src/app/shared/services/api.service.ts b/front-end/src/app/shared/services/api.service.ts index a6aae407e2..f15393c57e 100644 --- a/front-end/src/app/shared/services/api.service.ts +++ b/front-end/src/app/shared/services/api.service.ts @@ -1,29 +1,35 @@ import { HttpClient, HttpParams } from '@angular/common/http'; import { Injectable } from '@angular/core'; -import { Observable, of } from 'rxjs'; -import { tap, delay, switchMap } from 'rxjs/operators'; -import { environment } from '../../../environments/environment'; import { Store } from '@ngrx/store'; import { selectUserLoginData } from 'app/store/login.selectors'; +import { spinnerOffAction, spinnerOnAction } from 'app/store/spinner.actions'; +import { CookieService } from 'ngx-cookie-service'; +import { Observable, of } from 'rxjs'; +import { delay, switchMap, tap } from 'rxjs/operators'; +import { environment } from '../../../environments/environment'; import { UserLoginData } from '../models/user.model'; -import { spinnerOnAction, spinnerOffAction } from 'app/store/spinner.actions'; @Injectable({ providedIn: 'root', }) export class ApiService { private token: string | null = null; + private loggedInCommitteeId: string | null = null; - constructor(private http: HttpClient, private store: Store) { + constructor(private http: HttpClient, private store: Store, + private cookieService: CookieService) { this.store.select(selectUserLoginData).subscribe((userLoginData: UserLoginData) => { this.token = userLoginData.token; - }); + this.loggedInCommitteeId = userLoginData.committee_id + }) } getHeaders(headersToAdd: object = {}) { + const csrfToken = `${this.cookieService.get("csrftoken")}`; const baseHeaders = { 'Content-Type': 'application/json', - Authorization: `JWT ${this.token}`, + ...(this.token && {Authorization: `JWT ${this.token}`}), + ...(csrfToken && {'x-csrftoken':`${csrfToken}`}) }; return { ...baseHeaders, ...headersToAdd }; } @@ -36,26 +42,38 @@ export class ApiService { public get(endpoint: string): Observable { const headers = this.getHeaders(); - return this.http.get(`${environment.apiUrl}${endpoint}`, { headers: headers }); + return this.http.get(`${environment.apiUrl}${endpoint}`, { headers: headers, withCredentials: true }); } // prettier-ignore public post(endpoint: string, payload: any, queryParams: any = {}): Observable { // eslint-disable-line @typescript-eslint/no-explicit-any const headers = this.getHeaders(); const params = this.getQueryParams(queryParams); - return this.http.post(`${environment.apiUrl}${endpoint}`, payload, { headers: headers , params: params}); + return this.http.post(`${environment.apiUrl}${endpoint}`, payload, { headers: headers , params: params, withCredentials: true}); + } + + // prettier-ignore + public postAbsoluteUrl(endpoint: string, payload: any, queryParams: any = {}): Observable { // eslint-disable-line @typescript-eslint/no-explicit-any + const headers = this.getHeaders(); + const params = this.getQueryParams(queryParams); + return this.http.post(`${endpoint}`, payload, { headers: headers , params: params, withCredentials: true}); } // prettier-ignore public put(endpoint: string, payload: any, queryParams: any = {}): Observable { // eslint-disable-line @typescript-eslint/no-explicit-any const headers = this.getHeaders(); const params = this.getQueryParams(queryParams); - return this.http.put(`${environment.apiUrl}${endpoint}`, payload, { headers: headers , params: params}); + return this.http.put(`${environment.apiUrl}${endpoint}`, payload, { headers: headers , params: params, withCredentials: true}); } public delete(endpoint: string): Observable { const headers = this.getHeaders(); - return this.http.delete(`${environment.apiUrl}${endpoint}`, { headers: headers }); + return this.http.delete(`${environment.apiUrl}${endpoint}`, { headers: headers, withCredentials: true }); + } + + public isAuthenticated() { + return !!this.loggedInCommitteeId || + this.cookieService.check(environment.ffapiCommitteeIdCookieName); } public spinnerGet(endpoint: string): Observable { @@ -98,4 +116,5 @@ export class ApiService { switchMap(() => this.delete(endpoint).pipe(tap(() => this.store.dispatch(spinnerOffAction())))) ); } + } diff --git a/front-end/src/app/shared/services/login.service.spec.ts b/front-end/src/app/shared/services/login.service.spec.ts index 7ab298c174..5b6f0f904d 100644 --- a/front-end/src/app/shared/services/login.service.spec.ts +++ b/front-end/src/app/shared/services/login.service.spec.ts @@ -1,15 +1,19 @@ -import { TestBed } from '@angular/core/testing'; import { HttpClientTestingModule, HttpTestingController } from '@angular/common/http/testing'; -import { provideMockStore } from '@ngrx/store/testing'; -import { environment } from 'environments/environment'; +import { TestBed } from '@angular/core/testing'; +import { MockStore, provideMockStore } from '@ngrx/store/testing'; import { UserLoginData } from 'app/shared/models/user.model'; +import { userLoggedOutAction } from 'app/store/login.actions'; import { selectUserLoginData } from 'app/store/login.selectors'; +import { environment } from 'environments/environment'; +import { of } from 'rxjs'; import { ApiService } from './api.service'; - import { LoginService } from './login.service'; + describe('LoginService', () => { let service: LoginService; + let store: MockStore; + let apiService: ApiService; let httpTestingController: HttpTestingController; const userLoginData: UserLoginData = { @@ -33,6 +37,8 @@ describe('LoginService', () => { }); httpTestingController = TestBed.inject(HttpTestingController); service = TestBed.inject(LoginService); + store = TestBed.inject(MockStore); + apiService = TestBed.inject(ApiService); }); it('should be created', () => { @@ -60,4 +66,31 @@ describe('LoginService', () => { req.flush(userLoginData); httpTestingController.verify(); }); + + it('#logOut non-login.gov happy path', async () => { + userLoginData.token = 'testVal'; + TestBed.resetTestingModule(); + + spyOn(store, 'dispatch'); + spyOn(apiService, 'postAbsoluteUrl').and.returnValue(of('test')); + + service.logOut(); + expect(store.dispatch).toHaveBeenCalledWith(userLoggedOutAction()); + expect(apiService.postAbsoluteUrl).toHaveBeenCalledTimes(0); + }); + + it('#logOut login.gov happy path', () => { + userLoginData.token = null; + TestBed.resetTestingModule(); + + spyOn(store, 'dispatch'); + spyOn(apiService, 'postAbsoluteUrl').and.returnValue(of('test')); + spyOn(service, 'clearUserLoggedInCookies'); + + service.logOut(); + expect(store.dispatch).toHaveBeenCalledWith(userLoggedOutAction()); + expect(apiService.postAbsoluteUrl).toHaveBeenCalledTimes(1); + expect(service.clearUserLoggedInCookies).toHaveBeenCalledTimes(1); + }); + }); diff --git a/front-end/src/app/shared/services/login.service.ts b/front-end/src/app/shared/services/login.service.ts index 79e9e35393..78e03d50dc 100644 --- a/front-end/src/app/shared/services/login.service.ts +++ b/front-end/src/app/shared/services/login.service.ts @@ -1,24 +1,32 @@ +import { HttpClient } from '@angular/common/http'; import { Injectable } from '@angular/core'; -import { Observable } from 'rxjs'; -import { tap } from 'rxjs/operators'; import { Store } from '@ngrx/store'; import { userLoggedInAction, userLoggedOutAction } from 'app/store/login.actions'; -import { SessionService } from './SessionService/session.service'; +import { selectUserLoginData } from 'app/store/login.selectors'; import { environment } from 'environments/environment'; -import { HttpClient } from '@angular/common/http'; +import { CookieService } from 'ngx-cookie-service'; +import { Observable } from 'rxjs'; +import { tap } from 'rxjs/operators'; import { UserLoginData } from '../models/user.model'; import { ApiService } from './api.service'; +import { SessionService } from './SessionService/session.service'; @Injectable({ providedIn: 'root', }) export class LoginService { + private userLoginData: UserLoginData | null = null; constructor( private store: Store, private sessionService: SessionService, private http: HttpClient, - private apiService: ApiService - ) {} + private apiService: ApiService, + private cookieService: CookieService + ) { + this.store.select(selectUserLoginData).subscribe((userLoginData: UserLoginData) => { + this.userLoginData = userLoginData; + }); + } /** * Logs a user into the API. @@ -55,6 +63,25 @@ export class LoginService { } public logOut() { - this.store.dispatch(userLoggedOutAction()); + if (this.userLoginData && this.userLoginData.token) { // Non-login.gov auth + this.store.dispatch(userLoggedOutAction()); + } else { + this.apiService.postAbsoluteUrl(`${environment.loginDotGovLogoutUrl}`, null).pipe( + tap(() => { + this.clearUserLoggedInCookies(); + this.store.dispatch(userLoggedOutAction()); + }) + ).subscribe(() => undefined); + } } + + public clearUserLoggedInCookies() { + this.cookieService.delete( + environment.ffapiCommitteeIdCookieName); + this.cookieService.delete( + environment.ffapiEmailCookieName); + this.cookieService.delete( + environment.sessionIdCookieName); + } + } diff --git a/front-end/src/environments/environment.cloud.gov.dev.ts b/front-end/src/environments/environment.cloud.gov.dev.ts index ba230496f4..9c5ed8ece7 100644 --- a/front-end/src/environments/environment.cloud.gov.dev.ts +++ b/front-end/src/environments/environment.cloud.gov.dev.ts @@ -11,6 +11,11 @@ export const environment = { fecApiUrl: 'https://api.open.fec.gov/v1/', fecApiKey: 'DVoLzo07NBfrbDZPj0LJs3PS0GIRL3fk4eOp7Zo6', userCanSetFilingFrequency: true, + loginDotGovAuthUrl: 'https://fecfile-web-api-dev.app.cloud.gov/oidc/authenticate', + loginDotGovLogoutUrl: 'https://fecfile-web-api-dev.app.cloud.gov/oidc/logout/', + ffapiCommitteeIdCookieName: 'ffapi_committee_id', + ffapiEmailCookieName: 'ffapi_email', + sessionIdCookieName: 'sessionid', }; /* diff --git a/front-end/src/environments/environment.cloud.gov.prod.ts b/front-end/src/environments/environment.cloud.gov.prod.ts index d7f64dd061..1c91d719f6 100644 --- a/front-end/src/environments/environment.cloud.gov.prod.ts +++ b/front-end/src/environments/environment.cloud.gov.prod.ts @@ -11,6 +11,11 @@ export const environment = { fecApiUrl: 'https://api.open.fec.gov/v1/', fecApiKey: 'EjSyhVzlpDG06QCcWaMtLdDv8qLu2GAPbffHrXRF', userCanSetFilingFrequency: true, + loginDotGovAuthUrl: 'https://fecfile-web-api-prod.app.cloud.gov/oidc/authenticate', + loginDotGovLogoutUrl: 'https://fecfile-web-api-prod.app.cloud.gov/oidc/logout/', + ffapiCommitteeIdCookieName: 'ffapi_committee_id', + ffapiEmailCookieName: 'ffapi_email', + sessionIdCookieName: 'sessionid', }; /* diff --git a/front-end/src/environments/environment.cloud.gov.stage.ts b/front-end/src/environments/environment.cloud.gov.stage.ts index dd87c720c3..18e0988dd9 100644 --- a/front-end/src/environments/environment.cloud.gov.stage.ts +++ b/front-end/src/environments/environment.cloud.gov.stage.ts @@ -11,6 +11,11 @@ export const environment = { fecApiUrl: 'https://api.open.fec.gov/v1/', fecApiKey: 'fWkpM7VN0mjtZXsGyfCJy2zeVtgePB2QhiyZcx2X', userCanSetFilingFrequency: true, + loginDotGovAuthUrl: 'https://fecfile-web-api-stage.app.cloud.gov/oidc/authenticate', + loginDotGovLogoutUrl: 'https://fecfile-web-api-stage.app.cloud.gov/oidc/logout/', + ffapiCommitteeIdCookieName: 'ffapi_committee_id', + ffapiEmailCookieName: 'ffapi_email', + sessionIdCookieName: 'sessionid', }; /* diff --git a/front-end/src/environments/environment.local.ts b/front-end/src/environments/environment.local.ts index f7fd30cb79..ee2973583e 100644 --- a/front-end/src/environments/environment.local.ts +++ b/front-end/src/environments/environment.local.ts @@ -7,4 +7,9 @@ export const environment = { fecApiUrl: 'https://api.open.fec.gov/v1/', fecApiKey: 'DEMO_KEY', userCanSetFilingFrequency: true, + loginDotGovAuthUrl: 'http://localhost:8080/oidc/authenticate', + loginDotGovLogoutUrl: 'http://localhost:8080/oidc/logout/', + ffapiCommitteeIdCookieName: 'ffapi_committee_id', + ffapiEmailCookieName: 'ffapi_email', + sessionIdCookieName: 'sessionid', }; diff --git a/front-end/src/environments/environment.ts b/front-end/src/environments/environment.ts index d35eae7813..f31f37d337 100644 --- a/front-end/src/environments/environment.ts +++ b/front-end/src/environments/environment.ts @@ -11,6 +11,11 @@ export const environment = { fecApiUrl: 'https://api.open.fec.gov/v1/', fecApiKey: 'DEMO_KEY', userCanSetFilingFrequency: true, + loginDotGovAuthUrl: 'http://localhost:8080/oidc/authenticate', + loginDotGovLogoutUrl: 'http://localhost:8080/oidc/logout/', + ffapiCommitteeIdCookieName: 'ffapi_committee_id', + ffapiEmailCookieName: 'ffapi_email', + sessionIdCookieName: 'sessionid', }; /*