验证,识别和存储有关用户的微妙信息的最佳方法是什么?

时间:2013-03-20 15:21:01

标签: android python oauth google-cloud-endpoints endpoints-proto-datastore

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

我需要对应用的用户进行身份验证,并存储多个联系人的电话号码以及该应用的用户。截至目前,我将主要关注服务器方面的事情。

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

到目前为止,我正在为我的API启用OAuth 2.0并将user_required=True作为参数传递给我的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方法上的响应字段以排除电话号码,那将是这种情况......除非有人决定暴力破解服务。建议?评论

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

更新

  1. A请求B的位置

    按电话号码查询端点     如果没有找到,只需发送一条短信请求     如果找到...转到2.

  2. 请求转发给GAE app

    这是通过插入一个位置端点来完成的,其中ides是一个UUID,并向B发送关于请求的GCM

  3. GAE app验证A的秘密ID是否在B的白名单

    没有白名单,秘密ID是UUID所以此步骤已被删除

  4. 然后,应用会查询B的位置

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

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

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

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

    完成! GCM和SMS(和HTTPS)可以被认为是安全的......对吗?

    更新:GCM不安全......但这真的很重要吗?

1 个答案:

答案 0 :(得分:3)

您希望获得相当敏感的信息组合 - 用户电子邮件(身份),电话号码和位置。

首先,您必须非常考虑用户的隐私问题,制定有关如何存储和分发此信息的政策,并向用户明确说明他们允许的内容。我建议尽可能不在客户端中存储此类数据集的任何聚合。

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

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

令人担忧的是,该信息仅限于允许的来源。即只有相互联系的人才能索取这些信息。

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

一个过程可以是 -

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