我需要使用Mirror API向特定订阅用户发送时间轴项。我有用户的电子邮件ID。我怎么能做到这一点?
由于
更新 我有GDK应用程序,配套应用程序(在Android移动设备上运行)和Mirror API应用程序。 GDK应用程序和配套都通过蓝牙配对。我的用例是,如果他到达特定位置,我必须向uesr发送时间线项目。我们正在使用ibeacon检查用户的位置。当用户到达该特定区域时,伴侣应用程序会检测到它(通过蓝牙)并向镜像应用程序发送请求,然后镜像应用程序会将时间轴项目添加到用户的玻璃上。在这里我的问题是如何将时间轴项添加到一个特定用户?(不是所有订阅用户)我应该从同伴应用程序传递给镜像应用程序的哪个参数?(我想发送用户的电子邮件ID)
答案 0 :(得分:2)
用户需要使用OAuth2登录您的服务,并已授予您使用角色https://www.googleapis.com/auth/glass.timeline访问其时间轴的特定权限。您应该请求“离线”访问,这样您就会收到一个身份验证令牌和一个刷新令牌,您可以在一小时后使用该令牌获取新的身份验证令牌。
当您将卡片发送到时间线时,您将需要此身份验证令牌,在这种情况下,该时间线也可用作标识符。拥有他们的电子邮件ID是不够的,你不需要它。
有关代码示例和详细信息,请参阅https://developers.google.com/glass/develop/mirror/authorization。
<强>更新强>
所以听起来你有以下整体工作流程:
用户在您的网站上创建一个帐户(托管Mirror API应用程序的位置)。作为其中的一部分,他们授权访问他们的Glass并向您提供他们的电子邮件地址或授权您通过Google的API获取。
您将此信息(auth_token和refresh_token)存储在某个数据存储中,并根据其电子邮件地址编制索引。
他们还会在手机上安装您的应用,并且还可以访问该电子邮件地址。
当移动应用检测到感兴趣的ibeacon标记时,它会连接到您的网络服务并发送电子邮件地址和位置。
您的网络服务会查找电子邮件地址,获取访问令牌以验证与镜像服务的连接,并使用位置信息向Glass发送消息。
这是一个通常合理的工作流程,但有几个要点:
Mirror API非常适合一次只向一个人发送内容。您似乎担心发送批量结果,但只要您为一个用户使用身份验证令牌,它就会将其发送给该用户。
您使用电子邮件地址作为整个用户帐户的索引。虽然这很容易实现,但这并不是最好的解决方案,因为这意味着任何拥有个人电子邮件地址和服务端点URL的人都可以伪造位置。考虑到您如何使用位置信息(将其发回给用户),您可能会认为这是一个可接受的风险,但您需要考虑如何滥用该服务。
您可以通过以下几种方式降低风险:
您可以创建并使用用户首次设置随播应用时需要输入的其他用户ID,而不是易于猜测的电子邮件地址。
应用程序第一次(也是第一次)想要连接到服务时,它会创建并发送一个随机密码字符串,它将用作密码,Web服务可以存储此随机字符串。之后,配套应用需要将此字符串与电子邮件地址一起发送。
根据您的需要,您可以完全删除网络应用,并让配套应用直接使用Mirror API。这样可以将auth令牌留在手机上,并大大减少让某人欺骗您的用户的可能性。它确实有一个明显的缺点 - 虽然你可以使用它将卡发送到Glass,但是将Glass的响应变回配套设备变得更加困难。
答案 1 :(得分:2)
正如我理解您的上述问题和评论,您的用户已经使用基于Mirror API的应用程序进行了身份验证,因此您已拥有所需的凭据(auth / refresh令牌)。您的配套Android应用程序会检测条件(特定区域中的用户),并在基于Mirror API的应用程序中向远程端点发送请求。
配套应用在向远程端点发送请求时,需要发送一条可用于在Mirror API应用中识别该用户的公共信息。在这种情况下,您说您正在发送用户电子邮件ID。
要仅向特定用户发送时间线卡,我会获取配套应用程序发送的电子邮件ID,查询数据库以返回用户最初使用基于Mirror API的应用进行身份验证时保存的凭据,然后使用它来创建经过身份验证的镜像API请求,该请求仅为该用户插入时间轴项。我不知道您的Mirror API应用程序是什么写的,但Python中的基本示例可能采用以下形式:
# You sent along the email address
userid = notification['MyCompEmailId']
# set timeline card body
timelinecard_body = {
'notification': {'level': 'DEFAULT'},
'text': "You found a beacon!",
'menuItems': [{'action': 'DELETE'}]
}
# Look up the user in our database and
# get their credentials
#
# _credentials_for_user() basically does a "WHERE userid = 'something'" query
user_credentials = _credentials_for_user(userid).get()
# Create a Mirror API service with some credentials.
authed_mirror_service = build('mirror', 'v1', http=user_credentials.authorize(httplib2.Http()))
# Send a timeline card
authed_mirror_service.timeline().insert(body=timelinecard_body).execute()