Android Volley - HTTP 401错误的奇怪问题- java.io.IOException:未找到身份验证挑战

5
当我发送请求并收到401响应代码时,遇到了以下错误:

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

一些人说:
这个错误发生是因为服务器发送了401(未授权),但没有给出“WWW-Authenticate”,这是对客户端下一步操作的提示。 “WWW-Authenticate”标头告诉客户端需要哪种身份验证(基本或摘要)。这在无头Http客户端中通常没有什么用,但这就是标准的定义方式。错误发生是因为库尝试解析“WWW-Authenticate”标头,但无法解析。 ({{link1:android-volley-error No authentication challenges found}})
但对我来说很奇怪,因为我不想使用“WWW-authenticate”技术,我只想得到401代码,但我总是得到异常。
有什么建议可以解决这个问题吗?非常感谢。

你能在服务器端停用WWW身份验证吗? - arthur_gg
我无法对服务器进行更改。 我只想找到一些在客户端处理它的简单方法。 :) - imrhung
为什么不使用WWW-authentication发送标头?可以尝试基本摘要(用户名+密码)。请访问http://www.httpwatch.com/httpgallery/authentication/。 - arthur_gg
你是否期望从服务器收到401状态码?如果是,为什么?正如你所指出的,401是未授权的头部响应。可能在进行API请求时需要提供一些身份验证凭据。 - Andrei Catinean
是的,当登录无效时,服务器会返回 401(没有任何 WWW-authenticate 头),我应该向用户显示“错误登录”消息。但是响应却是 com.android.volley.NoConnectionError,这使我难以将错误检测给用户。 - imrhung
1个回答

6
我已经进行了一些研究并得出结论,这是一个服务器问题,没有遵循惯例。
从维基百科上得到如下信息:
401 Unauthorized (RFC 7235) 类似于403 Forbidden,但是专门用于需要身份验证但是验证失败或尚未提供时的情况。响应必须包含一个WWW-Authenticate头字段,其中包含适用于所请求资源的挑战。参阅基本访问认证和摘要访问认证。
我认为解决这个问题的最好方法是在服务器上添加标头(类似于:
WWW-Authenticate:xBasic realm=""
对于我来说,我无法更改服务器,因此必须检查错误消息以检测401错误:
if (error.getMessage().equalsIgnoreCase("java.io.IOException: No authentication challenges found")){
    showLoginError();
}

目前还没有非常优雅的解决方案,不过这个方法目前可行。

但是如何避免这个错误?因为我在集成Firebase聊天时遇到了这个问题。 - Narendra Singh

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接