Skip to content

Instantly share code, notes, and snippets.

@monkov
Created May 27, 2018 13:31
Show Gist options
  • Save monkov/6bf7e385a565ae842153a78777349852 to your computer and use it in GitHub Desktop.
Save monkov/6bf7e385a565ae842153a78777349852 to your computer and use it in GitHub Desktop.
@Injectable()
export class AuthInterceptor implements HttpInterceptor
{
constructor(private _router: Router) { }
intercept(req: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>>
{
let token = localStorage.getItem('api-token');
if (token) {
req = req.clone({
setHeaders: {
'api-token': token
}
} );
}
return next.handle(req).catch(err => {
console.log(err);
if (err.status === 401) {
if (err.error.message == "Token is exp") {
//Genrate params for token refreshing
let params = {
token: token,
refreshToken: localStorange("refreshToken");
};
return this.http.post('localhost:8080/auth/refresh', params).flatMap(
(data: any) => {
//If reload successful update tokens
if (data.status == 200) {
//Update tokens
localStorange.setItem("api-token", data.result.token);
localStorange.setItem("refreshToken", data.result.refreshToken);
//Clone our fieled request ant try to resend it
req = req.clone({
setHeaders: {
'api-token': data.result.token
}
});
return next.handle(req).catch(err => {
//Catch another error
});
}else {
//Logout from account
}
}
);
}else {
//Logout from account or do some other stuff
}
}
return Observable.throw(err);
});
}
}
@knowncolor
Copy link

For anyone trying to do this with later Angular versions, this is working for me.

   intercept(req: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
        return next.handle(req).pipe(
            catchError(e => {

                console.log("in catch error: " + e);
                if (e.status === 401) {
                    let refreshToken = this.store.getRefreshToken();

                    return this.authenticationService.loginWithRefreshToken(refreshToken).pipe(
                        flatMap(auth => {
                            this.store.setAuthTokens(auth.accessToken, auth.refreshToken);

                            req = req.clone({
                                setHeaders: {
                                    Authorization: "Bearer " + auth.accessToken
                                }
                            });

                            return next.handle(req);
                        })
                    );
                }
                return next.handle(req);
            })
        );
    }

@jlgranda
Copy link

Thank you. Your save my life in 2022 :)

@xskreblin
Copy link

@knowncolor also saved 2022 ☺

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment