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:
- Cómo agregar el logotipo en la pantalla de consentimiento de google?
- Obtener tiempo de caducidad de token de acceso de Google en Android
- Inicio de sesión de Android con acceso inactivo de google
- Cómo restaurar un proyecto de consola de Google eliminado
- Los botones 'cancelar' y 'aceptar' de la página de inicio de sesión de Google OAuth no están habilitados desde el 22 de agosto
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?
- Token de actualización de accountmanager (acceso sin conexión)
- Gmail API 403 Dominio de permisos insuficientes global
- No se puede obtener el código de autorización con el inicio de sesión de Google+ para Android: INVALID_SCOPE
- Uso de Google OAuth 2 en dispositivos incrustados basados en Android
- Cómo registrar usuarios con la cuenta de Google en la aplicación Android
- Cómo utilizar GoogleApiClient para proporcionar credenciales para el cliente de punto final de la nube
- El texto "Aplicación no registrada de Android" se muestra en el cuadro de diálogo de permiso de información de perfil de usuario
- Google oauth2 funciona con un código de tiempo generado desde Android pero no funciona para el código generado desde JS SDK
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 …
- ¿Cómo controlar el historial de Android WebView / la pila trasera?
- Programación funcional pura en android