android - sacar - huella digital firebase
¿Cómo verifica Google las huellas dactilares y los paquetes de Android SHA1? (1)
Estoy intentando hacer funcionar mi API de Google Translate, pero actualmente no puedo encontrar la manera. Así es como configuré las cosas en Google Developer Console:
He configurado mi huella digital SHA1 con los certificados de depuración. Y el nombre del paquete - "bg.webmap.wordy" (que es el nombre real). Cuando trato de hacer una llamada, se devuelve un error "ipRefererBlocked" en JSON. Pero cuando elimino la huella digital y el nombre del paquete, funciona perfectamente, pero todos pueden usar esta clave, por lo que es muy inseguro. Entonces mi problema es con la autenticación.
¿Mi aplicación enviará automáticamente esta huella digital cuando se llame a la API? ¿Debería enviarlo yo mismo y cómo? ¿Puede el problema estar en los certificados de depuración?
¿Mi aplicación enviará automáticamente esta huella digital cuando se llame a la API?
¡NO!
¿Debería enviarlo yo mismo y cómo?
¡SÍ!
Al configurar la restricción de la clave de API para la aplicación de Android, especificó el nombre del paquete y la huella digital del certificado SHA-1. Por lo tanto, cuando envíe una solicitud a Google, debe agregar esta información en el encabezado de cada solicitud.
¿CÓMO?
Tal como se responde aquí , debe obtener su nombre de paquete y certificado SHA de su código y luego agregarlo al encabezado de solicitud.
Obtenga el certificado SHA:
/**
* Gets the SHA1 signature, hex encoded for inclusion with Google Cloud Platform API requests
*
* @param packageName Identifies the APK whose signature should be extracted.
* @return a lowercase, hex-encoded
*/
public static String getSignature(@NonNull PackageManager pm, @NonNull String packageName) {
try {
PackageInfo packageInfo = pm.getPackageInfo(packageName, PackageManager.GET_SIGNATURES);
if (packageInfo == null
|| packageInfo.signatures == null
|| packageInfo.signatures.length == 0
|| packageInfo.signatures[0] == null) {
return null;
}
return signatureDigest(packageInfo.signatures[0]);
} catch (PackageManager.NameNotFoundException e) {
return null;
}
}
private static String signatureDigest(Signature sig) {
byte[] signature = sig.toByteArray();
try {
MessageDigest md = MessageDigest.getInstance("SHA1");
byte[] digest = md.digest(signature);
return BaseEncoding.base16().lowerCase().encode(digest);
} catch (NoSuchAlgorithmException e) {
return null;
}
}
Agregar al encabezado de solicitud:
java.net.URL url = new URL(REQUEST_URL);
HttpURLConnection connection = (HttpURLConnection)url.openConnection();
try {
connection.setDoInput(true);
connection.setDoOutput(true);
connection.setRequestProperty("Content-Type", "application/json; charset=UTF-8");
connection.setRequestProperty("Accept", "application/json");
// add package name to request header
String packageName = mActivity.getPackageName();
connection.setRequestProperty("X-Android-Package", packageName);
// add SHA certificate to request header
String sig = getSignature(mActivity.getPackageManager(), packageName);
connection.setRequestProperty("X-Android-Cert", sig);
connection.setRequestMethod("POST");
// ADD YOUR REQUEST BODY HERE
// ....................
} catch (Exception e) {
e.printStackTrace();
} finally {
connection.disconnect();
}
Puedes ver la respuesta completa aquí .
Disfruta de la codificación :)