【问题标题】:Volley throwing AuthFailureError (401) with Basic HTTP AuthenticationVolley 使用基本 HTTP 身份验证抛出 AuthFailureError (401)
【发布时间】:2022-03-03 22:04:30
【问题描述】:

我正在尝试使用 Volley 库在 Android 应用程序中发出 GET 请求。此 GET 请求用于使用基本 HTTP 身份验证验证帐户凭据。我验证了带有凭据的 URL 在我的浏览器中有效,因为它返回了成功的 XML。格式为:

http://username:password@myanimelist.net/api/account/verify_credentials.xml

usernamepassword 显然代表真实的用户凭据。 Volley 抛出此错误:

 BasicNetwork.performRequest: Unexpected response code 401 for http://username:password@myanimelist.net/api/account/verify_credentials.xml

这是我处理请求的 Android 代码:

private static final String HTTP_PRE = "http://";
private static final String VERIFY_CREDENTIALS = "myanimelist.net/api/account/verify_credentials.xml";

public void verifyCredentials(String username, String password) {
    RequestQueue queue = Volley.newRequestQueue(context);
    String url = HTTP_PRE + username + ":" + password + "@" + VERIFY_CREDENTIALS;

    StringRequest stringRequest = new StringRequest(Request.Method.GET, url, new Response.Listener<String>() {

        @Override
        public void onResponse(String response) {
            processResponse(response);
        }
    }, new Response.ErrorListener() {

        @Override
        public void onErrorResponse(VolleyError error) {
            // handle error
            Log.d(TAG, "error: " + error.getMessage());
        }
    });

    queue.add(stringRequest);
}

这个覆盖 getHeaders() 方法的解决方案提供了相同的结果: How does one use Basic Authentication with Volley on Android?.

这是我对该解决方案的实现:

@Override
public Map<String, String> getHeaders() throws AuthFailureError {
    Map<String, String> params = super.getHeaders();
    if (params == null){
        params = new HashMap<>();
    }
    String creds = String.format("%s:%s", username, password);

    params.put("Authorization", creds);

    return params;
}

在没有直接内置在 URL 中的凭据的情况下返回此错误:

BasicNetwork.performRequest: Unexpected response code 401 for http://myanimelist.net/api/account/verify_credentials.xml

如果有人可以提供建议,我将不胜感激。这是我第一次使用基本 HTTP 身份验证,所以我可能会遗漏一些明显的东西。

【问题讨论】:

    标签: android get android-volley basic-authentication


    【解决方案1】:

    我按照这里的第一个答案解决了这个问题:Http Authentication in android using volley library。我曾尝试过类似的解决方案和许多其他解决方案,但这是唯一有效的解决方案。

    【讨论】:

      【解决方案2】:

      基本身份验证使用 BASE64 编码。你不见了

      String creds = String.format("%s:%s", username, password);
      creds = Base64.encodeToString(creds.getBytes(), Base64.NO_WRAP);
      

      Authorization HTTP 标头需要指明使用的方法(基本|摘要)。最后你的标题应该是这样的:

      GET http://username:password@myanimelist.net/api/account/verify_credentials.xml
      Accept: text/xml,text/plain
      ...
      Authorization: Basic XXXXXXXXXXXXXX==
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-08-24
        • 2022-07-04
        • 2011-11-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-12-09
        • 2021-03-21
        相关资源
        最近更新 更多