【问题标题】:Allowing only my android apps to execute endpoint api in java只允许我的 android 应用程序在 java 中执行端点 api
【发布时间】:2025-12-02 05:25:02
【问题描述】:

我创建了端点 api,但问题是任何拥有我的项目 ID 的人都可以转到 api explorer 并执行这些 api。我只将 android 客户端 ID(使用调试密钥库)放在端点类声明的顶部,但我仍然可以进入隐身模式并执行 api。如何限制 api,以便只有我的 android 应用可以访问,而所有其他应用都会抛出异常?

【问题讨论】:

  • 您能否详细说明以下几点:您使用的是哪个 Google API?您将访问哪些数据? (用户数据与应用程序数据)
  • 看看 Dropbox 等如何处理身份验证。需要初始登录才能获取 API 密钥和固定的 https 通信。

标签: java android security google-app-engine google-cloud-endpoints


【解决方案1】:

可以通过添加一个必须正确才能调用 API 的关键参数来保护 API。如果 API 的用户不知道密钥,即使使用 API Explorer,他也无法使用 API。

这种方法的优点是操作简单,如果需要,您可以自己试验 API。

缺点包括很容易被坚定的用户绕过,只需查看流量即可。

【讨论】:

  • 谷歌没有建议的标准方法吗?
【解决方案2】:

您需要确保您已正确编码 API/后端,以便仅接受您应用的 clientId;确保您com.google.api.server.spi.Constant.API_EXPLORER_CLIENT_ID 视为API 类上@Api 注释中的clientId 之一:

@Api(
  name = "myApi",
  version = "v1",
  clientIds = {<your android clientId>},
)
public class myApi {
  // your API code here
}

如果存在 API Explorer 客户端 ID,它将允许它从 API 执行您的 API。我不能 100% 确定,但我认为您仍然可以在没有客户端 ID 的情况下从资源管理器中看到您的 API,但会因错误而阻止执行。

本文有更多信息:https://cloud.google.com/appengine/docs/java/endpoints/auth#Specifying_authorized_clients_in_the_API_backend

如果它特别敏感,您可能需要考虑在端点调用周围放置适当的身份验证(即每个用户的身份验证检查每个方法)。只需在 @ApiMethod 中添加一个 User 参数就足以强制用户在执行每个方法之前进行身份验证。

希望对您有所帮助。

【讨论】:

  • 正如我提到的,我已经有 clientIds = {} 存在于代码中
【解决方案3】:

您可以在每个 api 上使用 allowed_client_ids 仅作为 ANDROID_CLIENT_ID,这是一种可能的解决方法。

如果您还没有关注它,我认为这可能会有所帮助:https://cloud.google.com/appengine/docs/python/endpoints/auth#Python_Creating_OAuth_20_client_IDs

【讨论】:

  • 我的代码中确实有 clientIds = {}。是一样的吗?
  • 您可以在 api 端点装饰器中使用 allowed_client_idsaudiences 将您的 api 的使用限制为特定的客户端 ID,尝试阅读 - 在 API 后端指定授权客户端 在我上面分享的链接中
  • 如果它解决了这个目的,你也可以看看这个link
【解决方案4】:

为此使用对称密钥加密和数字签名。但是,您需要先与 Android 应用共享密钥。

这是它的工作原理。

每当 Android 应用发出网络请求时,您都会获取 URL 和参数,然后对其进行哈希处理,然后使用共享私钥对其进行加密。然后将签名作为另一个参数附加到 URL。

在接收端,您的 Web API 将验证请求是否仅来自您的 Android 应用。

请注意,这仅适用于您的应用。它不能作为捕获所有通用 Android 请求的一种方式/

【讨论】:

  • 当有人反编译您的应用程序时,这不会消失吗?因为他们将能够确定散列机制和私钥
  • 嗨@11m0,对于那些愿意加倍努力的人来说,这并不是一个完全万无一失的解决方案。但是,足以阻止大多数不受欢迎的访客。
【解决方案5】:

这里有几点需要考虑:

Cloud Endpoints 一直支持 ANDROID CLIENT ID 和 包签名,因此至少应该注意以下事实 只有您身边的已签名 Android 应用程序才能访问 端点

.

如果您希望从访问权限中删除 Web 客户端,那么我会 可能会查看 HTTP 标头和代理以查看是否存在 确定这些 Web 客户端的可靠方法。但是,这将 要求您在方法中编写自己的授权逻辑 因为我不相信端点基础设施可以采取 自动为您处理此问题

.

可以通过注释删除所有人的访问权限 如果您想快速使用 API Explorer 进行测试,则会出现问题 出API。所以请保持 API Explorer 访问可用。

【讨论】: