【问题标题】:Restrict access to google cloud endpoints to Android app将对谷歌云端点的访问限制为 Android 应用
【发布时间】:2013-07-26 06:56:12
【问题描述】:

我正在使用 Android Studio 为 Android 应用生成 Google Cloud Endpoints。我已经部署了端点并且它们工作正常。

我想要实现的是只允许对我的应用程序访问端点。所有文档都讨论了如何为用户启用身份验证,但我只需要限制仅从我的应用程序访问端点。我不想使用用户凭据,因为 api 不使用它。

我尝试的是在 Google 控制台中为我的应用创建客户端 ID 并添加到 APi 注释

@Api(name = "messageEndpoint", clientIds = {Ids.WEB_CLIENT_ID, Ids.ANDROID_CLIENT_ID, Ids.API_EXPLORER}, audiences = {Ids.ANDROID_AUDIENCE}}

对于每个 API 方法,我添加了一个用户参数并检查用户是否为空。我的理解是,如果从客户端 IDS 之一调用 API,则用户不应为空。但用户始终为空。

我错过了什么吗?

在我的 Android 应用中

GoogleAccountCredential credential = GoogleAccountCredential.usingAudience(DelegateActivity.this, "server:client_id:" + Ids.ANDROID_AUDIENCE);
MessageEndpoint.Builder endpointBuilder = new MessageEndpoint.Builder(
                        AndroidHttp.newCompatibleTransport(), new JacksonFactory(),
                        credential);

我得到的例外是:

java.lang.NullPointerException: [qi] accountName cannot be null.
                        E   at android.os.Parcel.readException(Parcel.java:1431)
                        E   at android.os.Parcel.readException(Parcel.java:1379)
                        E   at com.google.android.gms.internal.a$a$a.a(Unknown Source)
                        E   at com.google.android.gms.auth.GoogleAuthUtil.getToken(Unknown Source)
                        E   at com.google.android.gms.auth.GoogleAuthUtil.getToken(Unknown Source)
                        E   at com.google.api.client.googleapis.extensions.android.gms.auth.GoogleAccountCredential.getToken(GoogleAccountCredential.java:277)
                        E   at com.google.api.client.googleapis.extensions.android.gms.auth.GoogleAccountCredential$RequestHandler.intercept(GoogleAccountCredential.java:301)
                        E   at com.google.api.client.http.HttpRequest.execute(HttpRequest.java:854)
                        E   at com.google.api.client.googleapis.services.AbstractGoogleClientRequest.executeUnparsed(AbstractGoogleClientRequest.java:410)
                        E   at com.google.api.client.googleapis.services.AbstractGoogleClientRequest.executeUnparsed(AbstractGoogleClientRequest.java:343)
                        E   at com.google.api.client.googleapis.services.AbstractGoogleClientRequest.execute(AbstractGoogleClientRequest.java:460)

【问题讨论】:

  • 你找到解决办法了吗?

标签: android android-studio google-cloud-endpoints


【解决方案1】:

我的理解是,在您描述的情况下,用户将为空:验证应用程序而不是用户。

如果应用身份验证失败,那么您的端点甚至不会被调用。

我假设字符串“[qi] accountName 不能为空。”来自您的应用?

【讨论】:

  • 所以在我的应用程序中,我不应该使用 GoogleAccountCredential 并依赖 API 知道调用来自正确的应用程序吗?但我也可以直接从 Web 访问 API。这是因为我在端点中声明了一个 Web 客户端 ID?
  • 我认为,由于确实调用了您的端点,因此无论您在客户端做什么都可以正常工作。停止在服务器上检查空用户。
  • 您也可以在没有凭据的情况下创建 Endpoint.Builder,只需将 null 作为参数传递。它是否有效取决于您的端点应用程序。
  • 如果您在没有凭据的情况下创建 Endpoint.Builder,那么您必须删除 API 中关于 User 是否为 null 的任何检查。这样做的结果是您的 API 不再安全。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-01-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-01-29
  • 1970-01-01
  • 2018-06-22
相关资源
最近更新 更多