Amazon Alexa Skills Kit:如何与外部应用程序帐户/用户 ID 关联
Posted
技术标签:
【中文标题】Amazon Alexa Skills Kit:如何与外部应用程序帐户/用户 ID 关联【英文标题】:Amazon Alexa Skills Kit: How do you link with external app account / userId 【发布时间】:2015-09-15 00:48:15 【问题描述】:在 Amazon alexa 技能 请求中有一个 userId,我试图了解这是什么以及是否有一些参考,因为我想链接Amazon Echo 用户帐户在我自己的应用程序中有一个帐户,为此我必须使用某种静态 userId。
示例请求:
"version": "1.0",
"session":
"new": false,
"application":
"applicationId": "amzn1.echo-sdk-ams.app.[unique-value-here]"
,
"sessionId": "session1234",
"attributes": ,
"user":
"userId": null //IS THERE A DETAILED REFERENCE OF THIS SOMEWHERE?
,
"request":
"type": "IntentRequest",
"requestId": "request5678",
"intent":
"name": "MyColorIsIntent",
"slots":
"Color":
"name": "Color",
"value": "blue"
【问题讨论】:
【参考方案1】:好问题。
简答:您将不得不在您的第 3 方用户和 Alexa UserID 之间建立自己的配对。 Alexa Skills SDK 没有内置支持,可让您将 Alexa UserID 与您的用户 ID 相关联。您将必须创建一个特定的语音意图,将 Alexa UserID 与您的用户数据库相关联。
更长的答案:让我们首先谈谈您在每个请求中获得的 Alexa UserID。您获得的 Alexa UserID 是 LWA(Login-With-Amozon)用户 ID。主要目的是让 Alexa Skills 可靠地检测重复用户。
那么什么不起作用?您将遇到的问题是 LWA userId 对于每个 Alexa 应用程序始终是匿名的。这很重要,因为它确保不跟踪用户;但它也会阻止您将 Alexa 用户 ID 与您自己的 LWA 用户 ID 相关联。
来自“Login with Amazon - Developer Guide”(第 10 页)
每家为 Login with Amazon 创建网站或应用程序的公司都会获得 客户的相同 user_id。但是,当客户登录到 其他公司的应用或网站,user_id 会有所不同。这是 因此 user_id 不能用于在网络上跟踪客户。
我想说的是,您不能只在 ios、android 或 Web 应用程序中实现 LWA,并期望为帐户获得与 Alexa 用户 ID 相同的 LWA 用户 ID。例如,如果您 implemented LWA on your Android app 有 foo@bar.com 用户登录到他们的亚马逊帐户,您可能会获得 amzn1.account.123456 作为用户 ID,但是当那同一个 foo@bar.com 用户与他们配对的 Echo 对话,您将获得一个 amzn1.account.98765 或任何其他完全不同的 userId。我实际上浪费了两天时间来构建这个架构,这就是我知道它不起作用的原因。
那么什么是有效的?以语音为中心的 Pin 身份验证变体似乎是最好的。
让我们看看另一个存在类似问题的应用空间:电视应用(xbox、android TV 等)。许多这些应用程序需要您登录才能访问内容(例如 hulu、netflix 等)。但是使用遥控器输入用户名和密码只是普通的旧用户体验。那么我们为电视应用做了什么?用户访问 myService.com/tv,登录到他们的帐户并获得一个特殊的短、数字和时间敏感的 pin 码,他们可以将其输入到他们的电视。
当我实施 Alexa Skill 时,我们决定采用类似的方法。用户将登录我们的网站、iOS 应用程序或 Android 应用程序,进入专门的 Echo 页面,然后获取密码。屏幕上的说明会这样写:
转到您的 Echo 并说:
'启动 foo'
'我的密码是一二三四'
在我们的 foo 技能中,我们有一个 PairingIntent 意图听“我的 pin 是 一二三四|pinCode”示例话语.收到 PairingIntent 后,我们将检查该 pin 码是否有效,以及是否将 Alexa 用户 ID 与我们自己的用户数据库相关联。如果 pin 是有效的,Echo 会说“哦,你好,鲍勃!你现在可以访问所有很棒的东西了。”。如果密码无效,alexa 会提示用户重试。
希望这是有道理的。还有其他选项可以将 3rd 方帐户与 Alexa Skills 相关联,但这种语音锁定方法是最简单的。
【讨论】:
非常有道理,感谢您对创建与外部服务配对的 Alexa 技能的洞察力。 答案删除有什么原因吗?【参考方案2】:我不知道为什么原始答案已被删除,但亚马逊现在允许您将 Alexa 用户与系统中的用户关联起来。这是announcement。
最终用户如何为技能设置帐户链接
用户使用 Amazon Alexa 应用程序链接他们的帐户。请注意,用户 必须使用该应用程序。不支持单独建立链接 通过语音。
用户通常在最初启用您的技能时开始该过程 应用:
在 Alexa 应用中,用户启用该技能。
应用程序使用您在注册技能时提供的授权 URL 在应用程序内显示您的登录页面 开发者门户。当配套应用调用此 URL 时,它包括 state、client_id 和 scope 作为查询字符串参数。
Alexa 服务在帐户关联过程中使用该状态。您的页面需要跟踪此值,您必须 稍后再传回去。 client_id 由您定义。您的登录页面可以使用它来确定请求来自您的 Alexa 技能。 范围是访问范围的可选列表,指示请求的访问级别。您定义要支持的范围集 为您的技能启用帐户关联。用户使用他们的正常凭据登录您的站点。
您的服务对用户进行身份验证,然后生成一个访问令牌,用于在您的系统中唯一标识该用户。
您的服务将用户重定向到特定于 Amazon 的 URL,并传递 URL 中的 state、access_token 和 token_type 片段。
Alexa 服务验证返回的信息,然后为 Alexa 用户保存 access_token。
此时技能开启,用户的Alexa账号为 链接到您的服务中的帐户,并且该技能已准备就绪 用过。
【讨论】:
【参考方案3】:保证赋予 Alexa 技能的用户 ID 对于每个用户都是唯一的。它是根据开发者 ID 匿名化的,所以它在你的所有技能中都是相同的,但它会因开发者而异。无法将其显式链接回任何真实世界的 ID。你必须自己做。 我的一般建议是像 Firefox 同步一样。如果您的 Alexa 技能和您的应用程序共享一个后端,那么当用户想要从 Alexa 同步时,生成一个 4 个字符的同步代码,将其存储在后端,读取给用户,然后告诉他们去到网站并输入。在网站上,当他们提供同步代码时,将其匹配并在两者之间形成链接。 我在my book 中更详细地讨论了这一点,但这就是它的要点。
【讨论】:
【参考方案4】:在 Amazon alexa 技能请求中,我尝试将其与用户名绑定。
因为您无法获得实际的用户名。但是,为了更完整,有不同的方法可以用来做你想做的事情。这将取决于您的技能要完成的工作,以了解哪种方法适合您。
您的选择是:
将系统中的用户名链接到 Alexa 用户。在这种情况下,您不会获得用户名。您将获得一个令牌,然后您将使用该令牌在您的系统中将用户名链接在一起。阅读:https://developer.amazon.com/public/solutions/alexa/alexa-skills-kit/docs/linking-an-alexa-user-with-a-user-in-your-system
如果您尝试做的只是从另一个用户中唯一地识别一个用户,但您不关心或不需要该用户的任何特定信息。该请求带有一个用户 (session.user.userId)。它是一个随机字符串,将针对他们发送的所有请求识别该用户,但不会告诉您任何关于它们的信息。阅读:https://developer.amazon.com/public/solutions/alexa/alexa-skills-kit/docs/alexa-skills-kit-interface-reference
您可以有一个类似于“SetUser”的意图,并让用户以他们想要的用户名与您交谈。然后你可以使用上面的#2 将它们链接到某个数据存储的某个地方。我不知道亚马逊是否支持这条路线,因为它确实是一种绕过#1的方法。所以,这取决于你想要做什么。如果您需要有关用户的个人信息,请使用 #1。如果您只需要知道是某个用户还是另一个用户,请使用 #2。
【讨论】:
以上是关于Amazon Alexa Skills Kit:如何与外部应用程序帐户/用户 ID 关联的主要内容,如果未能解决你的问题,请参考以下文章
Amazon Alexa Skills Kit:如何与外部应用程序帐户/用户 ID 关联
如何为 Alexa Skills Kit 和 API.AI 使用单个 AWS Lambda?
Alexa Skills Kit:如何使用 JS 将图像添加到标准卡片