HTTP POST リクエストを送信してサーバーで認証する必要がある Android アプリを作成しています。
デスクトップで通常の Java アプリケーションとして実行すると、ユーザー名とパスワードが有効な場合は 200 OK 応答コードが返され、有効でない場合は 302 Found が返されます (ブラウザーから、無効なユーザー名/パスワードを入力すると、あなたを示すページにリダイレクトされます)。無許可です)。
ただし、Android アプリから実行すると、パスワードの有効性に関係なく、毎回 200 OK になります。
コードは次のとおりです。
public static boolean authenticate(String user, String pass) {
HttpClient client = new DefaultHttpClient();
HttpPost post = new HttpPost("https://website.com/login");
try
{
// Add form parameters to request
List<NameValuePair> params = new ArrayList<NameValuePair>();
params.add(new BasicNameValuePair("basic", "true"));
params.add(new BasicNameValuePair("j_username", user));
params.add(new BasicNameValuePair ("j_password", pass));
post.setEntity(new UrlEncodedFormEntity(params));
// execute post request
HttpResponse response = client.execute(post);
int status = response.getStatusLine().getStatusCode();
System.out.println("POST RESPONSE STATUS = " + status + ": " + response.getStatusLine().toString());
// success if we get 200 OK
// something went wrong if we get a 302 Found
if (status == 200) {
return true;
} else if (status == 302) {
return false;
} else {
System.out.println("Unknown response status: " + status);
return false;
}
}
catch (IOException e)
{
System.out.println("IOException trying to authenticate: " + e.getMessage());
}
return false;
}
netcat を使用して、ヘッダーを検査するために自分のコンピューターにリクエストを送信しようとしました。
デスクトップから実行すると、次のように送信されます。
kyle@kyle-Rev-1-0 ~ $ nc -l -p 8080
POST / HTTP/1.1
Content-Length: 51
Content-Type: application/x-www-form-urlencoded
Host: 192.168.2.17:8080
Connection: Keep-Alive
User-Agent: Apache-HttpClient/4.2.3 (java 1.5)
basic=true&j_username=bob14&j_password=meow%21
Android 4.1 タブレットで実行すると、次のメッセージが送信されます。
kyle@kyle-Rev-1-0 ~ $ nc -l -p 8080
POST / HTTP/1.1
Content-Length: 51
Content-Type: application/x-www-form-urlencoded
Host: 192.168.2.17:8080
Connection: Keep-Alive
User-Agent: Apache-HttpClient/UNAVAILABLE (java 1.4)
basic=true&j_username=bob14&j_password=meow%21
ユーザーエージェントに関係があるのではないかと思い、空の文字列と「Apache-HttpClient/4.2.3 (java 1.5)」を試しましたが、どちらも違いはありませんでした。
このプロジェクトは、ライブラリ httpcore-4.2.2.jar および httpclient-4.2.3.jar を使用するように Eclipse でセットアップされています。Android プロジェクトは、現時点では commons-httpclient-3.1.jar にも依存しています。
リクエストが私に異なる応答を得ている理由を誰かが知っていますか?