为了了解端点,我正在构建一个名为“你在哪里?”的应用程序。该应用程序允许用户请求其他用户的位置。这个想法是通过让用户选择联系人,通过我的端点中的电话号码查找联系人来实现的。如果发现,则表示联系人已拥有应用程序,并且已发送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中提取需要信息或修改它来执行...邪恶? :)
A请求B的位置
按电话号码查询端点 如果没有找到,只需发送一条短信请求 如果找到...转到2.
请求转发给GAE app
这是通过插入一个位置端点来完成的,其中ides是一个UUID,并向B发送关于请求的GCM
GAE app验证A的秘密ID是否在B的白名单
上没有白名单,秘密ID是UUID所以此步骤已被删除
然后,应用会查询B的位置
如果B决定授予对其位置B的访问权限,则只需根据UUID更新位置端点
一旦应用程序检索到此信息,它就会验证它是否仅将此信息发送给由A的秘密ID标识的用户
当B更新它的位置时,GAE向A发送GCM以通知更新
然后将信息安全地发送给A的客户
完成! GCM和SMS(和HTTPS)可以被认为是安全的......对吗?
更新:GCM不安全......但这真的很重要吗?
答案 0 :(得分:3)
您希望获得相当敏感的信息组合 - 用户电子邮件(身份),电话号码和位置。
首先,您必须非常考虑用户的隐私问题,制定有关如何存储和分发此信息的政策,并向用户明确说明他们允许的内容。我建议尽可能不在客户端中存储此类数据集的任何聚合。
为此,我建议尽可能使用GAE存储。
您的应用程序查询用户的位置不应该太担心,只要通过安全通道完成的事情保持良好。
令人担忧的是,该信息仅限于允许的来源。即只有相互联系的人才能索取这些信息。
我建议,对于每个用户,允许联系人的白名单最好。对于每个用户,在GAE上都有一个秘密的随机uuid(永远不会出现在任何客户端)。注册您的服务的用户将创建此ID。然后,白名单将包含一个秘密ID列表。
一个过程可以是 -