Google Books API - 不断收到错误代码“403”原因:“ipRefererBlocked”

时间:2015-03-25 02:29:52

标签: android google-api

我使用此作为我的请求网址:

`String isbnUrl = "https://www.googleapis.com/books/v1/volumes?q=isbn:" + isbn + "&key=" + myAPIKEY;`

任何人都可以告诉我为什么我会继续得到这样的回应:

{
   "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."
   }
}

我已经完成了使用调试密钥库和发布密钥库为我的Android应用程序获取API的过程,并且似乎无法使其工作我尝试将我的密钥添加为标题,建议作为答案在这里:Google Books API 403 Access Not Configured
我认为这是答案,但后来意外地意识到它与完全不提供密钥相同。在输入错误的String作为键之后,我开始实现这一点,它仍然有效。

在开发者控制台中,我看到它在使用响应代码部分接收来自我的API的请求:客户端错误(4xx)。

如果有人知道如何通过包含密钥来让这个API以Google想要的方式运行,我真的很感激。

1 个答案:

答案 0 :(得分:0)

问题是在为Android应用设置API密钥限制时,您指定了包名称和SHA-1证书指纹。因此,您的API密钥仅接受来自您的应用程序的请求,其中包含包名称和SHA-1证书指纹。

因此,当您向Google发送请求时,您必须使用以下键在每个请求的标头中添加这些信息:

键:"X-Android-Package",值:您的应用包名称

键:"X-Android-Cert",值:apk的SHA-1证书

首先,获取您的应用程序SHA签名(您将需要Guava库):

/**
 * 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;
    }
}

然后,将包名称和SHA证书签名添加到请求标头:

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

您可以看到full answer here

享受编码:D