【发布时间】:2016-03-03 12:37:04
【问题描述】:
我的问题是关于如何在 Google Developers Console 中正确设置包名称和 SHA-1 证书指纹,以限制我的 Android API 密钥对我的应用的使用。
如果我没有在“限制使用您的 Android 应用”部分中设置任何内容,我对 Google Translate API 的请求可以正常工作。 API 正常响应状态码 200 和我的预期结果。
但是,当我使用 Developers Console 为我的应用程序指定包名称和 SHA-1 证书指纹时,我始终收到 403 Forbidden 响应,如下所示:
HTTP/1.1 403 Forbidden
Vary: Origin
Vary: X-Origin
Content-Type: application/json; charset=UTF-8
Date: Sun, 29 Nov 2015 21:01:39 GMT
Expires: Sun, 29 Nov 2015 21:01:39 GMT
Cache-Control: private, max-age=0
X-Content-Type-Options: nosniff
X-Frame-Options: SAMEORIGIN
X-XSS-Protection: 1; mode=block
Server: GSE
Alternate-Protocol: 443:quic,p=1
Alt-Svc: quic=":443"; ma=604800; v="30,29,28,27,26,25"
Content-Length: 729
{
"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."
}
}
请求如下所示。请注意,请求中没有 referer 标头:
GET https://www.googleapis.com/language/translate/v2?key=XXXXXXXXXXXXXXXXXXXXXXXX-XXXXXXXXXXXXXX&source=en&target=es&q=test HTTP/1.1
User-Agent: Dalvik/2.1.0 (Linux; U; Android 5.1.1; Nexus 6 Build/LVY48H)
Host: www.googleapis.com
Connection: Keep-Alive
Accept-Encoding: gzip
我假设错误消息表示包名称或 SHA-1 指纹问题,尽管它的消息是关于“per-IP or per-Referer 限制”。虽然浏览器键允许设置 per-referer 限制,但我使用的是 Android 键,无法设置 per-IP 或 per-Referer 限制。
我确定我已在 Google Developers Console 中正确输入了包名称。我正在从我的 Android 清单文件中 manifest 标记上的 package 属性中读取包名称。
我还确定我在 Google Developers Console 中正确设置了 SHA-1 指纹。我正在使用命令keytool -list -v -keystore /path/to/my/keystore 从我的密钥库中读取这个值。当我使用 keytool -list -printcert -jarfile myAppName.apk 从 APK 文件中读取它时,我得到了相同的值。我正在使用 adb 安装相同的 APK 文件。
这是我在开发者控制台中看到的:
我已经在多台运行原生 Android 的设备上对此进行了测试。无论我是否代理流量,我都会在 wifi 和蜂窝网络上收到错误响应。
当我从开发者控制台中移除限制后,应用程序再次正常运行。
我在这里做错了什么?
注意:Severalsimilarquestionshavebeenaskedbefore,before,butwithno@987653333331@98765333@2.我不想使用浏览器密钥或完全删除限制。我想让使用限制正常工作。
【问题讨论】:
-
只是一个快速的健全性检查 - 您正在使用发布密钥进行测试,而不是使用调试证书?
-
是的——这是一个释放密钥。
-
您使用的是 Rest API 还是 Java 库?
-
我是直接使用API,没有使用Java库。
-
我刚刚注册您正在使用纯 REST API。为此,您需要使用
GoogleAuthUtil,它将为特定用户和包/指纹生成令牌。但是,这需要GET_ACCOUNTS权限,聪明的用户对此感到厌烦。您也可以使用 AccountManager 的getAuthToken()方法,但这不仅需要GET_ACCOUNTS权限,还需要USE_CREDENTIALS。您最好使用 API 密钥并稍微隐藏一下。
标签: android google-api google-cloud-platform google-translate