2015-07-23 9 views
5

Sto tentando di far funzionare la mia API di Google Translate ma al momento non riesco a trovare la via. Ecco come ho impostato le cose in Google Developer Console:
Ho impostato la mia impronta digitale SHA1 con i certificati di debug. E il nome del pacchetto - "bg.webmap.wordy" (che è il nome effettivo). Quando provo a effettuare una chiamata, viene restituito un errore "ipRefererBlocked" in JSON. Ma quando rimuovo l'impronta digitale e il nome del pacchetto, funziona perfettamente, ma poi tutti possono usare questa chiave, quindi è molto insicuro. Quindi il mio problema è con l'autenticazione.
La mia app invierà automaticamente questa impronta quando viene chiamata l'API? Dovrei inviarlo da solo e come? Il problema potrebbe essere nei certificati di debug?In che modo Google verifica le impronte e i pacchetti Android SHA1?

+0

Avete trovato la risposta alla tua domanda, @BabbevDan? – marcv

+0

No, l'ho chiuso in modo non protetto – BabbevDan

risposta

1

La mia app invierà automaticamente questa impronta digitale quando l'API è chiamata?

NO!

Devo inviarlo da solo e come?

SÌ!

Quando si imposta la restrizione della chiave API per l'app Android, è stato specificato il nome del pacchetto e l'impronta digitale del certificato SHA-1. Pertanto, quando invii una richiesta a Google, devi aggiungere queste informazioni nell'intestazione di ciascuna richiesta.

COME?

As answered here, è necessario ottenere il nome del pacchetto e il certificato SHA dal codice e quindi aggiungere all'intestazione della richiesta.

ottenere il certificato 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; 
    } 
} 

aggiunta alla richiesta di intestazione:

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

Si può vedere piena risposta here.

Godetevi codifica :)

Problemi correlati