【问题标题】:Google Books API - keep getting error code "403" reason: "ipRefererBlocked"Google Books API - 不断收到错误代码“403”原因:“ipRefererBlocked”
【发布时间】:2015-05-28 13:55:13
【问题描述】:

我使用这个作为我的请求网址:

`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.
我以为这就是答案,但后来偶然意识到这与根本不提供钥匙是一样的。在输入错误的字符串作为键后,我意识到了这一点,它仍然有效。

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

如果有人想出如何通过包含密钥使该 API 以 Google 想要的方式工作,我将非常感谢任何帮助。

【问题讨论】:

    标签: android google-api


    【解决方案1】:

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

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

    Key:"X-Android-Package",value:你的应用包名

    密钥:"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

    【讨论】:

      猜你喜欢
      • 2015-12-22
      • 2014-06-08
      • 1970-01-01
      • 2015-06-05
      • 2014-01-22
      • 1970-01-01
      • 2019-01-18
      • 2013-12-24
      • 1970-01-01
      相关资源
      最近更新 更多