2013-10-05 197 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'])' –