只允许我的 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 =allowed_client_ids
和 audiences
将您的 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的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 Java 1.6 开发 Android 应用程序?