AsyncHttpClient验证失败(AsyncHttpClient Authentication

2019-08-17 05:22发布

我想从一个网站进行身份验证。 我使用AsyncHttpClient 。 继承人的代码,我想。

这里是我的代码,

public class LoginActivity extends Activity {

    String tag = "LoginActivity";
    Button requestBtn;
    AsyncHttpClient httpClient = new AsyncHttpClient();

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_login);

        requestBtn = (Button) findViewById(R.id.upload_file);

        PersistentCookieStore myCookieStore = new PersistentCookieStore(this);
        httpClient.setCookieStore(myCookieStore);

        httpClient.setBasicAuth(ApplicationConstants.userName,
                ApplicationConstants.password, new AuthScope(
                        "http://*.*.*.*:8080/someUrl", 8080,
                        AuthScope.ANY_REALM));




        requestBtn.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
      httpClient.get("http://*.*.*.*:8080/someurl",new AsyncHttpResponseHandler() {

                @Override
                public void onSuccess(String response) {
                System.out.println(response);
                Log.d("Sucessful upload","Onsucess" + response);
                }

                @Override
                public void onFailure(Throwable arg0,String arg1) {

                Log.d("LoginActivity",arg0.toString());
                arg0.printStackTrace();
                super.onFailure(arg0, arg1);
                }
            });
        }

    }
    });
}
}

我是说我在按钮上点击一个例外。 它说,认证失败例外logcat的:

02-27 16:02:42.930: D/LoginActivity(8869): org.apache.http.client.HttpResponseException: Unauthorized
02-27 16:02:42.930: W/System.err(8869): org.apache.http.client.HttpResponseException: Unauthorized
02-27 16:02:42.930: W/System.err(8869):     at com.loopj.android.http.AsyncHttpResponseHandler.sendResponseMessage(AsyncHttpResponseHandler.java:235)
02-27 16:02:42.930: W/System.err(8869):     at com.loopj.android.http.AsyncHttpRequest.makeRequest(AsyncHttpRequest.java:79)
02-27 16:02:42.930: W/System.err(8869):     at com.loopj.android.http.AsyncHttpRequest.makeRequestWithRetries(AsyncHttpRequest.java:95)
02-27 16:02:42.930: W/System.err(8869):     at com.loopj.android.http.AsyncHttpRequest.run(AsyncHttpRequest.java:57)
02-27 16:02:42.930: W/System.err(8869):     at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:442)
02-27 16:02:42.930: W/System.err(8869):     at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305)
02-27 16:02:42.930: W/System.err(8869):     at java.util.concurrent.FutureTask.run(FutureTask.java:137)
02-27 16:02:42.940: W/System.err(8869):     at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1076)
02-27 16:02:42.940: W/System.err(8869):     at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:569)
02-27 16:02:42.940: W/System.err(8869):     at java.lang.Thread.run(Thread.java:856)

我做错了什么? 我使用的URL是正确的。

Answer 1:

从与Android基本身份验证 :

Android是使用Apache的HttpClient的4.0 Beta2中,其中有一个缺陷,当它涉及到基本身份验证出货。

当您搜索的HttpClient和基本身份验证,谷歌肯定会送你到3.X的HttpClient的官方文档,这表明你,怎么办基本身份验证以先发制人的方式 。 这意味着,每请求发送,而不是等待一个401未经授权响应,然后才发送凭证的客户端的凭据。 这可能是要摆在首位的事情,因为这样可以节省您的客户端的请求。

HttpClient client = new HttpClient();
client.getParams().setAuthenticationPreemptive(true);
Credentials defaultcreds = new UsernamePasswordCredentials("username", "password");
client.getState().setCredentials(new AuthScope("myhost", 80, AuthScope.ANY_REALM), defaultcreds);

此示例代码不会与HttpClient的版本4名为setAuthenticationPreemptive缺少的方法编译。 问题是,如果你省略这非常方法调用,代码仍然有效,而认证是不可抢占。 我们错过了这个小细节,一段时间后,只注意到, 每一个请求是由一个401未授权的请求/响应周期之前 。 这增加了一倍要求我们的供应量。

现在检查AsyncHttpClient的实现:

private final DefaultHttpClient httpClient;
public void setBasicAuth( String user, String pass, AuthScope scope){
    UsernamePasswordCredentials credentials = new UsernamePasswordCredentials(user,pass);
    this.httpClient.getCredentialsProvider().setCredentials(scope, credentials);
}

所以我认为循环J还可能碰上用做基本身份验证旧的HttpClient 3.x的方式的问题。 它的工作,但它不是先发制人。

一个简单的解决方案将是下载循环J的源代码并修改其源,并使用修改后的版本。

在修改代码如下:

    httpClient.setBasicAuth(ApplicationConstants.userName,
            ApplicationConstants.password);

代替

            httpClient.setBasicAuth(ApplicationConstants.userName,
            ApplicationConstants.password, new AuthScope(
                    "http://*.*.*.*:8080/uploadservice", 80,
                    AuthScope.ANY_REALM));


Answer 2:

我想出了另一种解决办法,因为我是有在两者之间的代理问题,即不喜欢Authorization头是如何被使用上述建议的解决方案,也是默认的(车)建setBasicAuth(username, password)实现的AsyncHttpClient。

所以我加了头我自己,做BASE64用户名/密码编码自己,但使用addHeader()从父客户端实现继承的方法。

它现在。

asyncHttpClient.addHeader(
  "Authorization",
    "Basic " + Base64.encodeToString(
      (username+":"+password).getBytes(),Base64.NO_WRAP)
);

我希望这可以帮助别人。



Answer 3:

我想你可以通过明确将其处理基本认证头解决此问题。

Context context = this;
String url = "http://*.*.*.*:8080/someurl";

UsernamePasswordCredentials credentials = 
new UsernamePasswordCredentials(ApplicationConstants.userName,
            ApplicationConstants.password);

Header header = BasicScheme.authenticate(credentials, "UTF-8", false);

Header[] headers = {header};

RequestParams params = new RequestParams();

httpClient.get(context, url, headers, params, new AsyncHttpResponseHandler(){ ..

此外,如果你想知道什么是服务器响应别忘了覆盖“的onComplete”的方法为好。 由于异常,可能不会通过“的onSuccess”和“onFailure处”走的情况下..



文章来源: AsyncHttpClient Authentication failed