Как использовать базовую аутентификацию с помощью Volley на Android?

Я просматриваю примеры и код, но я ничего не вижу. Возможно ли это на этом этапе?

Ответы

Ответ 1

Да, это возможно. Вам необходимо переопределить Request.getHeaders(). Я ленив, и я использовал HttpHeaders и HttpAuthentication от Spring для Android, но вы можете просто создать заголовок auth и вернуть его из метода. Из getHeaders() вы можете вернуть заголовок auth для базового auth. Это пример запроса с базовым auth.

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();
    }
}

И вот как я создаю заголовки auth

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;
}

Ответ 2

Для тех, кто не хочет использовать Spring для 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 для этого. Как указано в комментариях.

API 8 +

Ответ 3

Для авторизации прокси (например, squid) используйте этот заголовок:

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