5

我试图让谷歌端点工作。我创建了一个端点服务,并能够通过谷歌 API exploer 测试它的工作正常。然后我生成了 android 客户端并尝试调用我的端点服务。我在日志中看到这个错误,

04-05 08:48:20.547: I/GLSUser(13505): GLS error: INVALID_AUDIENCE myemail@gmail.com audience:server:client_id:334082396285-hfn3t2g5pg0gv8fshf22kaadq9fs23e2.apps.googleusercontent.com

这是我用于构建凭据的 android java 代码,即用于访问我的服务,

AUDIENCE = "server:client_id:334082396285-hfn3t2g5pg0gv8fshf22kaadq9fs23e2.apps.googleusercontent.com";
credential = GoogleAccountCredential.usingAudience(this, AUDIENCE);
            setAccountName(settings.getString(PREF_ACCOUNT_NAME, null));

看起来client_id 有一些不匹配。这是我所做的,

1) 在一个 API 项目的 Google API 控制台中创建了 2 个 client_id,a) WEB_CLIENT_ID = 我为 Web 应用程序创建了一个 client_id,其中重定向 URIs = None & JavaScript origins = None。b) ANDROID_CLIENT_ID = 为带有包名和 sha1 证书指纹的 android 应用创建了一个 client_id。

2)然后在我的python端点服务中使用这些,

@endpoints.api(name='devices',
               version='v1',
               description='Service to register devices',
               allowed_client_ids=[ANDROID_CLIENT_ID,WEB_CLIENT_ID,endpoints.API_EXPLORER_CLIENT_ID],
               audiences = [WEB_CLIENT_ID])

完整的日志

04-05 08:48:20.397: D/overlay(159): Set pipe=RGB1 dpy=0; Set pipe=VG0 dpy=0; 
04-05 08:48:20.547: W/GLSUser(13505): Status from wire: INVALID_AUDIENCE status: null
04-05 08:48:20.547: W/GLSUser(13505): Status from wire: INVALID_AUDIENCE status: null
04-05 08:48:20.547: I/GLSUser(13505): GLS error: INVALID_AUDIENCE myemail@gmail.com audience:server:client_id:334082396285-hfn3t2g5pg0gv8fshf22kaadq9fs23e2.apps.googleusercontent.com
04-05 08:48:20.547: W/GLSUser(13505): Status from wire: Unknown status: UNKNOWN
04-05 08:48:20.547: W/System.err(31908): com.google.api.client.googleapis.extensions.android.gms.auth.GoogleAuthIOException
04-05 08:48:20.547: W/System.err(31908):    at com.google.api.client.googleapis.extensions.android.gms.auth.GoogleAccountCredential$RequestHandler.intercept(GoogleAccountCredential.java:224)
04-05 08:48:20.547: W/System.err(31908):    at com.google.api.client.http.HttpRequest.execute(HttpRequest.java:836)
04-05 08:48:20.547: W/System.err(31908):    at com.google.api.client.googleapis.services.AbstractGoogleClientRequest.executeUnparsed(AbstractGoogleClientRequest.java:412)
04-05 08:48:20.557: W/System.err(31908):    at com.google.api.client.googleapis.services.AbstractGoogleClientRequest.executeUnparsed(AbstractGoogleClientRequest.java:345)
04-05 08:48:20.557: W/System.err(31908):    at com.google.api.client.googleapis.services.AbstractGoogleClientRequest.execute(AbstractGoogleClientRequest.java:463)
04-05 08:48:20.557: W/System.err(31908):    at com.package.appname.SetupActivity$SendResultToServerTask.doInBackground(SetupActivity.java:174)
04-05 08:48:20.557: W/System.err(31908):    at com.package.appname.SetupActivity$SendResultToServerTask.doInBackground(SetupActivity.java:1)
04-05 08:48:20.557: W/System.err(31908):    at android.os.AsyncTask$2.call(AsyncTask.java:287)
04-05 08:48:20.557: W/System.err(31908):    at java.util.concurrent.FutureTask.run(FutureTask.java:234)
04-05 08:48:20.557: W/System.err(31908):    at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:230)
04-05 08:48:20.557: W/System.err(31908):    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1080)
04-05 08:48:20.557: W/System.err(31908):    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:573)
04-05 08:48:20.557: W/System.err(31908):    at java.lang.Thread.run(Thread.java:856)
04-05 08:48:20.557: W/System.err(31908): Caused by: com.google.android.gms.auth.GoogleAuthException: Unknown
04-05 08:48:20.557: W/System.err(31908):    at com.google.android.gms.auth.GoogleAuthUtil.getToken(Unknown Source)
04-05 08:48:20.557: W/System.err(31908):    at com.google.android.gms.auth.GoogleAuthUtil.getToken(Unknown Source)

