1

为了了解端点,我正在构建一个名为“你在哪里?”的应用程序。该应用程序允许用户请求其他用户的位置。这个想法是通过让用户选择一个联系人,通过我的端点中的电话号码查找联系人来实现的。如果找到,则表示该联系人拥有该应用程序,并发送 GCM 请求该位置。如果未找到联系人,则会发送带有 URL 的短信,该 URL 将通过浏览器请求位置,执行所述位置的 http 发布并将服务器 GCM 发送回请求位置的人。

我需要验证应用程序的用户并存储多个联系人的电话号码以及应用程序的用户。到目前为止,我将主要关注服务器端的事情。

如何以安全的方式存档上述内容?

到目前为止,我正在为我的 API 启用 OAuth 2.0 并将user_required=Trueas 参数传递给我的Model.method装饰器。导致以下代码:

from google.appengine.ext import endpoints
from google.appengine.ext import ndb
from protorpc import remote
from endpoints_proto_datastore.ndb import EndpointsModel

class User(EndpointsModel):
    owner = ndb.UserProperty()
    phone_number = ndb.StringProperty()
    reg_id = ndb.StringProperty()
    created = ndb.DateTimeProperty(auto_now_add=True)

@endpoints.api(name='whereareyoudroid', version='v1', 
               description='Where Are You Users')
class UserApi(remote.Service):
    @User.method(user_required=True,
                 response_fields=('id',),
                 path='user')
    def insert(self, user):
        user.owner = endpoints.get_current_user()
        user.put()
        return user

    @User.method(user_required=True,
                 request_fields=('id',),
                 path='user/{id}',
                 http_method='GET')
    def get(self, user):
        if not user.from_datastore:
            raise endpoints.NotFoundException('User not found.')
        return user

但是上面的代码只需要一个有效的 gmail 帐户。我在想一些事情,如果您已经有了电话号码,您只能访问用户?如果我限制 get 方法上的响应字段以排除电话号码,就会出现这种情况......除非有人决定暴力破解服务。建议?评论?

据此,我收集到我可以将我的端点配置为仅接受来自我的应用程序的请求。是对的吗?如果是这样,有人不能从 apk 中提取需求信息或修改它以执行......邪恶吗?:)

更新:

  1. A 请求 B 的位置

    如果未找到,则通过电话号码查询端点,如果找到,只需通过 SMS 发送请求...转到 2。

  2. 请求被转发到 GAE 应用程序

    这是通过插入一个 ID 为 UUID 的 Location 端点并向 B 发送有关请求的 GCM 来完成的

  3. GAE 应用程序验证 A 的秘密 ID 在 B 的白名单中

    没有白名单,秘密 id 是 UUID,所以这一步被取消了

  4. 然后应用程序查询 B 的位置

    如果 B 决定授予对其位置 B 的访问权限,则只需根据 UUID 更新 Location 端点

  5. 一旦应用程序检索到此信息,它就会验证它是否仅将此信息发送给由 A 的秘密 ID 标识的用户

    当 B 更新其位置时,GAE 向 A 发送 GCM 通知更新

  6. 然后将信息安全地发送给 A 的客户

    完毕!GCM 和 SMS(和 HTTPS)可以被认为是安全的……对吧?

    更新:GCM 并不安全……但它真的那么重要吗?

4

1 回答 1

3

您想要获取相当敏感的信息组合 - 用户电子邮件(作为身份)、电话号码和位置。

因此,首先,您必须非常考虑用户的隐私问题,制定有关如何存储和分发这些信息的政策,并让用户清楚他们允许什么。我建议不要在客户端中尽可能多地存储此类数据集的任何聚合。

为此,我建议尽可能使用 GAE 存储。

你的应用程序查询用户的位置不应该太担心,只要事情是通过保持良好的安全通道完成的。

令人担忧的是,这些信息只能到达允许的来源。即只有相互联系才能请求此信息。

我建议对于每个用户,允许的联系人白名单是最好的。对于每个用户,在 GAE 上都有一个关联的秘密随机 uuid(永远不会发送给任何客户端)。注册您的服务的用户将创建此 ID。然后,白名单将包含一个秘密 ID 列表。

一个过程可以是——

  1. A 请求 B 的位置
  2. 请求被转发到 GAE 应用程序。
  3. GAE 应用程序验证 A 的秘密 ID 在 B 的白名单中
  4. 然后应用程序查询 B 的位置
  5. 一旦应用程序检索到此信息,它就会验证它是否仅将此信息发送给由 A 的秘密 ID 标识的用户
  6. 然后将信息安全地发送给 A 的客户
于 2013-03-20T15:36:21.913 回答