【问题标题】:How does one use Basic Authentication with Volley on Android?如何在 Android 上使用带有 Volley 的基本身份验证?
【发布时间】:2013-05-29 15:26:01
【问题描述】:

我正在查看示例和代码,但没有看到任何实现。在现阶段这可能吗?

【问题讨论】:

标签: android android-volley


【解决方案1】:

对于那些不想为此使用 Spring for Android 的人,这里是如何做到的。

@Override
public Map<String, String> getHeaders() throws AuthFailureError {
    HashMap<String, String> params = new HashMap<String, String>();
    String creds = String.format("%s:%s","USERNAME","PASSWORD");
    String auth = "Basic " + Base64.encodeToString(creds.getBytes(), Base64.DEFAULT);
    params.put("Authorization", auth);
    return params;
}

请注意,您可能必须使用 Base64.NO_WRAP 而不是 Base64.DEFAULT 才能使其正常工作。正如 cmets 所指出的那样。

API 8+

【讨论】:

  • 这真的很好,因为 APK 的最终大小对于小型项目非常重要。
  • 值得注意的是,我需要使用 Base64.NO_WRAP 而不是 Base64.DEFAULT 才能为我工作。
  • @Logiraptor 您的评论帮助我修复了 Andrpiod 2.3 设备上的 400 错误。问题的原因可能是什么?
  • 即使我不得不使用 Base64.NO_WRAP 而不是 Base64.DEFAULT 才能工作。我正在使用 Play,当我使用 Base64.DEFAULT 时,它给出了异常 p.nettyException - Exception caught in Netty java.lang.IllegalArgumentException: Header name cannot contain the following prohibited characters: =,;: \t\r\n\v\f 。知道为什么吗?另请使用此更改编辑您的帖子。
  • 是的,您必须使用 NO_WRAP,否则换行符可能会将编码字符串分成两行,这对于 HTTP 标头是不允许的。换行符始终表示新的标题行。 base64 字符串的第二行不是导致此异常的有效标题行。
【解决方案2】:

是的,这是可能的。您需要覆盖 Request.getHeaders()。我很懒,我使用 Spring for Android 的 HttpHeaders 和 HttpAuthentication ,但您可以构建 auth 标头并从方法中返回它。从 getHeaders() 您可以返回基本身份验证的身份验证标头。这是一个带有基本身份验证的示例请求。

public class GetUser extends Request<User> {

    private static final String TAG = GetUser.class.getName();

    private Response.Listener<User> mListener;
    private ObjectMapper mMapper = new ObjectMapper();

    public GetUser(Response.ErrorListener errorListener, Response.Listener<User> listener){
        super(Method.GET, PoisUtils.BASE_URL + "/users", errorListener);

        mListener = listener;
    }

    @Override
    protected Response<User> parseNetworkResponse(NetworkResponse response) {
        String jsonString = new String(response.data);
        try {
            User result = mMapper.readValue(jsonString, User.class);
            return Response.success(result, getCacheEntry());
        } catch (IOException e) {
            Log.d(TAG, e.getMessage());
        }
        return null;
    }

    @Override
    protected void deliverResponse(User response) {
        mListener.onResponse(response);
    }

    @Override
    public Map<String, String> getHeaders() throws AuthFailureError {
        return AuthUtils.buildAuthHeaders().toSingleValueMap();
    }
}

这是我构建身份验证标头的方式

public static HttpHeaders buildAuthHeaders(){

    if(UserUtils.isUserLogged()){
        HttpHeaders requestHeaders = new HttpHeaders();
        User user = PoisApplication.get().getUser();

        HttpAuthentication auth = new HttpBasicAuthentication(
                user.getUsername(), user.getPassword());
        requestHeaders.setAuthorization(auth);

        return requestHeaders;
    }
    return null;
}

【讨论】:

  • 感谢您的回复。但是,这看起来是一个非常常见/基本的功能,我认为像 volley 这样的库应该以某种更简单的方式实现这一点。我正在试用这个库,它看起来很有希望(对一个好的缓存 HTTP 库感到非常兴奋),但我发现某些部分没有多大意义:就像我想要解析部分(json、xml. ..) 成为侦听器而不是请求的一部分,这样我就可以创建自己的基本请求,该请求将一直添加这些标头。也许它应该是 RequestQueue 具有一些默认选项(标题)的那个......一些想法。
  • 我不确定这是否是您想要做的,但您可以通过实现 getHeaders() 方法创建类似 gist.github.com/alexmazza/5659606 的内容。我在那里使用杰克逊,但您可以使用 Gson 或其他任何东西,然后始终将该类用作经过身份验证的请求的基类
  • 是的,但是如果我想获取一些 JSON 数据,然后是一些 xml 数据,我将不得不复制逻辑,或者创建一个具有标头代码的基类,然后我将不得不创建 2 个子类,并且我将无法使用默认的 JsonRequest 等......对我来说,看起来响应和请求应该在不同的类中(解析应该属于监听器),这样你就可以把它们混在一起。传承问题! ;) 无论如何感谢您的回复。
  • 您好,我正在尝试手动执行此操作,因此在卷曲我的 url 时,授权使用类似 -H "Authorization: Basic " ( 是 Base 64 编码的 versino用户:密码)。但是,如果我返回一个包含键“Authorization”和该键“Basic ”的值的映射,volley 仍然返回错误。我需要遵循特定的格式吗?谢谢!
【解决方案3】:

对于代理授权(如 squid),请使用此标头:

String credentials = proxyUsername + ":" + proxyPassword;
String auth = "Basic "  + Base64.encodeToString(credentials.getBytes(), Base64.NO_WRAP);                
headers.put("Proxy-Authorization", auth);

【讨论】:

    猜你喜欢
    • 2017-06-09
    • 2018-10-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-05
    • 2020-06-08
    • 2018-01-24
    相关资源
    最近更新 更多