ここで助けが必要です。https html フォームでログインする必要がある Android アプリを開発しています。数日前、フォームは https ではなく http で、私のコードは次のとおりでした。
String sessionId = "";
int TIMEOUT_MS = 10000; //10 segundos hasta la conexion
//El POST
HttpClient httpClient = new DefaultHttpClient();
HttpConnectionParams.setConnectionTimeout(httpClient.getParams(), TIMEOUT_MS);
HttpConnectionParams.setSoTimeout(httpClient.getParams(), TIMEOUT_MS);
//httpClient.getParams().setParameter(ClientPNames.COOKIE_POLICY, CookiePolicy.RFC_2109);
try {
HttpPost httpPost = new HttpPost("http://" + servidor + ".pucp.edu.pe/login");
List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(5);
nameValuePairs.add(new BasicNameValuePair("username", usuarioTxt));
nameValuePairs.add(new BasicNameValuePair("password", contrasenaTxt));
httpPost.setEntity(new UrlEncodedFormEntity(nameValuePairs));
//POST request
HttpResponse response = httpClient.execute(httpPost);
//Obtenerlo en String
sessionId = inputStreamToString(response.getEntity().getContent()).toString();
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
} catch (ClientProtocolException e) {
e.printStackTrace();
} catch (IOException e) {
//si no se llega a obtener la conexión
//e.printStackTrace();
AlertDialog alertDialog = new AlertDialog.Builder(this).create();
alertDialog.setMessage(getResources().getString(R.string.errorDescarga));
alertDialog.setButton("Ok", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
}
});
alertDialog.show();
}
return sessionId;
これは、stackoverflow に関するいくつかの投稿に基づいています。
さて、httpsフォームでは、いくつかの問題があります。まず、ログインするたびにサーバーが「実行コード」を生成するので、次のような単純な html ファイルからログインできます。
<html>
<form id="fm1" name="form" method="post" action="https://pandora.pucp.edu.pe/pucp/login?TARGET=http://eros.pucp.edu.pe/" >
<input type="text" name="username" value=""><br>
<input type="password" name="password" value=""><br>
<input type="hidden" name="lt" value="" />
<input type="hidden" name="execution" value="6A66F2A063BBB7D56ACC8B75FE90BB7E54300C800915F016B55B1A7B4B18DA0231F875DB909579CEC415A3FACDF98CB5" />
<input type="hidden" name="_eventId" value="submit" />
<input type="submit" value="Ingresar">
</form>
</html>
長く退屈な 16 進数の 96 文字をname="execution" value=""
、生成された文字に置き換えhttps://pandora.pucp.edu.pe/pucp/login
ます (ブラウザで Web ページのソース コードを確認します)。
しかし、Android アプリでは同じポイントに到達できません。つまり、ログインできません。「ログインできません」などの HTML コードが返されます。接続は拒否されず、間違って受け入れられるため、これは重要です。
One more thing
: Cookie を無効にして Firefox にログインしようとしたところ、サーバーから同じログイン フォームが返されたため、Cookie を有効にする必要があることに気付きました。
また、ブラウザから Android Emulator にログインできます。
つまり、要約すると、次のものが必要です。
- https Web ページに投稿するには
- httpバージョンで機能したコードのように、POSTにユーザー名、パスワード、実行コード、およびその他の「パラメーター」を与えるには
- サーバーがログインできるように、アプリで Cookie を有効にする
ここですでに何百ものスニペットを試しましたが、3 つのポイントすべてを備えているものはありません (ほとんどの場合、1 つまたは 2 つのポイントがあります)。
前もって感謝します、
アルド
PS: 長いコードで申し訳ありませんが、説明がわかりにくいかもしれません。必要に応じて詳細を尋ねます。