import { Injectable } from '@angular/core';
import { HttpEvent, HttpInterceptor, HttpHandler, HttpRequest, HttpErrorResponse } from '@angular/common/http';
import { Observable } from "rxjs/Observable";
import { Adal4Service } from '../adal/adal4.service';
import { Router } from '@angular/router'; @Injectable()
export class AuthInterceptor implements HttpInterceptor { constructor(
private adalService: Adal4Service,
private router: Router
) { } intercept(request: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
const resource = this.adalService.GetResourceForEndpoint(request.url);
let authenticatedCall: Observable<HttpEvent<any>>;
if (resource) {
if (this.adalService.userInfo.authenticated) {
authenticatedCall = this.adalService.acquireToken(resource)
.flatMap((token: string) => {
request = request.clone({
setHeaders: {
Authorization: `Bearer ${token}`
}
});
return next.handle(request).catch(this.handleError);
});
}
else {
this.adalService.refreshDataFromCache();
authenticatedCall = Observable.throw(new Error('User Not Authenticated.'));
}
}
else { authenticatedCall = next.handle(request).catch(this.handleError); } return authenticatedCall;
} private handleError(err: HttpErrorResponse): Observable<any> {
if (err.status === 401 || err.status === 403) {
console.log(err.message);
this.router.navigate(['dataService'], {});
return Observable.of(err.message);
}
// handle your auth error or rethrow
return Observable.throw(err);
}
}

Adal4Interceptor

import { Injectable } from '@angular/core';
import { HttpRequest, HttpHandler, HttpEvent, HttpInterceptor } from '@angular/common/http';
import { Observable } from 'rxjs/Observable'; import { Adal4Service } from './adal4.service'; @Injectable()
export class Adal4Interceptor implements HttpInterceptor {
constructor(public adal4Service: Adal4Service) { }
intercept(request: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> { request = request.clone({
setHeaders: {
Authorization: `Bearer ${this.adal4Service.userInfo.token}`
}
});
return next.handle(request);
}
}

adal4service

import { Injectable } from '@angular/core';
import { Observable } from 'rxjs';
import { Adal4User } from './adal4-user';
import * as adalLib from 'adal-angular';
import { adal } from 'adal-angular'; import User = adal.User; @Injectable()
export class Adal4Service { private adalContext: adal.AuthenticationContext; private adal4User: Adal4User = {
authenticated: false,
username: '',
error: '',
token: '',
profile: {}
}; constructor() { } public init(configOptions: adal.Config) {
if (!configOptions) {
throw new Error('You must set config, when calling init.');
} const existingHash = window.location.hash; let pathDefault = window.location.href;
if (existingHash) {
pathDefault = pathDefault.replace(existingHash, '');
} configOptions.redirectUri = configOptions.redirectUri || pathDefault;
configOptions.postLogoutRedirectUri = configOptions.postLogoutRedirectUri || pathDefault; this.adalContext = adalLib.inject(configOptions); window.AuthenticationContext = this.adalContext.constructor; this.updateDataFromCache(this.adalContext.config.loginResource);
} public get config(): adal.Config {
return this.adalContext.config;
} public get userInfo(): Adal4User {
return this.adal4User;
} public login(): void {
this.adalContext.login();
} public loginInProgress(): boolean {
return this.adalContext.loginInProgress();
} public logOut(): void {
this.adalContext.logOut();
} public handleWindowCallback(): void {
const hash = window.location.hash;
if (this.adalContext.isCallback(hash)) {
const requestInfo = this.adalContext.getRequestInfo(hash);
this.adalContext.saveTokenFromHash(requestInfo);
if (requestInfo.requestType === this.adalContext.REQUEST_TYPE.LOGIN) {
this.updateDataFromCache(this.adalContext.config.loginResource); } else if (requestInfo.requestType === this.adalContext.REQUEST_TYPE.RENEW_TOKEN) {
this.adalContext.callback = window.parent.callBackMappedToRenewStates[requestInfo.stateResponse];
} if (requestInfo.stateMatch) {
if (typeof this.adalContext.callback === 'function') {
if (requestInfo.requestType === this.adalContext.REQUEST_TYPE.RENEW_TOKEN) {
if (requestInfo.parameters['access_token']) {
this.adalContext.callback(this.adalContext._getItem(this.adalContext.CONSTANTS.STORAGE.ERROR_DESCRIPTION)
, requestInfo.parameters['access_token']);
}
else if (requestInfo.parameters['error']) {
this.adalContext.callback(this.adalContext._getItem(this.adalContext.CONSTANTS.STORAGE.ERROR_DESCRIPTION), null);
this.adalContext._renewFailed = true;
}
}
}
}
} if (window.location.hash) {
window.location.href = window.location.href.replace(window.location.hash, '');
}
} public getCachedToken(resource: string): string {
return this.adalContext.getCachedToken(resource);
} public acquireToken(resource: string) {
const _this = this; let errorMessage: string;
return Observable.bindCallback(acquireTokenInternal, function (token: string) {
if (!token && errorMessage) {
throw (errorMessage);
}
return token;
})(); function acquireTokenInternal(cb: any) {
let s: string = null; _this.adalContext.acquireToken(resource, (error: string, tokenOut: string) => {
if (error) {
_this.adalContext.error('Error when acquiring token for resource: ' + resource, error);
errorMessage = error;
cb(<string>null);
} else {
cb(tokenOut);
s = tokenOut;
}
});
return s;
}
} public getUser(): Observable<any> {
return Observable.bindCallback((cb: (u: adal.User) => User) => {
this.adalContext.getUser(function (error: string, user: adal.User) {
if (error) {
this.adalContext.error('Error when getting user', error);
cb(null);
} else {
cb(user);
}
});
})();
} public clearCache(): void {
this.adalContext.clearCache();
} public clearCacheForResource(resource: string): void {
this.adalContext.clearCacheForResource(resource);
} public info(message: string): void {
this.adalContext.info(message);
} public verbose(message: string): void {
this.adalContext.verbose(message);
} public GetResourceForEndpoint(url: string): string {
return this.adalContext.getResourceForEndpoint(url);
} public refreshDataFromCache() {
this.updateDataFromCache(this.adalContext.config.loginResource);
} private updateDataFromCache(resource: string): void {
const token = this.adalContext.getCachedToken(resource);
this.adal4User.authenticated = token !== null && token.length > 0;
const user = this.adalContext.getCachedUser() || { userName: '', profile: undefined };
if (user) {
this.adal4User.username = user.userName;
this.adal4User.profile = user.profile;
this.adal4User.token = token;
this.adal4User.error = this.adalContext.getLoginError();
} else {
this.adal4User.username = '';
this.adal4User.profile = {};
this.adal4User.token = '';
this.adal4User.error = '';
}
};
}

Adal4User

export class Adal4User {
authenticated: boolean;
username: string;
error: string;
profile: any;
token: string;
}

adal-angular.d

declare var AuthenticationContext: adal.AuthenticationContextStatic;

declare namespace adal {

