1

我是一名业余爱好者学生开发人员,正在使用 Google 上的 Actions 来在 Google Home 上创建一个简单的“文字冒险”游戏。由于 Google Home 将与玩家对话,而不是与阅读文本的玩家对话,我希望这将创造一种类似于“龙与地下城”角色扮演游戏的体验,让计算机充当“地下城主”。借助 API.AI 和 Google 上的 Actions 提供的自然语言帮助,这似乎很合适,因为玩家可以“自然地”做出回应。这是一个亚马逊 Alexa 技能的示例,它基本上可以满足我的需求。

但是,每次我启动游戏时,它总是一个新游戏。我想将用户先前状态的存档游戏存储在用户 Google 云端硬盘上托管的 JSON 文件中——因为我只是为了好玩而做这件事的学生,所以我实际上没有官方网站或任何其他东西我运行应用程序的免费 Heroku 服务器,让我几乎不可能存储保存。

我已经浏览了Node.js 的 Google Drive REST 快速入门,并且我已经在控制台中很好地工作了。唯一的问题是在该快速入门中,用户必须单击链接以授权应用程序读取其 Google Drive 帐户中的内容,我不确定如何能够“单击链接”并回馈通过 Google Home 上的语音访问令牌。

有没有办法通过 Google Drive 做到这一点?还是有更好的方法在会话之间提供持久数据?我通常不从事网络开发工作,因此将不胜感激。

4

2 回答 2

2

坏消息是您将无法摆脱用户使用他的网络浏览器来授权您的应用访问他的云端硬盘的需要。

好消息是您只需要这样做一次。当您的应用请求授权时,它应该指定“离线”,这将导致您获得一个刷新令牌。您应该将其保存在用户数据库中的某个位置。每当您需要访问用户的云端硬盘时,您都可以使用保存的刷新令牌来请求访问令牌,一切顺利。

于 2017-01-27T10:27:21.940 回答
1

您需要在这里解决一些问题,虽然它们看起来相关,但它们并不像您希望的那样相关:

  1. 您需要获得授权才能访问用户的云端硬盘空间
  2. 你需要对用户的 Home 进行身份验证(这样你就知道这个人已经回来了)
  3. 您必须连接这两种关系 - 这样您就知道与您通话的家庭设备要使用哪个云端硬盘空间

您已经找到了 (1) 的答案,并且如上所述,您需要使用浏览器让他们授权您访问他们的云端硬盘。然后,您将存储刷新令牌,并且将来能够访问它。

但这只是问题的一部分。Home 不会让您直接访问用户的 Google 帐户,因此您必须管理自己的帐户机制并将其绑定到 Home。这里有几个解决方案:

  • Home 在发送到您的 webhook 的 JSON 中提供匿名用户身份getUser().user_id如果您使用的是 Actions API 库,则可以使用它来访问它,或者data.user.user_id在 JSON 中的字段中访问它。虽然这类似于浏览器 cookie,但它只存储用户 ID,不能存储其他数据。也没有“本地存储”的概念。从好的方面来说,这个 ID 在设备之间是一致的。
  • 您可以请求用户信息,例如他们的姓名和地址。但它没有任何独特的或帐户信息,因此这可能对您没有用处。
  • 您可以实现 OAuth2服务器并进行帐户链接。请注意,这是您需要使用 Google Drive 做的另一面- 您将提供访问和刷新令牌以验证和授权对您的帐户的访问,Google Home 设备会将这些令牌发回给您,以便您可以确定用户是谁。您实际上不需要存储帐户信息 - 您可以使用 JSON Web 令牌 (JWT) 或其他方法提供令牌信息,并让它们以安全的方式存储帐户信息。用户将使用 Google Home 应用作为一次性事件实际登录您的服务。

为了处理 (3),您可能会认为 (1) 允许您获取令牌,而 (2) 的 OAuth 解决方案要求您分发令牌。两者可以结合吗?嗯......可能,但它并不那么简单。您不能只将 Google OAuth2 端点提供给 Home - 它们会明确阻止它,您需要控制您的 OAuth2 端点。但是,您可能能够构建代理端点——但我还没有探讨这样做的安全隐患。

我认为您走在正确的轨道上 - 使用云端硬盘是存储用户信息的好地方。使用 Home 的帐户链接为您提供了一个他们必须访问您的网站以验证和授权他们的 Home 的地方,您可以使用它为他们的 Drive 执行相同的操作。

于 2017-01-27T11:50:56.677 回答