2013-10-05 160 views
2

这看起来很简单:我试图添加一个请求拦截器,使用Angular 1.1.5将OAuth承载标记添加到$ http请求中。这里是我的拦截器:

app.factory('bearerTokenInterceptor', function($injector, $q) { 
    /* 
    * This interceptor is available for providers that use the header based 
    * bearer token for authentication 
    */ 
    return { 
    request: function(config) { 
     /* 
     * We need to use $injector to get access to the Token provider within 
     * the body of the ctor - lest we want circular references created 
     * by providers that need to use the interceptor (and also need the 
     * Token provider 
     */ 
     var Token = $injector.get('Token'); 
     config.headers.get = {'Authorization': 'Bearer ' + Token.get() }; 
     return config || $q.when(config); 
    } 
    }; 
}); 

然后

app.config(function(TokenProvider, YammerTokenVerifier, $httpProvider) {  
    TokenProvider.extendConfig({ 
    authorizationEndpoint: 'https://www.yammer.com/dialog/oauth', 
    verifyFunc: YammerTokenVerifier 
    }); 

    /* 
    * Yammer uses a bearer token - in comes the BearerTokenInterceptor! 
    */ 
    $httpProvider.interceptors.push('bearerTokenInterceptor'); 
}); 

但是当我真正然后使用$ HTTP

$http.get('https://www.yammer.com/api/v1/users/current.json') 
    .success(function(data) { 
    deferred.resolve(data); 
    }) 
    .error(function(data, status, headers, config) { 
    console.log(data); 
    console.log(status); 
    console.log(headers); 
    console.log(config); 
    deferred.reject(data); 
    }); 

请求拦截器是没有得到调用。我没有看到我正在做的事情,这超出了Angular的文档所暗示的。我错过了什么?

+0

你不应该注入$注入器并调用get注入器。为什么不直接请求'Token'而不是'$ injector'? – ganaraj

+0

当我以标准方式进行操作时,库中的模式会导致循环引用。这是打破它的唯一方法。 –

回答

4

我试过你的代码,没关系。你只需要确保你实际上使用角度js。 1.1.5。试试这个:https://ajax.googleapis.com/ajax/libs/angularjs/1.1.5/angular.min.js

因为在以前的版本中,$httpProvider.interceptors未定义并且试图调用$httpProvider.interceptors.push('bearerTokenInterceptor');会引发异常。

Fiddle

更新:

如果在另一个模块注册您的工厂,您需要使用这样的代码的依赖添加到该模块:

var app = angular.module('yourapp',['factoryModule']); 
app.config(function(TokenProvider, YammerTokenVerifier, $httpProvider) {  
    TokenProvider.extendConfig({ 
    authorizationEndpoint: 'https://www.yammer.com/dialog/oauth', 
    verifyFunc: YammerTokenVerifier 
    }); 

    $httpProvider.interceptors.push('bearerTokenInterceptor'); 
}); 
+1

刚刚尝试过。工作正常! – ksimons

+0

如果拦截器工厂在配置它的模块的不同角度模块中注册,它会有所作为吗? –

+0

@Ryan Norris:是的。在这种情况下,您必须使用如下代码引用拦截器工厂已注册的模块:'var app = angular('yourapp',['factoryModule'])' –