    interface Config {
tenant?: string;
clientId: string;
redirectUri?: string;
instance?: string;
endpoints?: any;
popUp?: boolean;
localLoginUrl?: string;
displayCall?: (urlNavigate: string) => any;
postLogoutRedirectUri?: string;
cacheLocation?: string;
anonymousEndpoints?: string[];
expireOffsetSeconds?: number;
correlationId?: string;
loginResource?: string;
resource?: string;
extraQueryParameter?: string;
navigateToLoginRequestUrl?: boolean;
} interface User {
userName: string;
profile: any;
} interface RequestInfo {
valid: boolean;
parameters: any;
stateMatch: boolean;
stateResponse: string;
requestType: string;
} interface AuthenticationContextStatic {
new (config: Config): AuthenticationContext;
} interface AuthenticationContext { CONSTANTS: any; REQUEST_TYPE: {
LOGIN: string,
RENEW_TOKEN: string,
UNKNOWN: string
}; callback: any; _getItem: any; _renewFailed: any; instance: string;
config: Config; login(): void; loginInProgress(): boolean; getCachedToken(resource: string): string; getCachedUser(): User; registerCallback(expectedState: string, resource: string, callback: (message: string, token: string) => any): void; acquireToken(resource: string, callback: (message: string, token: string) => any): void; promptUser(urlNavigate: string): void; clearCache(): void; clearCacheForResource(resource: string): void; logOut(): void; getUser(callback: (message: string, user?: User) => any): void; isCallback(hash: string): boolean; getLoginError(): string; getRequestInfo(hash: string): RequestInfo; saveTokenFromHash(requestInfo: RequestInfo): void; getResourceForEndpoint(endpoint: string): string; handleWindowCallback(): void; log(level: number, message: string, error: any): void;
error(message: string, error: any): void;
warn(message: string): void;
info(message: string): void;
verbose(message: string): void;
}
} interface Window {
AuthenticationContext: any;
callBackMappedToRenewStates: any;
}

logged-in.guard

import { Injectable } from '@angular/core';
import { CanActivate, ActivatedRouteSnapshot, RouterStateSnapshot } from '@angular/router';
import { Adal4Service } from './adal4.service'; @Injectable()
export class LoggedInGuard implements CanActivate{ constructor(private adalService: Adal4Service,
) {
} canActivate(
route: ActivatedRouteSnapshot,
state: RouterStateSnapshot
): boolean {
this.adalService.handleWindowCallback();
if (this.adalService.userInfo.authenticated) {
return true;
} else {
this.adalService.login();
return false;
}
}
}

【angular5项目积累总结】结合adal4实现http拦截器(token)的更多相关文章

