2013-05-16 15 views
7

il mio obiettivo è quello di costruire semplice motore di applicazione back-end per la mia app Android. Scopo di questo back-end è solo quello di verificare le chiamate dei clienti Android, e di fornire la password che verranno utilizzati per ulteriori https comunicazione con i miei assistenti. così ho iniziato econdo questo http://android-developers.blogspot.in/2013/01/verifying-back-end-calls-from-android.html articolo. lato client si presenta come:Come verificare Android gettone id su App Engine backend

GoogleAuthUtil.getToken(MainActivityy.this, "[email protected]", "audience:server:client_id:my_Client_ID_for_web_applications.apps.googleusercontent.com"); 

questo metodo restituisce gettone che assomiglia a questo:

eyJhbGciOiJSUzI1NiIsImtpZCI6ImFiMWIyZTllNGU2NGE0MmIzM2U3YjMxMDQwNzUyMzIxYmVlMmJkYmEifQ.eyJpc3MiOiJhY2NvdW50cy5nb29nbGUuY29tIiwiZW1haWwiOiJtYXRvLnBldHJ1bGFrQGdtYWlsLmNvbSIsInZlcmlmaWVkX2VtYWlsIjoidHJ1ZSIsImVtYWlsX3ZlcmlmaWVkIjoidHJ1ZSIsImNpZCI6IjU0ODk4MTY3NzkzMC0xcGxxamF2OWloOGU4MGJ0ZWdpYzg0YmcycjlxN2MwMi5hcHBzLmdvb2dsZXVzZXJjb250ZW50LmNvbSIsImF6cCI6IjU0ODk4MTY3NzkzMC0xcGxxamF2OWloOGU4MGJ0ZWdpYzg0YmcycjlxN2MwMi5hcHBzLmdvb2dsZXVzZXJjb250ZW50LmNvbSIsImF1ZCI6IjU0ODk4MTY3NzkzMC5hcHBzLmdvb2dsZXVzZXJjb250ZW50LmNvbSIsImlkIjoiMTE4MTQ0NjEyNDkzMTM1NzYxOTUwIiwic3ViIjoiMTE4MTQ0NjEyNDkzMTM1NzYxOTUwIiwiaWF0IjoxMzY4NzExODk0LCJleHAiOjEzNjg3MTU3OTR9.oN5ncz6MEAZBW8NXDhc4O-Y82C2mma675lbw9ZZA-1bs8zM9FKQG1K97PfNfxJFImiPMY8UYIjhqDIkHpErjaV0KDJpLv8NkmsdADOFjt5eQkFGWf92fufL7QEIkWqLL1fKxG7f8-OR59O5AOAVchdgtqDt4DhEH7oHfAZqf3wU 

e ora voglio authentificate questo token sul backend. Così ho creato nuovo progetto di applicazione Web utilizzando Google plug-in per eclpise. Genera qualche progetto di esempio. A questo progetto aggiungo la classe Checker dall'articolo che ho menzionato sopra. assomiglia a questo:

import java.io.IOException; 
import java.security.GeneralSecurityException; 
import java.util.Arrays; 
import java.util.List; 
import java.util.logging.Logger; 

import com.google.api.client.googleapis.auth.oauth2.GoogleIdToken; 
import com.google.api.client.googleapis.auth.oauth2.GoogleIdTokenVerifier; 
import com.google.api.client.http.javanet.NetHttpTransport; 
import com.google.api.client.json.JsonFactory; 
import com.google.api.client.json.gson.GsonFactory; 

