为了了解端点,我正在构建一个名为“你在哪里?”的应用程序。该应用程序允许用户请求其他用户的位置。这个想法是通过让用户选择一个联系人,通过我的端点中的电话号码查找联系人来实现的。如果找到,则表示该联系人拥有该应用程序,并发送 GCM 请求该位置。如果未找到联系人,则会发送带有 URL 的短信,该 URL 将通过浏览器请求位置,执行所述位置的 http 发布并将服务器 GCM 发送回请求位置的人。
我需要验证应用程序的用户并存储多个联系人的电话号码以及应用程序的用户。到目前为止,我将主要关注服务器端的事情。
如何以安全的方式存档上述内容?
到目前为止,我正在为我的 API 启用 OAuth 2.0 并将user_required=True
as 参数传递给我的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 中提取需求信息或修改它以执行......邪恶吗?:)
更新:
A 请求 B 的位置
如果未找到,则通过电话号码查询端点,如果找到,只需通过 SMS 发送请求...转到 2。
请求被转发到 GAE 应用程序
这是通过插入一个 ID 为 UUID 的 Location 端点并向 B 发送有关请求的 GCM 来完成的
GAE 应用程序验证 A 的秘密 ID 在 B 的白名单中
没有白名单,秘密 id 是 UUID,所以这一步被取消了
然后应用程序查询 B 的位置
如果 B 决定授予对其位置 B 的访问权限,则只需根据 UUID 更新 Location 端点
一旦应用程序检索到此信息,它就会验证它是否仅将此信息发送给由 A 的秘密 ID 标识的用户
当 B 更新其位置时,GAE 向 A 发送 GCM 通知更新
然后将信息安全地发送给 A 的客户
完毕!GCM 和 SMS(和 HTTPS)可以被认为是安全的……对吧?
更新:GCM 并不安全……但它真的那么重要吗?