gpt4 book ai didi

android - 如何限制 Google App Engine Endpoints API 仅访问我的 Android 应用程序?

转载 作者:IT老高 更新时间:2023-10-28 22:22:40 26 4
gpt4 key购买 nike

我是一名 Android 开发人员,为我的应用程序构建我的第一个 Google App Engine (java) 后端。除了我的应用程序之外,我不希望其他任何人访问此 API。 (我计划在我的 Android 应用中使用 App 引擎来验证 InApp 购买)。我的数据与用户无关,所以,
我不希望用户能够访问我的 API,即使他们使用他们的 Google 帐户(在 Web 或 Android 设备上)登录。

我按照“在 API 后端指定授权客户端”中提到的步骤进行操作
(https://developers.google.com/appengine/docs/java/endpoints/auth)
比如生成客户端 ID 并将它们添加到 @Api(客户端 ID 和受众)中
除了“添加用户参数” - 因为我不需要用户身份验证。

然后我部署了 App 引擎,我仍然可以通过 API Explorer (https://your_app_id.appspot.com/_ah/api/explorer) 访问 API
(我没有添加 API_EXPLORER 客户端 ID)

在添加客户端 ID 之前,我使用端点库构建的 APK 进行了测试,并且仍然可以访问 API。

  • 是否必须向所有端点 API 添加“用户参数”?实现我的目的(将 API 限制为仅我的 Android 应用程序)。
  • 我可以从 Android 客户端将 null 作为 userAccount 名称传递并忽略服务器上的用户参数值(因为它将为 null)吗?这会确保 API 只能从我的 Android 应用程序访问(因为客户端 ID 是为我的包名称和 APK 的 SHA1 生成的?)
  • 我应该为此目的使用服务帐户之类的东西吗?

  • 文档说对于 Android,必须添加 Android 和 Web 客户端 ID,并且受众必须与 Web 客户端 ID 相同。这是否开放对任何其他 Web 客户端的访问?我可以跳过提及 Web 客户端 ID 并仍然实现我的目的吗?

    感谢您的时间和帮助。

    ......更新我的进一步调查......

    我做了以下事情:
  • 在后端的 API 中添加了用户参数 - 但没有检查空值。 API 仍然可以在不传递任何凭据的情况下访问(来自 Android 调试 APK 和 API 资源管理器)
  • 然后,我尝试了

    mCredential = GoogleAccountCredential.usingAudience(this, "server:client_id:"+ WEB_CLIENT_ID);
    mCredential.setSelectedAccountName(null);

  • 并将此凭据传递给 API 构建器(如其他一些帖子中所建议的)
    导致致命异常。所以,我们不能传递空账户名。
  • 我可以在没有 OAuth 的情况下使用 API Explorer 调用 API。但是当我启用 OAuth 时,它给出了错误,说这个客户端 ID 是不允许的! (我还没有在 client_ids 中添加 com.google.api.server.spi.Constant.API_EXPLORER_CLIENT_ID{})
  • 然后,如果用户为空,我添加了代码以在后端抛出 OAuthRequestException。这导致 API Explorer 在没有 OAuth 的情况下出现错误。在将 API_EXPLORER_CLIENT_ID 添加到 client_ids 后启用 OAuth)
  • 添加了代码以从我的 Android 应用程序传递有效的用户帐户名称(电子邮件)。然后,我只能使用我的发布 APK 访问 API。甚至调试 APK 也会出现异常! - 这是我所期望的......所以,我认为没有其他 Android 应用程序能够访问这个 API。

  • 因此,不检查后端 API 上的空用户是一个坏主意(正如其他帖子中所建议的那样)。就像不提及任何 client_ids 并且没有用户参数一样好。

    我现在唯一的问题是:如果有人可以从 APK 中找出 WEB_CLIENT_ID,他们是否能够使用它来构建一个 Web 客户端来访问我的 API(我在代码中的任何地方都没有提到客户端密码。所以我认为这是不可能的)。

    我确实搜索了 Google 群组和 Stackoverflow,但仍然不清楚。
  • (向谷歌云端点验证我的“应用程序”而不是“用户”)
    Authenticate my "app" to Google Cloud Endpoints not a "user"
  • (如何保护使用 Google Cloud Endpoints 构建的 API?)
    How do I protect my API that was built using Google Cloud Endpoints?
  • (限制对谷歌云端点的访问到安卓应用)
    Restrict access to google cloud endpoints to Android app
  • 最佳答案

    我有一个类似的问题,不是在 Android 和 App Engine 之间,而是在单独的服务器和 App Engine 之间。我处理它的方式是在每个 API 调用中添加一个签名哈希字段作为参数。如果请求的签名不正确,则会被拒绝。

    例如,假设您的 API 端点是 example.com/api/do_thing?param1=foo .我将散列整个 url 以及一个 key ,然后将散列结果附加到请求中:example.com/api/do_thing?param1=foo&hash=[some long hex value] .

    然后,在服务器端,我将首先从 url 请求中删除哈希,然后对剩余的所有内容运行哈希。最后,您检查计算的哈希值是否与请求一起发送的哈希值匹配,如果不匹配,您可以拒绝该请求。

    但是,您的 key 必须保密,这一点非常重要。您必须在 Android 上小心这一点,因为有人可能会尝试反编译您的 APK。

    关于android - 如何限制 Google App Engine Endpoints API 仅访问我的 Android 应用程序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21825175/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com