public class Checker { 

private final List mClientIDs; 
private final String mAudience; 
private final GoogleIdTokenVerifier mVerifier; 
private final JsonFactory mJFactory; 
private String mProblem = "Verification failed. (Time-out?)"; 

private Logger log ; 

public Checker(String[] clientIDs, String audience) { 
    mClientIDs = Arrays.asList(clientIDs); 
    mAudience = audience; 
    NetHttpTransport transport = new NetHttpTransport(); 
    mJFactory = new GsonFactory(); 
    mVerifier = new GoogleIdTokenVerifier(transport, mJFactory); 
    log = Logger.getLogger(Checker.class.getName()); 
    log.severe("CHECKER CRETAED"); 
} 

public GoogleIdToken.Payload check(String tokenString) { 
    GoogleIdToken.Payload payload = null; 
    log.severe("CHECK START"); 
    try { 
     log.severe("CHECK 1"); 
     GoogleIdToken token = GoogleIdToken.parse(mJFactory, tokenString); 
     log.severe("CHECK 2"); 
     if (mVerifier.verify(token)) { 
      log.severe("CHECK 3"); 
      GoogleIdToken.Payload tempPayload = token.getPayload(); 
      log.severe("CHECK4"); 
      if (!tempPayload.getAudience().equals(mAudience)){ 
       mProblem = "Audience mismatch"; 
       log.severe("Audience mismatch"); 
      } 
      else if (!mClientIDs.contains(tempPayload.getIssuee())){ 
       mProblem = "Client ID mismatch"; 
       log.severe("Client ID mismatch"); 
      } 
      else{ 
       payload = tempPayload; 
       log.severe(payload.getEmail().toString()); 
       log.severe("CHECK 5"); 
      } 
     } 
    } catch (GeneralSecurityException e) { 
     log.severe("Security issue: " + e.getLocalizedMessage()); 
     mProblem = "Security issue: " + e.getLocalizedMessage(); 
    } catch (IOException e) { 
     log.severe("Network problem: " + e.getLocalizedMessage()); 
     mProblem = "Network problem: " + e.getLocalizedMessage(); 
    } 
    log.severe("CHECK END"); 
    return payload; 
} 

public String problem() { 
    return mProblem; 
} 

}

e adesso faccio qualcosa di simile per Authentify gettone fornita dal cliente Android.

String [] clinetidS = new String [] {"xxxxxxxxxxxxx-plqjav9ih8e80btegic84bg2r9q7c02.apps.googleusercontent.com"}; //Client ID for installed applications 
Checker checker = new Checker(clinetidS, "my_project_at_appspot.appspot.com"); 
    checker.check("eyJhbGciOiJSUzI1NiIsImtpZCI6ImFiMWIyZTllNGU2NGE0MmIzM2U3YjMxMDQwNzUyMzIxYmVlMmJkYmEifQ.eyJpc3MiOiJhY2NvdW50cy5nb29nbGUuY29tIiwiZW1haWwiOiJtYXRvLnBldHJ1bGFrQGdtYWlsLmNvbSIsInZlcmlmaWVkX2VtYWlsIjoidHJ1ZSIsImVtYWlsX3ZlcmlmaWVkIjoidHJ1ZSIsImNpZCI6IjU0ODk4MTY3NzkzMC0xcGxxamF2OWloOGU4MGJ0ZWdpYzg0YmcycjlxN2MwMi5hcHBzLmdvb2dsZXVzZXJjb250ZW50LmNvbSIsImF6cCI6IjU0ODk4MTY3NzkzMC0xcGxxamF2OWloOGU4MGJ0ZWdpYzg0YmcycjlxN2MwMi5hcHBzLmdvb2dsZXVzZXJjb250ZW50LmNvbSIsImF1ZCI6IjU0ODk4MTY3NzkzMC5hcHBzLmdvb2dsZXVzZXJjb250ZW50LmNvbSIsImlkIjoiMTE4MTQ0NjEyNDkzMTM1NzYxOTUwIiwic3ViIjoiMTE4MTQ0NjEyNDkzMTM1NzYxOTUwIiwiaWF0IjoxMzY4NzExODk0LCJleHAiOjEzNjg3MTU3OTR9.oN5ncz6MEAZBW8NXDhc4O-Y82C2mma675lbw9ZZA-1bs8zM9FKQG1K97PfNfxJFImiPMY8UYIjhqDIkHpErjaV0KDJpLv8NkmsdADOFjt5eQkFGWf92fufL7QEIkWqLL1fKxG7f8-OR59O5AOAVchdgtqDt4DhEH7oHfAZqf3wU"); 

e ora problema è che la classe Checker mai passare questo controllo:

if (mVerifier.verify(token)) 

c'è qualche modo per controllare token di Android in linea ?? qualche idea?? o dove può essere problema ??

risposta

7

Puoi sempre controllare il token interattivo utilizzando ricciolo di guardare

ricciolo https://www.googleapis.com/oauth2/v1/tokeninfo?id_token=<your-id-token-here>

Qual è l'eccezione/problema da mVerifier.verify?

+0

