Как Google проверяет отпечатки пальцев и пакеты Android SHA1?

Я пытаюсь заставить работать мой Google Translate API, но в настоящее время не могу найти способ. Вот как я настроил вещи в консоли разработчика Google:
Я установил свой отпечаток SHA1 с сертификатами отладки. И имя пакета -"bg.webmap.wordy"(которое является фактическим именем). Когда я пытаюсь сделать вызов, в JSON возвращается ошибка "ipRefererBlocked". Но когда я удаляю отпечаток пальца и имя пакета, он работает отлично, но тогда каждый может использовать этот ключ, поэтому он очень небезопасен. Так что моя проблема с аутентификацией.
Будет ли мое приложение автоматически отправлять этот отпечаток при вызове API? Должен ли я отправить его сам и как? Может ли проблема быть в отладочных сертификатах?

1 ответ

Будет ли мое приложение автоматически отправлять этот отпечаток при вызове API?

НЕТ!

Должен ли я отправить его сам и как?

ДА!

При настройке ограничения ключа API для приложения Android вы указали имя пакета и отпечаток сертификата SHA-1. Поэтому, когда вы отправляете запрос в Google, вы должны добавить эту информацию в заголовок каждого запроса.

КАК?

Как ответили здесь, вам нужно получить имя вашего пакета и сертификат SHA из вашего кода, а затем добавить в заголовок запроса.

Получить сертификат 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;
    }
}

Добавление в заголовок запроса:

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

Вы можете увидеть полный ответ здесь.

Наслаждайтесь кодированием:)

Другие вопросы по тегам