【问题标题】:GLS error: INVALID_AUDIENCE in google cloud endpointsGLS 错误:谷歌云端点中的 INVALID_AUDIENCE
【发布时间】:2013-04-05 16:19:38
【问题描述】:

我正在尝试让 google 端点工作。我创建了一个端点服务,并能够通过 Google 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,其中 Redirect 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 and android Oauth INVALID_AUDIENCE error

【问题讨论】:

  • 在我的 API 控制台中重新生成了一个新的 Web 应用程序 client_id。在应用引擎后端的受众以及 android 受众范围内使用它。还是没有运气。
  • 重命名了我的安卓应用包并生成了一个新的安卓客户端ID。仍然得到同样的错误。
  • 为了消除明显的错误来源,您是否在物理 Android 设备(而不是模拟器)上在生产和测试中运行 Endpoint?
  • 是的,我已经使用 url (appid.appspot.com) 将我的端点应用程序部署到 GAE 并在我的 Nexus 4 上进行了测试。

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


【解决方案1】:

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

在 [APIs & auth] 中的新 UI API 控制台中 --> [同意屏幕]

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案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 应用相同。

      【讨论】:

      • 兄弟,你的意思是我需要在 @APi(..) 中的某处添加包名。我的应用程序包名与谷歌控制台的 android 应用程序包名相同,但我得到了同样的错误,请问你能帮忙吗?
      • Constants.ANDROID_CLIENT_ID 的值需要与您的 Android 应用程序包名称的值匹配(在 AndroidManifest 中)。它还需要与 Cloud Console 中的 clientId 匹配。
      • 你的意思是在谷歌控制台中创建客户端 ID 时询问的包名称吗?你告诉我;该包名称必须与清单中我的应用包名称相同?
      • 当您在适用于 Android 的 Google Cloud Console 中创建 OAuth clientId 时,您需要提供与您的 Android 应用完全相同的包名称。您还需要获取生成的 clientId 并将其指定为您的服务的 @Api 注释的 clientIds 属性的元素之一。
      • 谢谢你,我知道你了。实际上,“无效观众”问题发生在我的本地开发服务器中,但我现在修复了它。支持你:D
      【解决方案4】:

      当我在另一个系统上创建新的开发环境时,我遇到了这个问题。我在新系统上安装了 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。

      【讨论】:

        【解决方案5】:

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

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

        【讨论】:

        • 我使用Ubuntu 18.04,而debug.keystore存储在~/.android/,但这不适用于Windows
        猜你喜欢
        • 1970-01-01
        • 2020-03-06
        • 2017-11-07
        • 2015-05-10
        • 2015-10-27
        • 2014-07-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多