grazie, quando ho controllato il mio gettone era invalido, così problema era sul luogo del cliente. a causa di un po 'di lavoro con gli spazi di lavoro ho firmato la mia app con il tasto di debug e questo era un problema. quando l'ho firmato con una vera battitura, tutto ha funzionato bene. –

+0

@MatkoVonJazvecPetrulak, Ricevo anche l'eccezione GeneralSecurityException sul metodo tokenVerifier.verify (token). è lo stesso problema di debug keystore? –

+1

@ Bipin Vayalu si è stato il problema con il keystore di debug ... comunque non provare a registrare gli indirizzi e-mail sul back-end appengine ..l'ho fatto per il test, ho dimenticato di rimuoverlo dal mio codice e dopo un paio di mesi Google ha bloccato il mio account sviluppatore (circa 200.000 download) ...... Ecco la giustizia "google-style" –

3

È una domanda precedente, e credo che tu abbia già trovato una risposta. Ma solo nel caso in cui: Fare clic su questo link e scorrere verso il basso. In sostanza si dice di scaricare e includere this library e scrivere questo pezzo di codice:

import java.io.IOException; 
import java.security.GeneralSecurityException; 
import com.google.api.client.googleapis.auth.oauth2.GoogleIdToken; 
import com.google.api.client.googleapis.auth.oauth2.GoogleIdTokenVerifier; 
import com.google.api.client.http.javanet.NetHttpTransport; 
import com.google.api.client.json.JsonFactory; 
import com.google.api.client.json.gson.GsonFactory; 

public class Checker { 

private final List mClientIDs; 
private final String mAudience; 
private final GoogleIdTokenVerifier mVerifier; 
private final JsonFactory mJFactory; 
private String mProblem = "Verification failed. (Time-out?)"; 

public Checker(String[] clientIDs, String audience) { 
    mClientIDs = Arrays.asList(clientIDs); 
    mAudience = audience; 
    NetHttpTransport transport = new NetHttpTransport(); 
    mJFactory = new GsonFactory(); 
    mVerifier = new GoogleIdTokenVerifier(transport, mJFactory); 
} 

public GoogleIdToken.Payload check(String tokenString) { 
    GoogleIdToken.Payload payload = null; 
    try { 
     GoogleIdToken token = GoogleIdToken.parse(mJFactory, tokenString); 
     if (mVerifier.verify(token)) { 
      GoogleIdToken.Payload tempPayload = token.getPayload(); 
      if (!tempPayload.getAudience().equals(mAudience)) 
       mProblem = "Audience mismatch"; 
      else if (!mClientIDs.contains(tempPayload.getIssuee())) 
       mProblem = "Client ID mismatch"; 
      else 
       payload = tempPayload; 
     } 
    } catch (GeneralSecurityException e) { 
     mProblem = "Security issue: " + e.getLocalizedMessage(); 
    } catch (IOException e) { 
     mProblem = "Network problem: " + e.getLocalizedMessage(); 
    } 
    return payload; 
} 

public String problem() { 
    return mProblem; 
} 
} 
+0

Non mi piace entrare in quel dipendenza solo per GsonFactory. Ogni altro modo? – Patrick

+2

@Patrick Molto tempo fa hai chiesto, ma nel caso qualcuno si stia chiedendo anche tu, se stai usando Jackson, (che penso sia fornito con questa libreria) puoi usare 'JacksonFactory.getDefaultInstance();' –

+0

quali sono i dipendenti barattoli mi dà errore che "È indirettamente referenziato dai file .class richiesti" –

0

Il suo è un pezzo utile di codice per controllare l'autenticazione di un segno da parte di Google. Sto usando Java EE quindi potrebbe essere leggermente diverso se si utilizza il normale Java:

public JsonObject authenticateFromToken(String token) { 
     JsonObject jsonst = null; 
     JsonReader p = null; 
     try { 
      p = Json.createReader(new URL("https://www.googleapis.com/oauth2/v1/tokeninfo?access_token="+token).openStream()); 
      jsonst = (JsonObject) p.read(); 
     } catch (FileNotFoundException e2) { 
      e2.printStackTrace(); 
     } catch (MalformedURLException e) { 
      e.printStackTrace(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
     return jsonst; 
    } 

Dopo aver ottenuto il JsonObject, è possibile ottenere informazioni da essa come ad esempio:

jsonObject.getString("user_id"); 

o

jsonObject.getString("email"); 

ecc ...

Problemi correlati