环境:
- 我正在我的手机应用程序中使用typeahead/bloodhound作为搜索字段(类固醇/cordova)
- 从我的应用程序到API的每个请求都需要签名,并将签名添加到auth头中
显然,在ajax设置中设置头是不起作用的,因为bloodhound发送的每个请求都不同,需要不同的签名。
在我的第一个实现中,我使用beforeSend
ajax设置来实现这一点。只需计算该函数中的签名并将其添加到请求标头中。
然而,这不是很安全,所以我决定将使用的秘密和签名计算放入Cordova自定义插件的本地代码中进行编译。不是防弹的,而是合理的安全性。
由于Cordova插件是异步的,beforeSend
在这种情况下变得毫无用处。该功能将在标头的签名和设置完成之前完成。
总之,问题是:如何使用typeahead/bloodhound异步计算和设置这些标头?
好吧,解决方案似乎是fork和hack。首先修改_getFromRemote
,通过添加类似于remote.replace
的remote.headers
选项来消除对beforeSend
的需要,只是它返回一个延迟对象
if (this.remote.headers) {
$.when(
this.remote.headers(url, query, this.remote.ajax)
).done(function(headers) {
that.remote.ajax.headers = headers;
deferred.resolve(that.transport.get(url, that.remote.ajax, handleRemoteResponse));
});
} else {
deferred.resolve(this.transport.get(url, this.remote.ajax, handleRemoteResponse));
}
然后修改使用它来处理延迟的get函数
if (matches.length < this.limit && this.transport) {
cacheHitPromise = this._getFromRemote(query, returnRemoteMatches);
cacheHitPromise.done(function(hit) {
if (!hit) {
(matches.length > 0 || !this.transport) && cb && cb(matches);
}
});
}
现在,我可以自由地使用异步本机代码来签名和设置请求验证标头:)