0

ここで助けが必要です。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: 長いコードで申し訳ありませんが、説明がわかりにくいかもしれません。必要に応じて詳細を尋ねます。

4

0 に答える 0