我正在创建一个简单的AngularJS应用,该应用使用Alfresco作为提供的REST API的后端。
首先,通过返回令牌(alf_ticket
)的适当服务执行身份验证,并且在成功进行身份验证后,该令牌必须作为URL参数发送到后续请求中。
就我而言,Alfresco REST API不支持接收令牌作为HTTP标头的一部分;这可能是最好的选择,因为通过配置$ http默认值来解决问题会很简单,只需提一个我能想到的选项。
在这种情况下,我担心我只能将每个请求中的alf_ticket
令牌作为参数发送到后端,例如:
GET /alfresco/s/api/people/admin/preferences?alf_ticket=TICKET_f79aa9eb2f839cefd1e1c7e4f579379ec06c33ed
我知道$resource提供了默认参数的机制,但这些是$ resource的每个实例的特定默认值。
到目前为止,我一直在考虑以下方法:
/alfresco/s/api/people/admin/preferences:alf_ticket
);然后通过parameterDefault
提供从当前会话数据中获取令牌的适当函数。理想情况下,我会寻找$resource或$http的全局配置,类似于配置默认标头($httpProvider.defaults.headers
)的方式,但我担心这样两种服务都没有提供功能......
答案 0 :(得分:9)
使用$ http拦截器。
创建一个工厂函数,该函数重新配置任何URL的请求,只有在设置参数时才将auth令牌添加到参数中:
app.factory('httpRequestInterceptor', function (Auth) {
return {
request: function (config) {
if (Auth.token) {
config.url = URI(config.url).addSearch({'_auth_token':Auth.token}).toString();
}
return config;
}
};
})
(请注意,我使用URI.js添加参数,因为我在this blog post之后设置了答案,作者也使用了该答案。
将$httpProvider
传递到config
块,并将拦截器服务的名称字符串推送到其interceptor
数组中:
.config(function ($httpProvider) {
$httpProvider.interceptors.push('httpRequestInterceptor');
})
在浏览器执行之前,任何$http
个请求(包括$resource
包含的请求)都会被截获并修改(如果适用)。