Как использовать открытый ключ доступа Google API в приложении для Android?
Я хочу использовать Google Translate API (v2) в моем приложении для Android.
Что я сделал:
- созданный проект в консоли разработчиков Google
- настроить биллинг для этого проекта
сгенерировано 2 открытых ключа доступа API для приложений Android:
а. Первый, который принимает запрос от любого приложения
б. Второй, который принимает запросы только от моего приложения
Я пытался перевести текст из приложения через https://www.googleapis.com/language/translate/v2?key=MY-KEY&target=de&q=Hello%20world
Работает нормально с ключом от 3а), но не работает с ключом от 3б). Для 3б) сервер отправляет
{
"error": {
"errors": [
{
"domain": "usageLimits",
"reason": "ipRefererBlocked",
"message": "There is a per-IP or per-Referer restriction configured on your API key and the request does not match these restrictions. Please use the Google Developers Console to update your API key configuration if request from this IP or referer should be allowed.",
"extendedHelp": "https://console.developers.google.com"
}
],
"code": 403,
"message": "There is a per-IP or per-Referer restriction configured on your API key and the request does not match these restrictions. Please use the Google Developers Console to update your API key configuration if request from this IP or referer should be allowed."
}
}
Я предполагаю, что это потому, что сервер Google не получает никакой информации о моем приложении с этим запросом, поэтому он не может получить ключ 3b). Если да, то как правильно отправить этот запрос? Или, альтернативно, что я сделал не так где-то еще?
1 ответ
Если да, то как правильно отправить этот запрос?
При настройке ограничения ключа 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();
}
Вы можете увидеть полный ответ здесь.
Наслаждайтесь кодированием:)