亚马逊Alexa技能套件:如何与外部应用程序帐户/用户ID链接

17

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"
    }
  }
}
}
}
4个回答

30

好问题。

简短回答:您需要建立自己的配对方式,将第三方用户与Alexa UserID关联起来。Alexa Skills SDK中没有内置支持,可以让您将Alexa UserID与您的用户ID关联起来。您需要创建一个特定的语音意图,将Alexa UserIDs与您的Users DB关联起来。

较长回答:让我们从讨论每个请求中获取的Alexa UserID开始。您获得的Alexa UserID是LWA(Login-With-Amazon)用户ID。它的主要作用是允许Alexa Skills可靠地检测重复的用户。

那么什么不起作用呢?您会遇到的问题是,LWA userId始终对每个Alexa应用程序进行匿名化处理。这很重要,因为它确保用户不被跟踪;但它也防止您将Alexa userID与自己的LWA userID关联起来。

来自“使用Amazon登录 - 开发人员指南”(第10页)

每个为Login with Amazon创建网站或应用程序的公司都会为客户获得相同的user_id。然而,当客户登录另一家公司的应用程序或网站时,{user_id将不同}。这样做是为了防止使用user_id跟踪客户在Web上的活动。
我的意思是说,你不能只是在iOS、Android或Web应用程序中实现LWA,并期望获得与Alexa userID相同的LWA userId。例如,如果您在您的Android应用程序上实现了LWA并让foo@bar.com用户登录其Amazon账户,则可能会获得amzn1.account.123456作为userID,但是当同一个foo@bar.com用户与其配对的Echo交互时,您会得到amzn1.account.98765或任何其他完全不同的userId。我花了两天时间建造这个架构,所以我知道它行不通。
那么,什么是有效的解决方案呢?一个基于语音的Pin认证变体似乎最好。
让我们看一下另一个有类似问题的应用程序空间:电视应用程序(Xbox,Android TV等)。许多这些应用程序需要您登录才能访问内容(例如Hulu,Netflix等)。但是使用遥控器输入用户名和密码只是老掉牙的不好的用户体验。那么我们为电视应用程序做了什么呢?用户转到myService.com/tv,登录其帐户并获取一个特殊的短数字和时间敏感的PIN码,他们可以将其输入到其电视中。
当我实施Alexa Skill时,我们决定采取类似的方法。用户将登录到我们的网站,iOS应用程序或Android应用程序,转到专用的Echo页面,然后获取PIN码。屏幕上的说明将读取类似于以下内容:
“去你的Echo并说:”
“'启动foo'”
“'我的PIN码是1234'”
在我们的foo技能中,我们有一个PairingIntent意图来监听"我的密码是{one two three four|pinCode}"样例话语。收到PairingIntent后,我们会检查该PIN码是否有效,如果有效,则将该Alexa用户ID与我们自己的用户数据库相关联。如果PIN码有效,Echo会说类似于"哦,你好Bob!现在你可以访问所有你的精彩内容了。"。如果PIN码无效,Alexa会提示用户再试一次。

希望这样说得清楚。还有其他选项可以将第三方账户与Alexa技能关联起来,但这种语音PIN码方法最简单。


非常有道理,感谢您提供的关于创建与外部服务配对的Alexa技能的见解。 - JamesQMurphy
1
回答被删除的原因是什么? - Mike Flynn
@JamesQMurphy和JustinAngel,感谢你们的讨论。我想知道你们是否可以看一下https://dev59.com/B12xs4gBPY-HTNNj9qdJ,因为我相信你们可能知道答案。非常感谢你们的帮助! - Ryan

13
我不知道为什么原来的回答被删除了,但是现在亚马逊允许你将Alexa用户与你系统中的用户链接起来。这里是公告
终端用户如何为技能设置账户关联 用户使用Amazon Alexa应用程序进行账户关联。请注意,用户必须使用该应用程序,不支持仅通过语音建立链接。
用户通常在初始启用技能时开始该过程: 1. 在Alexa应用程序中,用户启用技能。 2. 应用程序在应用程序内部显示您的登录页面,使用您在开发人员门户注册技能时提供的授权URL。当伴侣应用程序调用此URL时,它会包含state、client_id和scope作为查询字符串参数。 - state在帐户链接过程中由Alexa服务使用。您的页面需要跟踪此值,因为稍后必须传回它。 - client_id由您定义。您的登录页面可以使用此值确定请求来自于您的Alexa技能。 - scope是一个可选的访问范围列表,指示所请求的访问级别。在为技能启用帐户链接时,您定义要支持的范围集。 3. 用户使用其正常凭据登录您的站点。 4. 您的服务对用户进行身份验证,然后生成一个访问令牌,该令牌在您的系统中唯一标识用户。 5. 您的服务将用户重定向到Amazon特定的URL,并在URL片段中传递状态、access_token和token_type。 6. Alexa服务验证返回的信息,然后为Alexa用户保存访问令牌。

此时,该技能已启用,用户的Alexa账户已链接到您服务中的账户,该技能已准备好使用。


如果您恰好知道类似问题的答案,我会非常感激!https://dev59.com/B12xs4gBPY-HTNNj9qdJ - Ryan

0
在Amazon Alexa技能请求中,我正在尝试将其与用户名绑定。
由于您无法获取实际用户名,但为了更完整,有不同的方法可用于完成您要尝试的操作。这将取决于您的技能尝试实现什么目标,以确定哪种方法适合您。
您的选项包括:
  1. 将您系统中的用户名与Alexa用户关联起来。在这种情况下,您不会得到一个用户名,而是会得到一个令牌,您可以使用该令牌将用户名称链接在您的系统中。阅读:https://developer.amazon.com/public/solutions/alexa/alexa-skills-kit/docs/linking-an-alexa-user-with-a-user-in-your-system

  2. 如果您只是想从其他用户中唯一地识别一个用户,但不关心或不需要任何有关该用户的特定信息。请求会带有一个用户(session.user.userId)。它是一个随机字符字符串,将为他们发送的所有请求标识该用户,但不会告诉您有关他们的任何信息。阅读:https://developer.amazon.com/public/solutions/alexa/alexa-skills-kit/docs/alexa-skills-kit-interface-reference

  3. 您可以拥有一个意图,例如“SetUser”,让用户告诉您他们想要的用户名。然后,您可以在某个数据存储中使用上述#2将它们链接在一起。我不知道亚马逊是否支持这条路线,因为这实际上是绕过#1的方法。所以,这取决于您想要做什么。如果您需要用户的个人信息,请使用#1。如果您只需要知道它是某个用户与另一个用户不同,请使用#2。


0
Alexa技能提供的用户ID保证每个用户都是唯一的。它根据开发者ID进行匿名化处理,因此在您所有的技能中都将是相同的,但在不同的开发者之间会有所不同。没有办法明确地将其链接回任何真实世界的ID。您必须自己完成这个过程。
我的一般建议是像Firefox同步那样做。如果您的Alexa技能和应用程序共享后端,则当用户想要从Alexa同步时,请生成一个4个字符的同步代码,将其存储在后端中,向用户读取并告诉他们去网站上输入它。在网站上,当他们提供同步代码时,请将其匹配并形成两者之间的链接。
我在我的书中对此进行了更详细的讨论,但这就是要点。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接