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)的详细内容...
声明:本文来自网络,不代表【好得很程序员自学网】立场,转载请注明出处:http://haodehen.cn/did223122