• 深入理解Amazon Alexa Skill(二)


    理解skill调用

    本节来更详细的讨论alexa是如何确定调用哪个skill的。
    参考:https://developer.amazon.com/zh/docs/custom-skills/understanding-how-users-invoke-custom-skills.html

    明确调用(Specific Request (Intent))

    用户在语音中明确的包含了要调用的skill的名字,云会给skill发送一个带有具体intent的 IntentRequest。用户可以有很多种表达方式来明确的调用skill,包括疑问句、祈使句等等,甚至不带具体的请求内容只是呼唤skill的名字。这些都由Alexa来自动处理。Alexa预设了一些调用的表达方式,例如

    <some action> <connecting word> <invocation name> e.g.“give me my Taurus horoscope using Daily Horoscopes”
    Ask <invocation name> <connecting word> <some action> e.g.“Ask Daily Horoscopes to give me the horoscope for Taurus”
    Start <invocation name> and <some action> e.g.“Start Daily Horoscopes and give me the horoscope for Taurus”

    这里主要潜在的安全问题就是skill的调用名称的处理了,恶意skill要与正常skill争夺谁被调用。

    隐式调用(Name-free Interaction)(beta测试功能)

    第二种比较有意思的是隐式调用,用户不需要明确说出想要调用的skill,由Alexa来自动寻找调用合适的skill。大体流程如下:

    1. 用户做出请求行为后,Alexa解析请求,并将请求发送给排名靠前的候选skill,向这些skill来发送CanFulfillIntentRequest 询问是否可以处理该intent。
    2. 如果skill实现了canFulfillIntent,skill此时不应该做出任何实际操作,包括开关灯、播放音乐等等。
    3. Alexa收集响应看哪个skill合适,选择后再发送IntentRequest给被选中的skill。
    4. 收到IntentRequest的skill再回复用户执行具体的操作。

    所以,如果skill想要被隐式调用的话,就要实现CanFulfillIntentRequest 接口,userId不会在调用这个接口的时候就传入。这就相当于,Alexa会将用户的intent广播给所有注册了的skill,似乎发给恶意的skill会有一些隐私问题,虽然文档说canFulfillIntent时不应该做出实际操作,但是skill此时是否可以悄悄地发送用户的intent? 官网中的CanFulfillIntentRequest 请求例子如下

    {
      "request": {
        "type": "CanFulfillIntentRequest",
        "requestId": "...",
        "intent": {
          "name": "PlaySound",
          "slots": {
            "Sound": {
              "name": "Sound",
              "value": "crickets"
            }
          },
        },
        "locale": "en-US",
        "timestamp": "..."
      },
      "context": {
        "System": {
          "application": {
            "applicationId": "amzn1.ask.skill.<skill-id-value>"
          },
          "user": {
            "userId": "<user-id-value>"
          },
          "device": {
            "supportedInterfaces": {}
          }
        }
      },
      "version": "1.0"
    }
    
    

    skill需要使用canFulfillIntent 来响应Alexa发出的CanFulfillIntentRequest ,设置canFulfill = "YES"/"NO"/"MAYBE" 来表明本skill是否能处理这个用户的intent。 这个完全也是靠skill自己自觉来回应的,Alexa似乎还没有能力来进一步的确认skill是不是真的有能力?此外,skill的响应和Alexa系统的请求是如何认证保证不被伪造的?
    一个intent响应的例子如下:

    {
        "version":"1.0",
        "response":{
            "canFulfillIntent": {
                "canFulfill": "YES",
                "slots":{
                    "slotName1": {
                        "canUnderstand": "YES",
                        "canFulfill": "YES"
                    },
                   "slotName2": {
                        "canUnderstand": "YES",
                        "canFulfill": "YES"
                    }
                }
            }
        }
    }
    

    亚马逊文档其实在这里给出了答案。亚马逊发来的JSON里会携带一个Application ID,服务端skill的代码要自己检查发来的请求中的Application ID是否与自己Skill ID一样,如果一致才执行,不一致就回复一个HTTP的400 Bad Request。也就是说Skill的ID是个秘密(像这样amzn1.ask.skill.661ecf07-280b-41fe-8fe4-8c5fbCCCCCC)。因此,能否找到泄露的Skill ID,或者开发者是否忘记了检查Skill ID,就是能否伪造Alexa调用Skill请求的关键了。

  • 相关阅读:
    PC客户端抓包方法(charles+proxifier)
    Charles分享
    python_fullstack数据库(一)-HTML
    python_fullstack数据库(三)-MySQL表操作
    python_fullstack数据库(二)-MySQL库操作
    python_fullstack数据库(一)-MySQL基本概念
    python_fullstack基础(十八)-并发编程
    python_fullstack基础(十七)-网络编程
    python_fullstack基础(十五)-面向对象三大特性
    python_fullstack基础(十四)-面向对象初识
  • 原文地址:https://www.cnblogs.com/ascii0x03/p/10520814.html
Copyright © 2020-2023  润新知