  1. 【angular5项目积累总结】遇到的一些问题以及解决办法

    1.项目中字符串特别是\r\n,替换成br之后,在页面换行无法生效? 答:绑定元素 innerHTML. <div class="panel-body" [innerHTML ...

  2. 【angular5项目积累总结】avatar组件

    View Code import { Component, HostListener, ElementRef } from '@angular/core'; import { Adal4Service ...

  3. 【angular5项目积累总结】优秀组件以及应用实例

    1.手机端 图片预览组件 组件:sideshow 效果图:(预览图全屏 且可以左右移动)                  code: <div class="row ui-app-s ...

  4. 【angular5项目积累总结】消息订阅服务

    code import { Injectable } from '@angular/core'; import { Subject } from 'rxjs/Subject'; @Injectable ...

  5. 【angular5项目积累总结】侧栏菜单 navmenu

    View Code import { Component, OnInit } from '@angular/core'; import { HttpClient } from '@angular/co ...

  6. 【angular5项目积累总结】breadcrumb面包屑组件

    view code <div class="fxs-breadcrumb-wrapper" aria-label="Navigation history" ...

  7. 【angular5项目积累总结】文件上传

    <div class="form-group row"> <label class="col-sm-2 col-form-label"> ...

  8. 【angular5项目积累总结】文件下载

    download() { const token = localStorage.getItem('token'); let headers: HttpHeaders = new HttpHeaders ...

  9. 【angular5项目积累总结】自定义管道 OrderBy

    import { Injectable, Pipe } from '@angular/core'; @Pipe({ name: 'orderBy' }) @Injectable() export cl ...

随机推荐

  1. 解决rpm conflicts with file from package的两个方法

    1.卸载掉冲突的文件,安装新的文件.如果由于由于依赖关系导致要卸载很多软件,那可以优先考虑下一个方法. 2.安装的时候增加–replacefiles参数,例如 rpm -ivh xxx.rpm –re ...

  2. Seaching TreeVIew WPF

    项目中有一个树形结构的资源,需要支持搜索功能,搜索出来的结果还是需要按照树形结构展示,下面是简单实现的demo. 1.首先创建TreeViewItem的ViewModel,一般情况下,树形结构都包含D ...

  3. @JsonInclude、@JsonFormat、@DateTimeFormat注解的使用

    @JsonInclude(value=Include.NON_NULL) :用在实体类的方法类的头上  作用是实体类的参数查询到的为null的不显示 @DateTimeFormat:用于接收 前端传的 ...

  4. 【sping揭秘】9、容器内部事件发布(二)

    写在前面---------------------------------- 命运多舛,痴迷淡然 不知下一步该往哪里走,现在应该是我的迷茫期... 加油,快点走出去!!! 聪明的网友们,你们有没有迷茫 ...

  5. POJ 2492

    #include<iostream> #include<stdio.h> #define MAXN 2050 using namespace std; int pre[MAXN ...

  6. [转]Use HandleBars in Express

    http://fraserxu.me/posts/Using-Handlebarsjs-with-Expressjs/ 在Express项目中使用Handlebars模板引擎 31 Aug 2014 ...

  7. 安装Centos7 随手记

    1.老笔记本安装Centos7 配置:酷睿I3  内存8G 2.原有系统Win7 将原来的硬盘空间,调整出60G 给Centos7 用. 3.安装Centos7 图形介面的,和windows安装过程类 ...

  8. ElasticSearch入门3: Spring Boot集成ElasticSearch

    第一步:创建项目elasticsearch 编写pom文件 <?xml version="1.0" encoding="UTF-8"?> <p ...

  9. C# 多线程学习系列二

    一.关于前台线程和后台线程 1.简介 CLR中线程分为两种类型,一种是前台线程.另一种是后台线程. 前台线程:应用程序的主线程.Thread构造的线程都默认为前台线程 后台线程:线程池线程都为后台线程 ...

  10. pcm原始数据绘制

    最近帮别人做了个东西,这里分享一下pcm原始数据绘图的思路 1.pcm数据采样位数,根据采样位数选取适合自己绘图的采样点的数量 2.计算出最大最小的的采样点的值差 3.根据要显示pcm数据的控件宽高, ...