android - volley error未找到身份验证挑战

时间:2013-12-16 17:12:01

标签: android authentication android-volley

我正在尝试使用一些遗留代码,并在使用凌空时遇到问题。

我正在尝试使用我们的主站点的api,它适用于一个帐户,但不适用于另一个帐户。我试图弄清楚请求网址/标题中的差异以及回复中的内容,但我似乎无法在排球代码中找到一种方法将其打印到日志。

我得到的错误是

com.android.volley.NoConnectionError: java.io.IOException: No authentication challenges found

我已经读到这可能是由于401响应,但我不知道这意味着什么,或者至少如何证明/测试它。我真的很困惑,它适用于一个帐户而不是另一个帐户。

网址略有不同,因为我们的英国网站和我们的AM是另一个,但除此之外没有区别。

由于

5 个答案:

答案 0 :(得分:8)

发生此错误是因为服务器发送401(未授权)但未提供“WWW-Authenticate”,这是客户端下一步操作的提示。 “WWW-Authenticate”标题告诉客户端需要哪种身份验证(BasicDigest)。这在无头http客户端中通常不是很有用,但这就是标准的定义方式。发生此错误是因为lib尝试解析“WWW-Authenticate”标头但不能解析。

如果您可以更改服务器,可能的解决方案:

  • 添加假的“WWW-Authenticate”标题,如:WWW-Authenticate: Basic realm="fake"。这仅仅是一种解决方法而不是解决方案,但它应该可以工作并且http客户端很满意。
  • 使用HTTP状态代码403代替401。它的语义不一样,通常在使用登录401时是正确的响应(see here for a detailed discussion),但它足够接近。

如果您无法更改服务器,可能的解决方案:

正如@ErikZ在他的post中写道,你可以试试看& catch

HttpURLConnection connection = ...;
try {
    // Will throw IOException if server responds with 401.
    connection.getResponseCode(); 
} catch (IOException e) {
    // Will return 401, because now connection has the correct internal state.
    int responsecode = connection.getResponseCode(); 
}

我也在这里发布了这个:java.io.IOException : No authentication challenges found

答案 1 :(得分:8)

确实,我通过在服务器响应中包含WWW-Authenticate标头解决了这个问题。

但是,如果您添加标头WWW-Authenticate: Basic realm=""并且您的API也被网络客户端使用,则某些网络浏览器会触发弹出请求基本凭据。

对我来说,正确的解决方案一直在使用自定义方案。正如本blog post中所述,我在标头响应中使用xBasic而不是Basic

WWW-Authenticate: xBasic realm=""

使用此标头,不仅Volley正确解析响应,而且还避免显示身份验证弹出的Web浏览器。

答案 2 :(得分:0)

初始化凌空RequestQueue时,我能够抓住这个客户端:

Volley.newRequestQueue(getApplicationContext(), new HurlStack() {
        @Override
        public HttpResponse performRequest(Request<?> request, Map<String, String> additionalHeaders) {
            try {
                return super.performRequest(request, additionalHeaders);
            } catch (AuthFailureError authFailureError) {
                authFailureError.printStackTrace();
                // Log out / whatever you need to do here
            } catch (IOException e) {
                e.printStackTrace();
                if (e.getMessage().equals("No authentication challenges found")) {
                    // This is the error.  You probably will want to handle any IOException, not just those with the same message.
                }
            }
            return null;
        }
});

答案 3 :(得分:0)

如果服务器崩溃,您可能会遇到此问题。 步骤进行:

  1. 停止tomcat服务器

  2. goto Run - &gt;服务 - &gt;重启你的数据库(例如:postgres)

  3. 启动tomcat服务器。

答案 4 :(得分:0)

您可以检查e是AutofFailureError的实例。

Log.e(TAG, "AuthFailureError: " + (e instanceof AuthFailureError));