5

I have an angularjs app, in which I have an interceptor that adds the authorization token to the header of each request.

However, somewhere in the application I need to use and external API where the interceptor ruins it, because it adds this authorization header which is not acceptable by this external API provider. How can I make angularjs HTTP skip the interceptor, only on this one specific case?

The interceptor code is below:

app.factory('authInterceptorService', ['$q', '$injector', '$location', 'localStorageService', function ($q, $injector, $location, localStorageService) {
    var authInterceptorServiceFactory = {};
    var $http;

    var _request = function (config) {

        config.headers = config.headers || {};

        var authData = localStorageService.get('authorizationData');
        if (authData) {
            //console.log("token: " + authData.token.substring(0, 10));
            //console.log("user: " + authData.userName);
            config.headers.Authorization = 'Bearer ' + authData.token;
        }
        return config;
    }

    var _responseError = function (rejection) {
        var deferred = $q.defer();
        if (rejection.status === 401) {
            var authService = $injector.get('authService');
            authService.refreshToken().then(function (response) {
                _retryHttpRequest(rejection.config, deferred);
            }, function () {
                authService.logOut();
                $location.path('/login');
                deferred.reject(rejection);
            });
        } else {
            deferred.reject(rejection);
        }
        return deferred.promise;
    }

    var _retryHttpRequest = function (config, deferred) {
        console.log('retrying');
        $http = $http || $injector.get('$http');
        $http(config).then(function (response) {
            deferred.resolve(response);
            //console.log("success:" +response);
        }, function (response) {
            deferred.reject(response);
            //console.log("error:" + response);
        });
    }

    authInterceptorServiceFactory.request = _request;
    authInterceptorServiceFactory.responseError = _responseError;

    return authInterceptorServiceFactory;
}]);
2

4 Answers 4

11

Easy

$http.get("url" , {noAuth : true}).then(success(),error());

In the Interceptor

  var _request = function (config) {

    config.headers = config.headers || {};

    var authData = localStorageService.get('authorizationData');
    if (authData && !config.noAuth) {
        //console.log("token: " + authData.token.substring(0, 10));
        //console.log("user: " + authData.userName);
        config.headers.Authorization = 'Bearer ' + authData.token;
    }
    return config;
}
Sign up to request clarification or add additional context in comments.

Comments

5

Simple. Change this line

if (authData) {

to

if (authData && !config.headers.hasOwnProperty('Authorization')) {

And for any request where you do not want the header applied, use

$http({
    headers { Authorization: null },
    // and the rest
})

Comments

5

Write like this :-

   var _request = function (config) {
    if (config.url.indexOf('yourExternalApiUrl') > -1) {
         return config;
    } else {
         config.headers = config.headers || {};
         var authData = localStorageService.get('authorizationData');
         if (authData) {
             //console.log("token: " + authData.token.substring(0, 10));
             //console.log("user: " + authData.userName);
             config.headers.Authorization = 'Bearer ' + authData.token;
         }
    return config;
    }        
}

For more details you can see : http://www.codemosquitoes.com/2016/06/using-angularjs-interceptors-with-http.html

Comments

1

If you are looking for the auth0 interceptor:

export class InterceptorService implements HttpInterceptor {
    constructor(private auth: AuthService) {}

    intercept(req: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {

        var allow = ['/assets/i18n/de.json', '/assets/i18n/en.json'];

        if (allow.includes(req.url)) {
            const noToken = req.clone();
            return next.handle(noToken);
        }
        return this.auth.getTokenSilently$().pipe(
            mergeMap(token => {
                const tokenReq = req.clone({
                    setHeaders: { Authorization: `Bearer ${token}` }
                });
                return next.handle(tokenReq);
            }),
            catchError(err => throwError(err))
        );
    }
}

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.