SPA: basket component, authentication service, basket list
This commit is contained in:
		
							parent
							
								
									ac146f4475
								
							
						
					
					
						commit
						c0c7d735e8
					
				@ -19,8 +19,6 @@ services:
 | 
				
			|||||||
      - BasketUrl=http://basket.api:5103
 | 
					      - BasketUrl=http://basket.api:5103
 | 
				
			||||||
    ports:
 | 
					    ports:
 | 
				
			||||||
      - "5100:5100"
 | 
					      - "5100:5100"
 | 
				
			||||||
    links:
 | 
					 | 
				
			||||||
      - identity.service:10.0.75.1
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
  webspa:
 | 
					  webspa:
 | 
				
			||||||
    environment:
 | 
					    environment:
 | 
				
			||||||
 | 
				
			|||||||
@ -47,3 +47,5 @@ services:
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
  basket.data:
 | 
					  basket.data:
 | 
				
			||||||
    image: redis
 | 
					    image: redis
 | 
				
			||||||
 | 
					    ports:
 | 
				
			||||||
 | 
					      - "6379:6379"
 | 
				
			||||||
 | 
				
			|||||||
@ -41,8 +41,8 @@ namespace eShopOnContainers.Identity.Configuration
 | 
				
			|||||||
                    ClientName = "eShop SPA OpenId Client",
 | 
					                    ClientName = "eShop SPA OpenId Client",
 | 
				
			||||||
                    AllowedGrantTypes = GrantTypes.Implicit,
 | 
					                    AllowedGrantTypes = GrantTypes.Implicit,
 | 
				
			||||||
                    AllowAccessTokensViaBrowser = true,
 | 
					                    AllowAccessTokensViaBrowser = true,
 | 
				
			||||||
                    RedirectUris =           { $"{clientsUrl["Spa"]}/callback.html" },
 | 
					                    RedirectUris =           { $"{clientsUrl["Spa"]}/" },
 | 
				
			||||||
                    PostLogoutRedirectUris = { $"{clientsUrl["Spa"]}/index.html" },
 | 
					                    PostLogoutRedirectUris = { $"{clientsUrl["Spa"]}/" },
 | 
				
			||||||
                    AllowedCorsOrigins =     { $"{clientsUrl["Spa"]}" },
 | 
					                    AllowedCorsOrigins =     { $"{clientsUrl["Spa"]}" },
 | 
				
			||||||
                    AllowedScopes =
 | 
					                    AllowedScopes =
 | 
				
			||||||
                    {
 | 
					                    {
 | 
				
			||||||
@ -83,7 +83,8 @@ namespace eShopOnContainers.Identity.Configuration
 | 
				
			|||||||
                    {
 | 
					                    {
 | 
				
			||||||
                        $"{clientsUrl["Mvc"]}/signin-oidc",
 | 
					                        $"{clientsUrl["Mvc"]}/signin-oidc",
 | 
				
			||||||
                        "http://104.40.62.65:5100/signin-oidc", 
 | 
					                        "http://104.40.62.65:5100/signin-oidc", 
 | 
				
			||||||
                        "http://localhost:5100"
 | 
					                        "http://localhost:5100/signin-oidc",
 | 
				
			||||||
 | 
					                        "http://13.88.8.119:5100/signin-oidc"
 | 
				
			||||||
                    },
 | 
					                    },
 | 
				
			||||||
                    PostLogoutRedirectUris = new List<string>
 | 
					                    PostLogoutRedirectUris = new List<string>
 | 
				
			||||||
                    {
 | 
					                    {
 | 
				
			||||||
 | 
				
			|||||||
@ -7,7 +7,8 @@
 | 
				
			|||||||
                </a>
 | 
					                </a>
 | 
				
			||||||
            </div>
 | 
					            </div>
 | 
				
			||||||
            <div class="col-sm-2">
 | 
					            <div class="col-sm-2">
 | 
				
			||||||
                <esh-basket-status></esh-basket-status>
 | 
					                <esh-basket-status *ngIf="Authenticated"></esh-basket-status>
 | 
				
			||||||
 | 
					                <esh-identity *ngIf="!Authenticated"></esh-identity>
 | 
				
			||||||
            </div>
 | 
					            </div>
 | 
				
			||||||
        </div>
 | 
					        </div>
 | 
				
			||||||
    </div>
 | 
					    </div>
 | 
				
			||||||
 | 
				
			|||||||
@ -1,8 +1,10 @@
 | 
				
			|||||||
import { Title } from '@angular/platform-browser';
 | 
					import { Title } from '@angular/platform-browser';
 | 
				
			||||||
import { Component, ViewEncapsulation, OnInit } from '@angular/core';
 | 
					import { Component, ViewEncapsulation, OnInit } from '@angular/core';
 | 
				
			||||||
import { RouterModule } from '@angular/router';
 | 
					import { RouterModule } from '@angular/router';
 | 
				
			||||||
 | 
					import { Subscription }   from 'rxjs/Subscription';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import { DataService } from './shared/services/data.service';
 | 
					import { DataService } from './shared/services/data.service';
 | 
				
			||||||
 | 
					import { SecurityService } from './shared/services/security.service';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/*
 | 
					/*
 | 
				
			||||||
 * App Component
 | 
					 * App Component
 | 
				
			||||||
@ -10,22 +12,24 @@ import { DataService } from './shared/services/data.service';
 | 
				
			|||||||
 */
 | 
					 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@Component({
 | 
					@Component({
 | 
				
			||||||
  selector: 'appc-app',
 | 
					    selector: 'appc-app',
 | 
				
			||||||
  styleUrls: ['./app.component.scss'],
 | 
					    styleUrls: ['./app.component.scss'],
 | 
				
			||||||
  templateUrl: './app.component.html'
 | 
					    templateUrl: './app.component.html'
 | 
				
			||||||
})
 | 
					})
 | 
				
			||||||
export class AppComponent implements OnInit {
 | 
					export class AppComponent implements OnInit {
 | 
				
			||||||
 | 
					    private Authenticated: boolean = false;
 | 
				
			||||||
 | 
					    subscription: Subscription;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    constructor(private titleService: Title, private securityService: SecurityService) {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  constructor(private titleService: Title) {
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  }
 | 
					    ngOnInit() {
 | 
				
			||||||
 | 
					        console.log('app on init');
 | 
				
			||||||
 | 
					        this.subscription = this.securityService.authenticationChallenge$.subscribe(res => this.Authenticated = res);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  ngOnInit() {
 | 
					    public setTitle(newTitle: string) {
 | 
				
			||||||
 | 
					        this.titleService.setTitle('eShopOnContainers');
 | 
				
			||||||
  }
 | 
					    }
 | 
				
			||||||
 | 
					 | 
				
			||||||
  public setTitle(newTitle: string) {
 | 
					 | 
				
			||||||
    this.titleService.setTitle('eShopOnContainers');
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
				
			|||||||
@ -19,10 +19,15 @@ export class BasketStatusComponent implements OnInit {
 | 
				
			|||||||
    ngOnInit() {
 | 
					    ngOnInit() {
 | 
				
			||||||
        this.subscription = this.basketEvents.addItemToBasket$.subscribe(
 | 
					        this.subscription = this.basketEvents.addItemToBasket$.subscribe(
 | 
				
			||||||
            item => {
 | 
					            item => {
 | 
				
			||||||
 | 
					                console.log('element received in basket');
 | 
				
			||||||
                console.log(item);
 | 
					                console.log(item);
 | 
				
			||||||
                this.service.setBasket(item);
 | 
					                this.service.setBasket(item).subscribe(res => {
 | 
				
			||||||
                this.service.getBasket().subscribe(basket => {
 | 
					                    console.log(res);
 | 
				
			||||||
                    this.badge = basket.items.length;
 | 
					                    this.service.getBasket().subscribe(basket => {
 | 
				
			||||||
 | 
					                        this.badge = basket.items.length;
 | 
				
			||||||
 | 
					                        console.log('response from basket api');
 | 
				
			||||||
 | 
					                        console.log(basket.items.length);
 | 
				
			||||||
 | 
					                    });
 | 
				
			||||||
                });
 | 
					                });
 | 
				
			||||||
            });
 | 
					            });
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
				
			|||||||
@ -1,7 +1,8 @@
 | 
				
			|||||||
import { Injectable } from '@angular/core';
 | 
					import { Injectable } from '@angular/core';
 | 
				
			||||||
import { Response } from '@angular/http';
 | 
					import { Response, Headers } from '@angular/http';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import { DataService } from '../shared/services/data.service';
 | 
					import { DataService } from '../shared/services/data.service';
 | 
				
			||||||
 | 
					import { SecurityService } from '../shared/services/security.service';
 | 
				
			||||||
import { IBasket } from '../shared/models/basket.model';
 | 
					import { IBasket } from '../shared/models/basket.model';
 | 
				
			||||||
import { IBasketItem } from '../shared/models/basketItem.model';
 | 
					import { IBasketItem } from '../shared/models/basketItem.model';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -19,13 +20,16 @@ export class BasketService {
 | 
				
			|||||||
        items: []
 | 
					        items: []
 | 
				
			||||||
    };
 | 
					    };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    constructor(private service: DataService) {
 | 
					    constructor(private service: DataService, private authService: SecurityService) {
 | 
				
			||||||
        this.basket.items = [];
 | 
					        this.basket.items = [];
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    setBasket(item) {
 | 
					    setBasket(item): Observable<boolean> {
 | 
				
			||||||
 | 
					        console.log('set basket');
 | 
				
			||||||
        this.basket.items.push(item);
 | 
					        this.basket.items.push(item);
 | 
				
			||||||
        this.service.post(this.basket.buyerId, this.basket.items);
 | 
					        return this.service.post(this.basketUrl + '/', this.basket).map((response: Response) => {
 | 
				
			||||||
 | 
					            return true;
 | 
				
			||||||
 | 
					        });
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    getBasket(): Observable<IBasket> {
 | 
					    getBasket(): Observable<IBasket> {
 | 
				
			||||||
 | 
				
			|||||||
@ -0,0 +1 @@
 | 
				
			|||||||
 | 
					<button (click)="login()">Login</button>
 | 
				
			||||||
@ -0,0 +1,3 @@
 | 
				
			|||||||
 | 
					.identity {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
@ -0,0 +1,38 @@
 | 
				
			|||||||
 | 
					import { Component, OnInit, OnChanges, Output, Input, EventEmitter } from '@angular/core';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import { IIdentity } from '../../models/identity.model';
 | 
				
			||||||
 | 
					import { SecurityService } from  '../../services/security.service';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					@Component({
 | 
				
			||||||
 | 
					    selector: 'esh-identity',
 | 
				
			||||||
 | 
					    templateUrl: './identity.html',
 | 
				
			||||||
 | 
					    styleUrls: ['./identity.scss']
 | 
				
			||||||
 | 
					})
 | 
				
			||||||
 | 
					export class Identity implements OnInit  {
 | 
				
			||||||
 | 
					    constructor(private service: SecurityService) {
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    @Output()
 | 
				
			||||||
 | 
					    changed: EventEmitter<number> = new EventEmitter<number>();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    @Input()
 | 
				
			||||||
 | 
					    model: IIdentity;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    ngOnInit() {
 | 
				
			||||||
 | 
					        console.log("ngOnInit _securityService.AuthorizedCallback");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        if (window.location.hash) {
 | 
				
			||||||
 | 
					            this.service.AuthorizedCallback();
 | 
				
			||||||
 | 
					            console.log('isAutorized?');
 | 
				
			||||||
 | 
					            console.log(this.service.IsAuthorized);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    login() {
 | 
				
			||||||
 | 
					        this.service.Authorize();
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    logout() {
 | 
				
			||||||
 | 
					        this.service.Logoff();
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
@ -0,0 +1,3 @@
 | 
				
			|||||||
 | 
					export interface IIdentity {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
@ -8,15 +8,19 @@ import { Observer } from 'rxjs/Observer';
 | 
				
			|||||||
import 'rxjs/add/operator/map';
 | 
					import 'rxjs/add/operator/map';
 | 
				
			||||||
import 'rxjs/add/operator/catch';
 | 
					import 'rxjs/add/operator/catch';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import { SecurityService } from './security.service';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@Injectable()
 | 
					@Injectable()
 | 
				
			||||||
export class DataService {
 | 
					export class DataService {
 | 
				
			||||||
 | 
					    constructor(private http: Http, private securityService: SecurityService) { }
 | 
				
			||||||
    constructor(private http: Http) { }
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
    get(url: string, params?: any): Observable<Response> {
 | 
					    get(url: string, params?: any): Observable<Response> {
 | 
				
			||||||
        let options: RequestOptionsArgs = {};
 | 
					        let options: RequestOptionsArgs = {};
 | 
				
			||||||
        options.headers = new Headers();
 | 
					
 | 
				
			||||||
        this.addCors(options);
 | 
					        if (this.securityService) {
 | 
				
			||||||
 | 
					            options.headers = new Headers();
 | 
				
			||||||
 | 
					            options.headers.append("Authorization", "Bearer " + this.securityService.GetToken());
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
        
 | 
					        
 | 
				
			||||||
        return this.http.get(url, options).map(
 | 
					        return this.http.get(url, options).map(
 | 
				
			||||||
            (res: Response) => {
 | 
					            (res: Response) => {
 | 
				
			||||||
@ -24,13 +28,18 @@ export class DataService {
 | 
				
			|||||||
        }).catch(this.handleError);
 | 
					        }).catch(this.handleError);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    post(url: string, data: any, params?: any) {
 | 
					    post(url: string, data: any, params?: any): Observable<Response> {
 | 
				
			||||||
        return this.http.post(url, data, params);
 | 
					        let options: RequestOptionsArgs = {};
 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
    private addCors(options: RequestOptionsArgs): RequestOptionsArgs {
 | 
					        if (this.securityService) {
 | 
				
			||||||
        options.headers.append('Access-Control-Allow-Origin', '*');
 | 
					            options.headers = new Headers();
 | 
				
			||||||
        return options;
 | 
					            options.headers.append("Authorization", "Bearer " + this.securityService.GetToken());
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        return this.http.post(url, data, options).map(
 | 
				
			||||||
 | 
					            (res: Response) => {
 | 
				
			||||||
 | 
					                return res;
 | 
				
			||||||
 | 
					            }).catch(this.handleError);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    private handleError(error: any) {
 | 
					    private handleError(error: any) {
 | 
				
			||||||
 | 
				
			|||||||
@ -0,0 +1,247 @@
 | 
				
			|||||||
 | 
					import { Injectable } from '@angular/core';
 | 
				
			||||||
 | 
					import { Http, Response, Headers } from '@angular/http';
 | 
				
			||||||
 | 
					import 'rxjs/add/operator/map';
 | 
				
			||||||
 | 
					import { Observable } from 'rxjs/Observable';
 | 
				
			||||||
 | 
					import { Subject }    from 'rxjs/Subject';
 | 
				
			||||||
 | 
					//import { Configuration } from '../app.constants';
 | 
				
			||||||
 | 
					import { Router } from '@angular/router';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					@Injectable()
 | 
				
			||||||
 | 
					export class SecurityService {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    private actionUrl: string;
 | 
				
			||||||
 | 
					    private headers: Headers;
 | 
				
			||||||
 | 
					    private storage: any;
 | 
				
			||||||
 | 
					    private authenticationSource = new Subject<boolean>();
 | 
				
			||||||
 | 
					    authenticationChallenge$ = this.authenticationSource.asObservable();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    constructor(private _http: Http, private _router: Router) {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        //this.actionUrl = _configuration.Server + 'api/DataEventRecords/';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        this.headers = new Headers();
 | 
				
			||||||
 | 
					        this.headers.append('Content-Type', 'application/json');
 | 
				
			||||||
 | 
					        this.headers.append('Accept', 'application/json');
 | 
				
			||||||
 | 
					        this.storage = sessionStorage; //localStorage;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        if (this.retrieve("IsAuthorized") !== "") {
 | 
				
			||||||
 | 
					            //this.HasAdminRole = this.retrieve("HasAdminRole");
 | 
				
			||||||
 | 
					            this.IsAuthorized = this.retrieve("IsAuthorized");
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public IsAuthorized: boolean;
 | 
				
			||||||
 | 
					    //public HasAdminRole: boolean;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public GetToken(): any {
 | 
				
			||||||
 | 
					        return this.retrieve("authorizationData");
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public ResetAuthorizationData() {
 | 
				
			||||||
 | 
					        this.store("authorizationData", "");
 | 
				
			||||||
 | 
					        this.store("authorizationDataIdToken", "");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        this.IsAuthorized = false;
 | 
				
			||||||
 | 
					        //this.HasAdminRole = false;
 | 
				
			||||||
 | 
					        this.store("HasAdminRole", false);
 | 
				
			||||||
 | 
					        this.store("IsAuthorized", false);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public UserData: any;
 | 
				
			||||||
 | 
					    public SetAuthorizationData(token: any, id_token:any) {
 | 
				
			||||||
 | 
					        if (this.retrieve("authorizationData") !== "") {
 | 
				
			||||||
 | 
					            this.store("authorizationData", "");
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        this.store("authorizationData", token);
 | 
				
			||||||
 | 
					        this.store("authorizationDataIdToken", id_token);
 | 
				
			||||||
 | 
					        this.IsAuthorized = true;
 | 
				
			||||||
 | 
					        this.store("IsAuthorized", true);
 | 
				
			||||||
 | 
					        //emit observable
 | 
				
			||||||
 | 
					        this.authenticationSource.next(true);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        this.getUserData()
 | 
				
			||||||
 | 
					            .subscribe(data => this.UserData = data,
 | 
				
			||||||
 | 
					            error => this.HandleError(error),
 | 
				
			||||||
 | 
					            () => {
 | 
				
			||||||
 | 
					                console.log(this.UserData);
 | 
				
			||||||
 | 
					            });
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public Authorize() {
 | 
				
			||||||
 | 
					        this.ResetAuthorizationData();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        console.log("BEGIN Authorize, no auth data");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        var authorizationUrl = 'http://localhost:5105/connect/authorize';
 | 
				
			||||||
 | 
					        var client_id = 'js';
 | 
				
			||||||
 | 
					        var redirect_uri = 'http://localhost:5104/';
 | 
				
			||||||
 | 
					        var response_type = "id_token token";
 | 
				
			||||||
 | 
					        var scope = "openid profile orders basket";
 | 
				
			||||||
 | 
					        var nonce = "N" + Math.random() + "" + Date.now();
 | 
				
			||||||
 | 
					        var state = Date.now() + "" + Math.random();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        this.store("authStateControl", state);
 | 
				
			||||||
 | 
					        this.store("authNonce", nonce);
 | 
				
			||||||
 | 
					        console.log("AuthorizedController created. adding myautostate: " + this.retrieve("authStateControl"));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        var url =
 | 
				
			||||||
 | 
					            authorizationUrl + "?" +
 | 
				
			||||||
 | 
					            "response_type=" + encodeURI(response_type) + "&" +
 | 
				
			||||||
 | 
					            "client_id=" + encodeURI(client_id) + "&" +
 | 
				
			||||||
 | 
					            "redirect_uri=" + encodeURI(redirect_uri) + "&" +
 | 
				
			||||||
 | 
					            "scope=" + encodeURI(scope) + "&" +
 | 
				
			||||||
 | 
					            "nonce=" + encodeURI(nonce) + "&" +
 | 
				
			||||||
 | 
					            "state=" + encodeURI(state);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        window.location.href = url;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public AuthorizedCallback() {
 | 
				
			||||||
 | 
					        console.log("BEGIN AuthorizedCallback, no auth data");
 | 
				
			||||||
 | 
					        this.ResetAuthorizationData();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        var hash = window.location.hash.substr(1);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        var result: any = hash.split('&').reduce(function (result : any, item: string) {
 | 
				
			||||||
 | 
					            var parts = item.split('=');
 | 
				
			||||||
 | 
					            result[parts[0]] = parts[1];
 | 
				
			||||||
 | 
					            return result;
 | 
				
			||||||
 | 
					        }, {});
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        console.log(result);
 | 
				
			||||||
 | 
					        console.log("AuthorizedCallback created, begin token validation");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        var token = "";
 | 
				
			||||||
 | 
					        var id_token = "";
 | 
				
			||||||
 | 
					        var authResponseIsValid = false;
 | 
				
			||||||
 | 
					        if (!result.error) {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            if (result.state !== this.retrieve("authStateControl")) {
 | 
				
			||||||
 | 
					                console.log("AuthorizedCallback incorrect state");
 | 
				
			||||||
 | 
					            } else {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                token = result.access_token;
 | 
				
			||||||
 | 
					                id_token = result.id_token
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                var dataIdToken: any = this.getDataFromToken(id_token);
 | 
				
			||||||
 | 
					                console.log(dataIdToken);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                // validate nonce
 | 
				
			||||||
 | 
					                if (dataIdToken.nonce !== this.retrieve("authNonce")) {
 | 
				
			||||||
 | 
					                    console.log("AuthorizedCallback incorrect nonce");
 | 
				
			||||||
 | 
					                } else {
 | 
				
			||||||
 | 
					                    this.store("authNonce", "");
 | 
				
			||||||
 | 
					                    this.store("authStateControl", "");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                    authResponseIsValid = true;
 | 
				
			||||||
 | 
					                    console.log("AuthorizedCallback state and nonce validated, returning access token");
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        if (authResponseIsValid) {
 | 
				
			||||||
 | 
					            this.SetAuthorizationData(token, id_token);
 | 
				
			||||||
 | 
					            console.log(this.retrieve("authorizationData"));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            // router navigate to DataEventRecordsList
 | 
				
			||||||
 | 
					            this._router.navigate(['/dataeventrecords/list']);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        else {
 | 
				
			||||||
 | 
					            this.ResetAuthorizationData();
 | 
				
			||||||
 | 
					            this._router.navigate(['/Unauthorized']);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public Logoff() {
 | 
				
			||||||
 | 
					        // /connect/endsession?id_token_hint=...&post_logout_redirect_uri=https://myapp.com
 | 
				
			||||||
 | 
					        console.log("BEGIN Authorize, no auth data");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        var authorizationUrl = 'http://localhost:5105/connect/endsession';
 | 
				
			||||||
 | 
					        console.log(this.retrieve("authorizationDataIdToken"));
 | 
				
			||||||
 | 
					        var id_token_hint = this.retrieve("authorizationDataIdToken");
 | 
				
			||||||
 | 
					        var post_logout_redirect_uri = 'http://localhost:5104/';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        var url =
 | 
				
			||||||
 | 
					            authorizationUrl + "?" +
 | 
				
			||||||
 | 
					            "id_token_hint=" + encodeURI(id_token_hint) + "&" +
 | 
				
			||||||
 | 
					            "post_logout_redirect_uri=" + encodeURI(post_logout_redirect_uri);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        this.ResetAuthorizationData();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        window.location.href = url;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public HandleError(error: any) {
 | 
				
			||||||
 | 
					        console.log(error);
 | 
				
			||||||
 | 
					        if (error.status == 403) {
 | 
				
			||||||
 | 
					            this._router.navigate(['/Forbidden'])
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        else if (error.status == 401) {
 | 
				
			||||||
 | 
					            this.ResetAuthorizationData();
 | 
				
			||||||
 | 
					            this._router.navigate(['/Unauthorized'])
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    private urlBase64Decode(str: string) {
 | 
				
			||||||
 | 
					        var output = str.replace('-', '+').replace('_', '/');
 | 
				
			||||||
 | 
					        switch (output.length % 4) {
 | 
				
			||||||
 | 
					            case 0:
 | 
				
			||||||
 | 
					                break;
 | 
				
			||||||
 | 
					            case 2:
 | 
				
			||||||
 | 
					                output += '==';
 | 
				
			||||||
 | 
					                break;
 | 
				
			||||||
 | 
					            case 3:
 | 
				
			||||||
 | 
					                output += '=';
 | 
				
			||||||
 | 
					                break;
 | 
				
			||||||
 | 
					            default:
 | 
				
			||||||
 | 
					                throw 'Illegal base64url string!';
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        return window.atob(output);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    private getDataFromToken(token: any) {
 | 
				
			||||||
 | 
					        var data = {};
 | 
				
			||||||
 | 
					        if (typeof token !== 'undefined') {
 | 
				
			||||||
 | 
					            var encoded = token.split('.')[1];
 | 
				
			||||||
 | 
					            data = JSON.parse(this.urlBase64Decode(encoded));
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        return data;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    private retrieve(key: string): any {
 | 
				
			||||||
 | 
					        var item = this.storage.getItem(key);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        if (item && item !== 'undefined') {
 | 
				
			||||||
 | 
					            return JSON.parse(this.storage.getItem(key));
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        return;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    private store(key: string, value: any) {
 | 
				
			||||||
 | 
					        this.storage.setItem(key, JSON.stringify(value));
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    private getUserData = (): Observable<string[]> => {
 | 
				
			||||||
 | 
					        this.setHeaders();
 | 
				
			||||||
 | 
					        return this._http.get('http://localhost:5105/connect/userinfo', {
 | 
				
			||||||
 | 
					            headers: this.headers,
 | 
				
			||||||
 | 
					            body: ''
 | 
				
			||||||
 | 
					        }).map(res => res.json());
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    private setHeaders() {
 | 
				
			||||||
 | 
					        this.headers = new Headers();
 | 
				
			||||||
 | 
					        this.headers.append('Content-Type', 'application/json');
 | 
				
			||||||
 | 
					        this.headers.append('Accept', 'application/json');
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        var token = this.GetToken();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        if (token !== "") {
 | 
				
			||||||
 | 
					            this.headers.append('Authorization', 'Bearer ' + token);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
@ -17,9 +17,11 @@ import { DataService } from './services/data.service';
 | 
				
			|||||||
import { UtilityService } from './services/utility.service';
 | 
					import { UtilityService } from './services/utility.service';
 | 
				
			||||||
import { UppercasePipe } from './pipes/uppercase.pipe';
 | 
					import { UppercasePipe } from './pipes/uppercase.pipe';
 | 
				
			||||||
import { BasketWrapperService} from './services/basket.wrapper.service';
 | 
					import { BasketWrapperService} from './services/basket.wrapper.service';
 | 
				
			||||||
 | 
					import { SecurityService } from './services/security.service';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
//Components:
 | 
					//Components:
 | 
				
			||||||
import {Pager } from './components/pager/pager';
 | 
					import {Pager } from './components/pager/pager';
 | 
				
			||||||
 | 
					import {Identity } from './components/identity/identity';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@NgModule({
 | 
					@NgModule({
 | 
				
			||||||
    imports: [
 | 
					    imports: [
 | 
				
			||||||
@ -39,7 +41,8 @@ import {Pager } from './components/pager/pager';
 | 
				
			|||||||
        ErrorSummaryComponent,
 | 
					        ErrorSummaryComponent,
 | 
				
			||||||
        PageHeadingComponent,
 | 
					        PageHeadingComponent,
 | 
				
			||||||
        UppercasePipe,
 | 
					        UppercasePipe,
 | 
				
			||||||
        Pager
 | 
					        Pager, 
 | 
				
			||||||
 | 
					        Identity
 | 
				
			||||||
    ],
 | 
					    ],
 | 
				
			||||||
    exports: [
 | 
					    exports: [
 | 
				
			||||||
        // Modules
 | 
					        // Modules
 | 
				
			||||||
@ -57,9 +60,9 @@ import {Pager } from './components/pager/pager';
 | 
				
			|||||||
        //HeaderComponent,
 | 
					        //HeaderComponent,
 | 
				
			||||||
        PageHeadingComponent,
 | 
					        PageHeadingComponent,
 | 
				
			||||||
        UppercasePipe,
 | 
					        UppercasePipe,
 | 
				
			||||||
        Pager
 | 
					        Pager, 
 | 
				
			||||||
 | 
					        Identity
 | 
				
			||||||
    ]
 | 
					    ]
 | 
				
			||||||
 | 
					 | 
				
			||||||
})
 | 
					})
 | 
				
			||||||
export class SharedModule {
 | 
					export class SharedModule {
 | 
				
			||||||
    static forRoot(): ModuleWithProviders {
 | 
					    static forRoot(): ModuleWithProviders {
 | 
				
			||||||
@ -70,7 +73,8 @@ export class SharedModule {
 | 
				
			|||||||
                DataService,
 | 
					                DataService,
 | 
				
			||||||
                FormControlService,
 | 
					                FormControlService,
 | 
				
			||||||
                UtilityService,
 | 
					                UtilityService,
 | 
				
			||||||
                BasketWrapperService
 | 
					                BasketWrapperService, 
 | 
				
			||||||
 | 
					                SecurityService
 | 
				
			||||||
            ]
 | 
					            ]
 | 
				
			||||||
        };
 | 
					        };
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
				
			|||||||
@ -17,8 +17,8 @@ namespace eShopConContainers.WebSPA
 | 
				
			|||||||
                .UseKestrel()
 | 
					                .UseKestrel()
 | 
				
			||||||
                .UseConfiguration(config)
 | 
					                .UseConfiguration(config)
 | 
				
			||||||
                .UseContentRoot(Directory.GetCurrentDirectory())
 | 
					                .UseContentRoot(Directory.GetCurrentDirectory())
 | 
				
			||||||
 | 
					                .UseUrls("http://localhost:5104/")
 | 
				
			||||||
                .UseIISIntegration()
 | 
					                .UseIISIntegration()
 | 
				
			||||||
                //.UseUrls("http://localhost:5104/")
 | 
					 | 
				
			||||||
                .UseStartup<Startup>()
 | 
					                .UseStartup<Startup>()
 | 
				
			||||||
                .Build();
 | 
					                .Build();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user