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

Rus*_*ler 11 authentication android android-volley

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

我试图找到我们的主站点的API,它适用于一个帐户,但不适用于另一个帐户.我正在尝试弄清楚请求URL /标题中的差异以及响应中的内容,但我似乎无法在排序代码中找到将其打印到日志中的方法.

我得到的错误是

com.android.volley.NoConnectionError: java.io.IOException: No authentication challenges found
Run Code Online (Sandbox Code Playgroud)

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

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

谢谢

pat*_*ckf 8

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

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

  • 添加一个假的"WWW-Authenticate"标题,如:WWW-Authenticate: Basic realm="fake".这仅仅是一种解决方法而不是解决方案,但它应该可以工作并且http客户端很满意.
  • 使用HTTP状态代码403而不是401.它的语义不一样,通常在使用登录401时是正确的响应(请参阅此处进行详细讨论),但其足够接近.

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

正如@ErikZ在他的帖子中写道,你可以使用try&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(); 
}
Run Code Online (Sandbox Code Playgroud)

我也在这里发布了这个:java.io.IOException:没有发现身份验证挑战


Xav*_*Gil 8

实际上,我已经通过WWW-Authenticate在服务器响应中包含标头来解决了这个问题.

但是,如果添加标头WWW-Authenticate: Basic realm=""并且Web客户端也使用了API,则某些Web浏览器将触发弹出窗口,询问基本凭据.

对我来说,正确的解决方案一直在使用自定义方案.正如本文中所解释的那样,我使用xBasic而不是Basic在标题响应中.

WWW-Authenticate: xBasic realm=""

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


归档时间:

查看次数:

13076 次

最近记录:

9 年 前