如何在typeahead/bloodhound中异步设置请求头



环境:

  • 我正在我的手机应用程序中使用typeahead/bloodhound作为搜索字段(类固醇/cordova)
  • 从我的应用程序到API的每个请求都需要签名,并将签名添加到auth头中

显然,在ajax设置中设置头是不起作用的,因为bloodhound发送的每个请求都不同,需要不同的签名。

在我的第一个实现中,我使用beforeSend ajax设置来实现这一点。只需计算该函数中的签名并将其添加到请求标头中。

然而,这不是很安全,所以我决定将使用的秘密和签名计算放入Cordova自定义插件的本地代码中进行编译。不是防弹的,而是合理的安全性。

由于Cordova插件是异步的,beforeSend在这种情况下变得毫无用处。该功能将在标头的签名和设置完成之前完成。

总之,问题是:如何使用typeahead/bloodhound异步计算和设置这些标头?

好吧,解决方案似乎是fork和hack。首先修改_getFromRemote,通过添加类似于remote.replaceremote.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);
        }
     });
}

现在,我可以自由地使用异步本机代码来签名和设置请求验证标头:)

相关内容

  • 没有找到相关文章

最新更新