我使用Restangular在单页Angular Web应用程序中处理我的令牌/标头身份验证。 使用addFullRequestInterceptor,我使用个人密钥加密数据,为每个传出的REST API调用设置正确的标头。
Restangular
.setBaseUrl(CONSTANTS.API_URL)
.setRequestSuffix('.json')
.setDefaultHeaders({'X-MyApp-ApiKey': CONSTANTS.API_KEY})
.addFullRequestInterceptor(requestInterceptor)
.addErrorInterceptor(errorInterceptor);
function requestInterceptor(element, operation, route, url, headers, params, httpConfig) {
var timeStamp = Helpers.generateTimestamp(),
//Condensed code for illustration purposes
authSign = Helpers.generateAuthenticationHash(hashIngredients, key, token),
allHeaders = angular.extend(headers, {
'X-MyApp-Timestamp': timeStamp,
'Authentication': authSign
});
return {
headers: allHeaders
}
}
效果很好。但是我需要一个例外:对于尚未登录的新访问者,通过REST请求通用密钥/令牌对。此密钥/令牌对用于登录身份验证调用的标头中。 因此,对于此调用,我创建了一个单独的Restangular子配置。在这个配置中,我想覆盖requestInterceptor。但这似乎被忽略了(即仍然调用原始拦截器)。如果我传递null或返回空对象的函数,则无关紧要。
var specialRestInst = Restangular.withConfig(function(RestangularConfigurer) {
RestangularConfigurer.addFullRequestInterceptor(function() {return {}});
}),
timeStamp = Helpers.generateTimestamp(),
header = {'X-MyApp-Timestamp': timeStamp};
specialRestInst.one('initialise').get({id: 'app'}, header)
正如Restangular所记录的那样,withConfig采用基本配置并对其进行扩展。我想知道如何removeFullRequestInterceptor(这个函数不存在),覆盖它或类似的东西。
答案 0 :(得分:0)
我会采用不同的方法并尝试将标志传递给拦截器。如果该标志存在,则排除authSign
。您可以使用withHttpConfig
执行此操作。最好排除特殊情况,然后总是要告诉拦截器包含authSign
。
所以你会像这样更新拦截器。
function requestInterceptor(element, operation, route, url, headers, params, httpConfig) {
var timeStamp = Helpers.generateTimestamp();
var allHeaders = {'X-MyApp-Timestamp': timeStamp};
if(!httpConfig.excludeAuth) {
//Condensed code for illustration purposes
var authSign = Helpers.generateAuthenticationHash(hashIngredients, key, token);
allHeaders['Authentication'] = authSign;
}
return angular.extend(headers, allHeaders);
}
当你需要排除authSign
时,你会像这样使用restangular。
specialRestInst.withHttpConfig({excludeAuth: true}).get({id: 'app'});
您应该可以将任何值添加到您想要的http配置中,只要它们尚未使用过。
我不确定这是否会按预期工作,但我无法理解为什么它无法正常工作。