已经看到类似的线程,他们没有帮助, Google Api 和 android Oauth INVALID_AUDIENCE 错误

4

5 回答 5

6

我解决了在 google api 控制台中为项目设置名称的问题。

在 [APIs & auth] --> [Consent screen] 中的新 UI API 控制台中

于 2013-12-09T05:55:00.197 回答
4

呸!终于让它工作了。不知道出了什么问题。尝试了这些东西,删除了调试密钥库文件并重新生成了它。将 sha1 指纹复制到 api 控制台。然后按照这里的说明 - http://android-developers.blogspot.com/2013/01/verifying-back-end-calls-from-android.html确保我至少可以在 android 设备上获得令牌。然后我改为使用端点生成的客户端类。现在我的应用程序能够通过端点服务与应用程序引擎后端通信。

于 2013-04-06T03:31:05.650 回答
3

如果您注释 @Api#clientIds 的 ANDROID_CLIENT_ID 与 Android 客户端的 Android 程序包名称不同,您将收到此错误。

例如

@Api(
    name = "yourFirstService",
    version = "v1",
    namespace = @ApiNamespace(ownerDomain = "myorg.org", ownerName = "My Org", packagePath = "firstservice" ),
    scopes = {Constant.API_EMAIL_SCOPE},
    clientIds = {Constants.ANDROID_CLIENT_ID, Constant.API_EXPLORER_CLIENT_ID},
    audiences = {Constants.ANDROID_AUDIENCE}
)
public class YourFirstAPI { 
  ...
}

兴趣点是 clientId 属性。那里的 ANDROID_CLIENT_ID 需要

  1. 匹配应用程序中的 clientId Cloud Console->APIS & Auth->Credentials->Client ID for Android
  2. 该 clientId 的包名称需要与您用作客户端的 Android 应用程序相同。
于 2014-07-12T02:18:00.687 回答
2

当我在另一个系统上创建新的开发环境时,我遇到了这个问题。我在新系统上安装了 Android Studio 并复制了代码。在我的旧系统上工作的相同代码在新系统上不起作用,带有 INVALID_AUDIENCE。在尝试了几件事之后,最终奏效的是将 debug.keystore 文件从我的旧系统复制到新系统。在 Windows 上,该文件位于 %USERPROFILE%.android。这是有道理的,因为 debug.keystore 是由 Android Studio 在安装时专门为该计算机生成的。debug.keystore 有一个过期日期(我听说是 365 天),所以这也可能是原因。所以对我来说真正的解决方案是在新系统上重新生成 debug.keystore 文件。删除 debug.keystore 文件并重新启动 Android Studio 将重新生成该文件。然后运行 ​​keytool 以获取 SHA1 证书指纹。然后去http://console.developers.google.com以使用指纹创建新的客户端 ID。

于 2014-06-01T00:31:53.853 回答
2

发生在我的团队中,尽管它在我的设备上运行良好。原来是因为debug.keystore我们的 Eclipse 安装不同。

为了解决这个问题,我们将公司的debug.keystore文件复制到~/.android/ (这是 mac 上的目录,在 linux 和 windows 上是不同的)

于 2014-12-18T10:54:17.413 回答