只允许我的 android 应用程序在 java 中执行端点 api

Posted

技术标签:

【中文标题】只允许我的 android 应用程序在 java 中执行端点 api【英文标题】:Allowing only my android apps to execute endpoint api in java 【发布时间】:2016-05-24 06:10:42 【问题描述】:

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

【问题讨论】:

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

【讨论】:

以上是关于只允许我的 android 应用程序在 java 中执行端点 api的主要内容,如果未能解决你的问题,请参考以下文章

Android XML解析错误:只允许一个根元素

如何使用 Java 1.6 开发 Android 应用程序?

Android 8.0:java.lang.IllegalStateException:不允许启动服务 Intent

如何只允许在 Java 中的 JTextField 中浮动

在 android studio 中只调试 JAVA 代码

用于考勤应用程序的 Android 指纹 API [关闭]