Autore Topic: Applicazione per login  (Letto 2080 volte)

Offline kenshiro86

  • Nuovo arrivato
  • *
  • Post: 17
  • Respect: 0
    • Mostra profilo
  • Sistema operativo:
    Windows XP
Applicazione per login
« il: 15 Novembre 2010, 11:21:41 CET »
0
Salve a tutti!
Devo realizzare un'applicazione che mi consenta di effettuare il login su una pagina web (visualizzando quest'ultima solo dopo aver inserito i dati, altrimenti l'intera applicazione sarebbe inutile...)
Come si può fare per fargli prendere negli appositi form HTLM della pagina web le credenziali inserite nell'applicazione?
I dati vengono inseriti nell'applicazione tramite un'EditText:

Codice (Java): [Seleziona]
EditText ID = null;
.
.
.
ID = (EditText) findViewById(R.id.user_id);
.
.
.
CharSequence inputData = ID.getText();

Il metodo getText() mi resituisce la sringa inserita nell'EditText, ma come posso fare a passare tale stringa nel form della pagina web?
Spero di essere stato chiaro... :-[

Offline Ricky`

  • Amministratore
  • Utente storico
  • *****
  • Post: 3487
  • Respect: +506
    • Github
    • Google+
    • rciovati
    • Mostra profilo
Re:Applicazione per login
« Risposta #1 il: 15 Novembre 2010, 12:34:01 CET »
+1
Generalmente in questi casi si va a fare la chiamata HTTP con metodo post per fare il login. Si tratta semplicemente ti prendere il nome dei campi del form e trascriverli in un codice del genere
Codice (Java): [Seleziona]
    // Create a new HttpClient and Post Header
    HttpClient httpclient = new DefaultHttpClient();
    HttpPost httppost = new HttpPost("[url=http://www.yoursite.com/script.php"]Create an Online Store with YourSite.Com[/url]);

    try {
        // Add your data
        List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(2);
        nameValuePairs.add(new BasicNameValuePair("username", "user"));
        nameValuePairs.add(new BasicNameValuePair("password", "password"));
        httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs));

        // Execute HTTP Post Request
        HttpResponse response = httpclient.execute(httppost);
       
    } catch (ClientProtocolException e) {
        // TODO Auto-generated catch block
    } catch (IOException e) {
        // TODO Auto-generated catch block
    }

codice preso da: Android Snippets: Executing a HTTP POST Request with HttpClient

Offline kenshiro86

  • Nuovo arrivato
  • *
  • Post: 17
  • Respect: 0
    • Mostra profilo
  • Sistema operativo:
    Windows XP
Re:Applicazione per login
« Risposta #2 il: 16 Novembre 2010, 11:54:52 CET »
0
Grazie Ricky, provo a fare come mi hai detto!

Offline kenshiro86

  • Nuovo arrivato
  • *
  • Post: 17
  • Respect: 0
    • Mostra profilo
  • Sistema operativo:
    Windows XP
Re:Applicazione per login
« Risposta #3 il: 16 Novembre 2010, 12:41:35 CET »
0
Premetto che l'applicazione che sto sviluppando dovrebbe consentire l'accesso a dei servizi di Mobile Banking e la procedura di autenticazione è suddivisa in 2 passi, di cui il primo è l'inserimento del codice utente. Se questo viene accettato, si passa ad una seconda pagina che richiede nuovi dati.
Per ora sto lavorando sulla prima parte.
Ho provato a fare come mi ha consigliato Ricky:

Codice (Java): [Seleziona]
package com.kenshiro.inputPost;


import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;


import org.apache.http.HttpResponse;
import org.apache.http.client.HttpClient;

import org.apache.http.client.methods.HttpPost;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.message.BasicNameValuePair;
import org.apache.http.client.ClientProtocolException;
import java.io.IOException;
import org.apache.http.NameValuePair;
import java.util.ArrayList;
import java.util.List;



public class inputPost extends Activity {
       
 
  EditText codUt = null;

  Button btnProcedi = null;
 


   
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
       
       

                // Otteniamo il riferimento all'EditText
                codUt = (EditText) findViewById(R.id.codice_utente);
       
       
   
   
   btnProcedi = (Button) findViewById(R.id.bottone);
   
   btnProcedi.setOnClickListener(new OnClickListener(){
        public void onClick(View v){

                CharSequence inputData = codUt.getText();       //variabile in cui si memorizza il codice utente inserito
       
                String dati = inputData.toString();

        //codice per il POST   

                HttpClient httpclient = new DefaultHttpClient();  
                HttpPost httppost = new HttpPost("https://ib.mps.it/web/mbts/home");  

                try {  
                    // Add your data  
                    List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(1);  
                    nameValuePairs.add(new BasicNameValuePair("userCode", dati));  
                    // il login è diviso in 2 pagine web, per ora sto inserendo soltanto il dato richiesto nella prima pagina
                            //nameValuePairs.add(new BasicNameValuePair("stringdata", "AndDev is Cool!"));  
                    httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs));  
             
                    // Execute HTTP Post Request  
                    HttpResponse response = httpclient.execute(httppost);  
                       
                } catch (ClientProtocolException e) {  
                    // TODO Auto-generated catch block  
                } catch (IOException e) {  
                    // TODO Auto-generated catch block  
                }  
            }  

    });
   }
   



   }
Il compilatore non segnala errori, ma quando clicco sul bottone dell'applicazione non succede proprio nulla.
Come posso fare a visualizzare la pagina web?
Ho commesso degli errori?
Grazie

Offline kenshiro86

  • Nuovo arrivato
  • *
  • Post: 17
  • Respect: 0
    • Mostra profilo
  • Sistema operativo:
    Windows XP
Re:Applicazione per login
« Risposta #4 il: 24 Novembre 2010, 11:48:55 CET »
0
Ho trovato in rete un programma che dovrebbe fare al caso mio, almeno per quanto riguarda il problema del post.
Tuttavia, quando vado a lanciarlo, ottengo un messaggio di errore: certificate not trusted.
Faccio presente che il sito su cui devo fare il post è un https e che il mio problema ho letto essere comune a molti.
Come si può risolvere?
Grazie

Offline bradipao

  • Moderatore globale
  • Utente storico
  • *****
  • Post: 4043
  • keep it simple
  • Respect: +567
    • Github
    • Google+
    • bradipao
    • Mostra profilo
  • Dispositivo Android:
    Nexus 5
  • Play Store ID:
    Bradipao
  • Sistema operativo:
    W7
Re:Applicazione per login
« Risposta #5 il: 24 Novembre 2010, 12:40:13 CET »
0
Faccio una domanda forse stupida, ma mi interessa capire: io sapevo che per login o in generale pagine con sessioni, occorreva far gestire i Cookie a HttpClient e che non era automatico.

Mi sbaglio?  :money_mouth:
NON rispondo a domande nei messaggi privati
Bradipao @ Play Store

Offline Ricky`

  • Amministratore
  • Utente storico
  • *****
  • Post: 3487
  • Respect: +506
    • Github
    • Google+
    • rciovati
    • Mostra profilo
Re:Applicazione per login
« Risposta #6 il: 25 Novembre 2010, 10:55:42 CET »
0
L'utente BobActor nel suo progetto opensource:


 rm3wifiauthentication -
 
 Project Hosting on Google Code


se non ricordo male ha scritto del codice per fare delle chiamate http verso siti con certificati ssl "self-signed". Sbircia un po' il suo codice :) eheh

Offline MarcoDuff

  • Moderatore globale
  • Utente storico
  • *****
  • Post: 1073
  • Respect: +202
    • Google+
    • marcoduff
    • Mostra profilo
    • MarcoDuff's Blog
  • Dispositivo Android:
    Samsung Galaxy Nexus
  • Play Store ID:
    MarcoDuff
  • Sistema operativo:
    Windows 7
Re:Applicazione per login
« Risposta #7 il: 25 Novembre 2010, 11:22:55 CET »
0
ottengo un messaggio di errore: certificate not trusted.

Questo è un errore che mi ha fatto impazzire (e continua a farmi impazzire)!

Ancora non si è capito bene se l'errore è di android o del server https che non ha installato per bene i certificati.

Esiste anche una issue su google code ( Issue 1946 -
 android -
 
 javax.net.ssl.SSLException: Not trusted server certificate - Project Hosting on Google Code
), ma da quello che ho capito (e testato) ancora non risolve tutti i problemi.

La soluzione di Ricky (che è un workaround) è l'unica soluzione che attualmente funziona, ovvero sovrascrivere tutti i certificati restituiti con uno valido... ma questo significa TUTTI i certificati, anche quelli effettivamente non validi (il che significa mandare a quel paese il protocollo https utilizzandolo come se fosse un http normale).

@bradipao
Puoi fare anche tutto da solo: http://en.wikipedia.org/wiki/HTTP_cookie#Setting_a_cookie

Offline Ricky`

  • Amministratore
  • Utente storico
  • *****
  • Post: 3487
  • Respect: +506
    • Github
    • Google+
    • rciovati
    • Mostra profilo
Re:Applicazione per login
« Risposta #8 il: 25 Novembre 2010, 11:39:58 CET »
0
La soluzione di Ricky (che è un workaround) è l'unica soluzione che attualmente funziona, ovvero sovrascrivere tutti i certificati restituiti con uno valido... ma questo significa TUTTI i certificati, anche quelli effettivamente non validi (il che significa mandare a quel paese il protocollo https utilizzandolo come se fosse un http normale).

Non è una mia soluzione, io mi ricordo solo che in quel codice viene fatto un lavoro del genere, ma non sapevo come funziona tecnicamente :) Comunque immagino sovrascriva solo il certificato in quella singola chiamata http percui se l'utente "si fida" del server a cui si connette direi che non ci sono grossi problemi :)

Offline kenshiro86

  • Nuovo arrivato
  • *
  • Post: 17
  • Respect: 0
    • Mostra profilo
  • Sistema operativo:
    Windows XP
Re:Applicazione per login
« Risposta #9 il: 30 Novembre 2010, 18:31:51 CET »
0
L'utente BobActor nel suo progetto opensource:


 rm3wifiauthentication -
 
 Project Hosting on Google Code


se non ricordo male ha scritto del codice per fare delle chiamate http verso siti con certificati ssl "self-signed". Sbircia un po' il suo codice :) eheh
Ciao a tutti! Ho fatto come ha detto Ricky e ho dato un'occhiata al codice di BobActor.
L'unica differenza importante che ho rilevato rispetto al codice del programma che avevo trovato in Rete è che BobActor, nel suo file Authentication, richiama un altro file (EasySSLSocketFactory.java) per superare il problema del certificato.
Ecco il codice di EasySSLSocketFactory.java
Codice (Java): [Seleziona]
import java.io.IOException;
import java.net.InetAddress;
import java.net.InetSocketAddress;
import java.net.Socket;
import java.net.UnknownHostException;

import javax.net.ssl.SSLContext;
import javax.net.ssl.SSLSocket;
import javax.net.ssl.TrustManager;

import org.apache.http.conn.ConnectTimeoutException;
import org.apache.http.conn.scheme.LayeredSocketFactory;
import org.apache.http.conn.scheme.SocketFactory;
import org.apache.http.params.HttpConnectionParams;
import org.apache.http.params.HttpParams;

/**
 * This socket factory will create ssl socket that accepts self signed
 * certificate
 *
 * @author olamy
 * @version $Id: EasySSLSocketFactory.java 765355 2009-04-15 20:59:07Z evenisse
 *          $
 * @since 1.2.3
 */

public class EasySSLSocketFactory implements SocketFactory,
                LayeredSocketFactory {

        private SSLContext sslcontext = null;

        private static SSLContext createEasySSLContext() throws IOException {
                try {
                        SSLContext context = SSLContext.getInstance("TLS");
                        context.init(null, new TrustManager[] { new EasyX509TrustManager(
                                        null) }, null);
                       
                        return context;
                } catch (Exception e) {
                        throw new IOException(e.getMessage());
                }
        }

        private SSLContext getSSLContext() throws IOException {
                if (this.sslcontext == null) {
                        this.sslcontext = createEasySSLContext();
                }
                return this.sslcontext;
        }

        /**
         * @see org.apache.http.conn.scheme.SocketFactory#connectSocket(java.net.Socket,
         *      java.lang.String, int, java.net.InetAddress, int,
         *      org.apache.http.params.HttpParams)
         */

        public Socket connectSocket(Socket sock, String host, int port,
                        InetAddress localAddress, int localPort, HttpParams params)
                        throws IOException, UnknownHostException, ConnectTimeoutException {
                int connTimeout = HttpConnectionParams.getConnectionTimeout(params);
                int soTimeout = HttpConnectionParams.getSoTimeout(params);

                InetSocketAddress remoteAddress = new InetSocketAddress(host, port);
                SSLSocket sslsock = (SSLSocket) ((sock != null) ? sock : createSocket());

                if ((localAddress != null) || (localPort > 0)) {
                        // we need to bind explicitly
                        if (localPort < 0) {
                                localPort = 0; // indicates "any"
                        }
                        InetSocketAddress isa = new InetSocketAddress(localAddress,
                                        localPort);
                        sslsock.bind(isa);
                }

                sslsock.connect(remoteAddress, connTimeout);
                sslsock.setSoTimeout(soTimeout);
                return sslsock;

        }

        /**
         * @see org.apache.http.conn.scheme.SocketFactory#createSocket()
         */

        public Socket createSocket() throws IOException {
                return getSSLContext().getSocketFactory().createSocket();
        }

        /**
         * @see org.apache.http.conn.scheme.SocketFactory#isSecure(java.net.Socket)
         */

        public boolean isSecure(Socket socket) throws IllegalArgumentException {
                return true;
        }

        /**
         * @see org.apache.http.conn.scheme.LayeredSocketFactory#createSocket(java.net.Socket,
         *      java.lang.String, int, boolean)
         */

        public Socket createSocket(Socket socket, String host, int port,
                        boolean autoClose) throws IOException, UnknownHostException {
                return getSSLContext().getSocketFactory().createSocket();
        }

        // -------------------------------------------------------------------
        // javadoc in org.apache.http.conn.scheme.SocketFactory says :
        // Both Object.equals() and Object.hashCode() must be overridden
        // for the correct operation of some connection managers
        // -------------------------------------------------------------------

        public boolean equals(Object obj) {
                return ((obj != null) && obj.getClass().equals(
                                EasySSLSocketFactory.class));
        }

        public int hashCode() {
                return EasySSLSocketFactory.class.hashCode();
        }

}

Non voglio annoiarvi con tutti i passaggi, ma sta di fatto che ho copiato tale file nel mio progetto e l'ho richiamato dal codice per il login.
Adesso non ottengo più il famigerato messaggio "Certificate not trusted" ma il seguente:
"SSL handshake failure: I/O error during system call, Broken pipe"  :-o
Sinceramente non ho proprio idea di cosa voglia dire!
Nessuno ha qualche consiglio da darmi???
Grazie
« Ultima modifica: 30 Novembre 2010, 18:33:30 CET da kenshiro86 »

Offline Nicola_D

  • Moderatore
  • Utente storico
  • *****
  • Post: 2479
  • SBAGLIATO!
  • Respect: +323
    • Github
    • Google+
    • nicoladorigatti
    • Mostra profilo
  • Dispositivo Android:
    Nexus 6p, Nexus 4, Nexus S, Nexus 7(2012)
  • Sistema operativo:
    Windows 7
Re:Applicazione per login
« Risposta #10 il: 30 Novembre 2010, 18:55:30 CET »
0
IMPORTANTE:NON RISPONDO A PROBLEMI VIA MESSAGGIO PRIVATO
LOGCAT: Non sai cos'è? -> Android Debug Bridge | Android Developers
               Dov'è in Eclipse? -> Window -> Open Prospective -> DDMS e guarda in basso!
[Obbligatorio] Logcat, questo sconosciuto! (Gruppo AndDev.it LOGTFO) - Android Developers Italia

Offline MarcoDuff

  • Moderatore globale
  • Utente storico
  • *****
  • Post: 1073
  • Respect: +202
    • Google+
    • marcoduff
    • Mostra profilo
    • MarcoDuff's Blog
  • Dispositivo Android:
    Samsung Galaxy Nexus
  • Play Store ID:
    MarcoDuff
  • Sistema operativo:
    Windows 7
Re:Applicazione per login
« Risposta #11 il: 01 Dicembre 2010, 10:12:28 CET »
0
Off-Topic:
Let me google that for you

è una delle cose più belle che io abbia mai visto!!!  :-o :-o :-o :-o :-o

Offline kenshiro86

  • Nuovo arrivato
  • *
  • Post: 17
  • Respect: 0
    • Mostra profilo
  • Sistema operativo:
    Windows XP
Re:Applicazione per login
« Risposta #12 il: 28 Dicembre 2010, 10:46:15 CET »
0
Ok per quanto riguarda il problema del certificato è tutto a posto.
Grazie a tutti