Javascript 在Cordova/Ionic iOS应用程序中使用WWW身份验证处理HTTP 401

Javascript 在Cordova/Ionic iOS应用程序中使用WWW身份验证处理HTTP 401,javascript,ios,objective-c,cordova,ionic,Javascript,Ios,Objective C,Cordova,Ionic,我目前正在开发一款基于Cordova和Ionic的移动应用程序。我正在处理一个第三方API(即它不能,也不会被更改以使此应用程序正常工作) 当应用程序的用户未经身份验证时(如果他们的会话已过期或其他情况),API将使用HTTP 401和WWW Authenticate头进行响应 在开发过程中,在浏览器中这样做是可以的,但在iPhone或模拟器中,它不会出现,并且应用程序必须达到请求的超时时间。当达到该超时时,请求被取消。这意味着在JavaScript中,我们只需返回HTTP状态0,没有实际数据来

我目前正在开发一款基于Cordova和Ionic的移动应用程序。我正在处理一个第三方API(即它不能,也不会被更改以使此应用程序正常工作)

当应用程序的用户未经身份验证时(如果他们的会话已过期或其他情况),API将使用HTTP 401和WWW Authenticate头进行响应

在开发过程中,在浏览器中这样做是可以的,但在iPhone或模拟器中,它不会出现,并且应用程序必须达到请求的超时时间。当达到该超时时,请求被取消。这意味着在JavaScript中,我们只需返回HTTP状态0,没有实际数据来确定是否存在超时或身份验证问题

目前,我已经做了一些有根据的猜测,比如在超时时检查手机是否连接等,但这不是一个理想的解决方案,因为用户仍然需要等待超时,而且并不总是正确的

如何检查HTTP 401对话框何时出现并期待响应?我需要能够识别实际401发生的时间,以及请求何时超时


如果JavaScript中有一个方法可以实现,那就太好了。本机解决方案也可以工作,无论是插件还是其他方式。

我不确定为什么第三方API不会向您发送正常的HTTP错误代码。如果使用
$http
连接到API,则可以向其添加响应拦截器,例如,阅读下一篇文章:

在下一个错误处理程序代码中,您可以添加一些代码来评估HTTP状态代码:

function error(response) {
    // Added code for specific HTTP error codes
    if (response.status === 401) {
        console.log('Received 401');
    }

    // get $http via $injector because of circular dependency problem
    $http = $http || $injector.get('$http');
    if($http.pendingRequests.length < 1) {
        $('#loadingWidget').hide();
    }
    return $q.reject(response);
}
功能错误(响应){
//添加了特定HTTP错误代码的代码
如果(response.status==401){
console.log('Received 401');
}
//由于循环依赖性问题,通过$injector获取$http
$http=$http | |$injector.get(“$http”);
如果($http.pendingRequests.length<1){
$('#loadingWidget').hide();
}
返回$q.reject(响应);
}

另请参见。

我目前正在处理同一问题

问题是当401被返回时,它有一个WWW-Authenticate块,它告诉浏览器弹出一个小弹出窗口供您重试。这在iOS web容器中没有得到“正确”的处理(我想这取决于你问谁),这导致Cordova永远看不到请求。 cordova错误记录在此处:

我不明白这么大的问题怎么还没有解决。但我确信这其中有一些技术细节。如果您查看更新,您会看到Tobias Bocanegra()添加了一个“快速破解”来解决问题。也许这对你有帮助。这对我的处境没有帮助

我在我的案例中所做的临时修复: 我将http请求传递到加载模式,该模式有一个取消按钮。因此,这取决于用户是否取消或只是等待。这很可怕,但对我来说很有效。(内部应用程序等)

本机解决方案也可以工作,无论是插件还是其他

我也有同样的问题,我可以用cordova http插件修复它。只需通过爱奥尼亚插件添加cordova插件高级http安装即可。然后您的xhttp调用将以本机方式完成,而不是在webView之外。然后带有“WWW Authenticate”标题的响应将不再超时,您可以正确处理
401

您可以在代码中使用它,如下所示:

try { // important since it will not work in dev mode in your browser (e.g. chrome)
    if (cordova && cordova.plugin && cordova.plugin.http) {

        var server_url = 'https://example.com';
        var your_endpoind = '/auth-me-example';

        cordova.plugin.http.useBasicAuth('some_user', 'and_password');
        cordova.plugin.http.setHeader(server_url, 'Content-type', 'application/json');

        cordova.plugin.http.get(server_url + your_endpoind, {}, {}, function (response) {
            console.log('response: ', JSON.stringify(response));
        }, function (response) {
            console.error('error response: ', JSON.stringify(response));
        });
    }
} catch (e) {
    console.error('could not make native HTTP request!');
}

PS:如果您使用的是angular2+
npm安装——save@ionic native/http
也非常有用

在一个正常的浏览器中,它确实工作得很好,正如我曾经尝试过的那样——然而,在手机上,在应用程序中,我们从未收到提示输入401的详细信息,因此请求最终到达超时,并被取消。直到请求完成后,拦截器才会启动。到那时,它已经超时,我们的状态为0。状态0可能来自实际超时,或类似以下的身份验证失败。。。或者是别的什么。