Cómo verificar el token de ID de Android en el motor de búsqueda de App Engine

Mi objetivo es construir motor de aplicación simple back end para mi aplicación android. Propósito de este back-end es sólo para verificar las llamadas de los clientes de android, y proporcionar la contraseña que se utilizará para la comunicación https más con mis servidores. Así que empecé ccording a este http://android-developers.blogspot.in/2013/01/verifying-back-end-calls-from-android.html artículo. El lado del cliente se ve así:

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

Este método devuelve un token que tiene este aspecto:

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

Y ahora quiero authentificate este símbolo en backend. Así que creé un nuevo proyecto de aplicación web utilizando el complemento de Google para eclpise. Genera un proyecto de ejemplo. A este proyecto agrego la clase del inspector del artículo que mencioné arriba. Se ve como esto:

 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; } 

}

Y ahora hago algo como esto para authentify token proporcionado por el cliente de 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.eyJpc.oN5ncz6MEAZBW8NXDhc4O-Y82C2mma675lbw9ZZA-1bs8zM9FKQG1K97PfNfxJFImiPMY8UYIjhqDIkHpErjaV0KDJpLv8NkmsdADOFjt5eQkFGWf92fufL7QEIkWqLL1fKxG7f8-OR59O5AOAVchdgtqDt4DhEH7oHfAZqf3wU"); 

Y ahora el problema es que la clase Checker nunca pasa este cheque:

 if (mVerifier.verify(token)) 

¿Hay alguna forma de comprobar Android token en línea? ¿¿algunas ideas?? O donde puede ser problema?

Siempre puede comprobar el token interactivamente usando curl para mirar

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

¿Cuál es la excepción / problema de mVerifier.verify?

Es una pregunta más antigua, y supongo que ya encontraste una respuesta. Pero por si acaso: Haga clic en este enlace y desplácese hacia abajo. Básicamente le dice que descargue e incluya esta biblioteca y escriba este pedazo de código:

 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; } } 

Ella es una pieza útil de código para comprobar la autenticación de un token de google. Estoy utilizando Java EE por lo que puede ser un poco diferente si usted está usando Java normal:

 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; } 

Después de tener el JsonObject , puede obtener información de él como tal:

 jsonObject.getString("user_id"); 

o

 jsonObject.getString("email"); 

Etc …

  • Obtención de un código de autorización OAuth2 que se puede compartir con un servidor
  • Obtener nombre de usuario, avatar de google account
  • Identidad de sitios cruzados de Google y de Google
  • ¿Cómo puedo verificar los símbolos generados por Android en mi servidor mediante PHP?
  • Acceso a la API de Gmail mediante Android
  • Google OAuth2 - token de acceso y token de actualización -> invalid_grant / Code ya se redimió
  • Permisos de concesión de API de GMail antes de la excepción UserRecoverableAuthUIE
  • GoogleAuthException Fuente desconocida
  • 'Solicitud no registrada' mostrada en la pantalla de consentimiento de inicio de sesión de Google+
  • Error en la autenticación SASL de Gtalk XMPP con el mecanismo X-OAUTH2?
  • Error al recrear un ID de cliente para una aplicación de Android en la Consola de API
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.