【问题标题】:Authenticate my "app" to Google Cloud Endpoints not a "user"向 Google Cloud Endpoints 验证我的“应用程序”而不是“用户”
【发布时间】:2013-12-05 09:49:13
【问题描述】:

我正在尝试向 Google Cloud Endpoint 验证我的 Android 应用。 基本上,端点应该只允许我的 Android 应用访问这些方法,而不是其他任何东西。

这些事情我都做过——

  1. 在 Google Cloud Console 的 Eclipse 中使用我的 SHA1 值创建客户端 ID。

  2. 在 Google Cloud Console 中为我的端点项目创建一个 Web 客户端 ID。

  3. 在每个端点上提到的“@Api”中添加这两个客户端 ID。

  4. 在端点方法中添加一个额外的“用户”参数。

  5. 重新生成后端并将其部署到云端。

但是当我运行它时,“用户”总是以“空”的形式出现。我正在努力寻找一种合适的工作方法来完成这一切。

我搜索了很多论坛,但没有找到合适的答案。

这是另一个类似的帖子Restrict access to google cloud endpoints to Android app

这是我正在使用的参考 - https://developers.google.com/appengine/docs/java/endpoints/auth

这里有人做过吗?出于明显的安全原因,我的主要目标是不允许未经身份验证的应用程序和外部世界访问端点。我不想使用基于最终用户的身份验证,因为我想让我的应用程序非常简单。

【问题讨论】:

  • 您有没有按要求完成这项工作?我也面临同样的问题。
  • 这是很久以前的事了,但如果我没记错的话,简短的回答是“不”,除非你有一个用户被发送,否则你不能做“只允许我的应用程序”的事情。如果你有一个用户也被发送了,一切都很完美......而且有了 IOS 和云端点,它变得更加奇怪......我最终离开了 GCL
  • 有这方面的新闻吗?我真的在尝试做同样的事情......
  • 不再处理此问题,因此没有新信息

标签: android google-app-engine oauth-2.0 cloud google-cloud-endpoints


【解决方案1】:

听起来它正在按预期工作。您可以控制哪些客户端应用程序可以通过客户端 ID 调用您的端点方法,就像您已经完成的那样。 User 参数传入为 null 正是因为您没有进行最终用户身份验证。 User 参数表示实际的真实用户(Google 帐户)。因此,如果您不需要最终用户身份验证的方法,您可以简单地不定义 User 参数,或者忽略 null 值。你说你的问题是用户参数设置为空。在这种情况下,您期望它是什么?

【讨论】:

  • 即使我们忘记了用户为 null,我注意到一个无效的客户端应用程序也被允许访问进入 api 方法。我通过创建一个无效的 android 客户端密钥(基于不是我的客户端的 sha1)并将其添加到应用程序引擎后端来测试这一点。这意味着我的应用程序的密钥现在应该不再有效地访问应用程序引擎。然后我运行了测试,但即便如此,我的具有不同 sha1 的应用程序仍然能够访问这些方法并执行它们。所以基本上 api 方法访问是允许的,即使键不匹配。
  • 或者我需要在客户端以不同的方式执行此操作以使此“仅应用程序身份验证”方案正常工作。目前我的客户端代码只是调用与没有身份验证的普通应用程序相同的端点。我需要从客户端发送一些虚拟凭据吗?
  • 您没有具体说明是否删除了旧密钥,只是添加了新密钥。假设您从 API 注释中删除了旧密钥,您是部署到实时服务器还是使用开发服务器进行测试?您是否重新生成了 API 发现文档? (我不确定这是否重要。)您是否尝试过从 Google 的 API 资源管理器访问此 API?如果是这样,当您删除 API Explorer 密钥时会发生什么?
【解决方案2】:

您需要在客户端调用身份验证,然后您使用的库可能会“注入”用户信息。

【讨论】:

    【解决方案3】:

    这对我有用:

    假设您有以下键:

    static final String WEB_CLIENT_ID = "somekeyfor webclientid.apps.googleusercontent.com";
    

    静态最终字符串 ANDROID_CLIENT_ID = "somekeyfor androidclientid.apps.googleusercontent.com"; 静态最终字符串 ANDROID_AUDIENCE = WEB_CLIENT_ID;

    您的 Api 注释应如下所示:

    @Api(
            name = "yourapiname",
            clientIds = {CloudEndpoint.WEB_CLIENT_ID,CloudEndpoint.ANDROID_CLIENT_ID},
            audiences = {CloudEndpoint.ANDROID_AUDIENCE},
            version = "v1",
            namespace = @ApiNamespace(
                    ownerDomain = "myapp.app.com",
                    ownerName = "myapp.app.com",
                    packagePath = ""
            )
    )
    

    在下面的注释中,请注意您的受众如何是变量 --> ANDROID_AUDIENCE 等于 WEB_CLIENT_ID。

    现在在您的应用程序端,当您创建 googleAccountCredential 对象时,您应该像这样传递 Web 客户端 ID:

    mAccountCredentials = GoogleAccountCredential.usingAudience(getApplicationContext(),"server:client_id:" + "yourwebclientID");
    

    请注意,即使正确完成此操作,如果您在 mAccountCredentials.setSelectedAccountName("accontname") 中传递的帐户名称在设备中不存在,您在端点中的用户对象仍可能显示为 Null。因此,请确保您传递的帐户名称确实存在于 Android 设备中,方法是转到 -->(设置/帐户)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-10-11
      • 2013-06-02
      • 1970-01-01
      • 1970-01-01
      • 2015-11-14
      • 2020-06-17
      • 2018-12-29
      • 1970-01-01
      相关资源
      最近更新 更多