GLS错误:Google云端点中的INVALID_AUDIENCE

时间:2013-04-05 16:19:39

标签: android python google-app-engine google-oauth google-cloud-endpoints

我正在努力让google端点工作。我创建了一个端点服务,并且能够通过Google API探测器测试其工作正常。然后我生成了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,其中包含Redirect URIs = None& JavaScript起源=无。 b)ANDROID_CLIENT_ID =为包含名称&的Android应用程序创建了一个client_id。 sha1证书指纹。

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 and android Oauth INVALID_AUDIENCE error

5 个答案:

答案 0 :(得分:6)

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

在[API& auth] - > [同意屏幕]

答案 1 :(得分:4)

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

答案 2 :(得分: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. Cloud Console->APIS & Auth->Credentials->Client ID for Android应用程序中匹配clientId。
  2. 该clientId的软件包名称必须与您用作客户端的Android应用程序相同。

答案 3 :(得分: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。

答案 4 :(得分:2)

虽然在我的设备上运行正常,却发生在我的团队中。 事实证明,这是因为我们的日食装置有不同的debug.keystore

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