在Cordova / Ionic iOS应用程序中使用WWW-Authenticate处理HTTP 401

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

当应用程序的用户未经身份validation时(如果他们的会话已过期或以其他方式),API将使用HTTP 401响应,并带有WWW-Authenticate标头。

在浏览器中,虽然开发这是好的,但在iPhone上,或在模拟器中,它不会出现,应用程序必须达到请求的超时期限。 达到超时时,请求被取消。 这意味着在JavaScript中,我们简单地返回一个0的HTTP状态,没有真实的数据来确定是否有超时或authentication问题。

目前,我已经进行了一些有教育的猜测,例如在超时发生时检查电话是否具有连接性等,但是这不是一个理想的解决scheme,因为用户仍然需要等待超时,并不总是正确的。

如何检查HTTP 401对话框何时出现,并期望得到响应? 我需要能够确定什么时候发生了实际的401,以及什么时候请求超时。

如果在JavaScript中有一个方法可以完成的话,那就太棒了。 本地解决scheme也可以工作,无论是插件还是其他方式。

我目前正在处理同样的问题。

问题是,当一个401被返回时,它有一个WWW-Authenticate块,它告诉浏览器popup那个小的popup框让你再试一次。 这不是在iOS Web容器中处理“正确”(取决于你猜的是谁),这导致Cordova永远不会看到请求。 cordova的错误logging在这里: https : //issues.apache.org/jira/browse/CB-2415

我不明白这个重大问题还没有解决。 但是我相信这里面有一些技术性的东西。 如果您查看更新,您会看到Tobias Bocanegra( https://github.com/tripodsan/cordova-ios/commit/5f0133c026d6e21c93ab1ca0e146e125dfbe8f7e )添加了“快速入侵”来解决问题。 也许这可以帮助你进一步。 在我的情况下,这并没有帮助我。

在我的情况下,我做了一个临时修复:我将http请求传递给加载模式,它有一个取消button。 所以,取决于用户的取消还是等待。 这太可怕了,但对我来说很有效。 (内部应用程序等)

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

http://codingsmackdown.tv/blog/2013/01/02/using-response-interceptors-to-show-and-hide-a-loading-widget/

在下一个error handling程序代码中,您可以添加一些代码来评估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); } 

另请参阅有关拦截器的AngularJS文档 。