You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在AWS Lambda中识别调用自定义Alexa智能家居技能的设备来源?

解决Alexa智能家居技能限制特定设备访问的问题

问题分析

你当前的Lambda代码尝试通过request.originDevice判断发起请求的Alexa设备,但智能家居技能的默认请求结构中并没有这个字段,且你之前只打印了directive部分,导致遗漏了关键的设备信息字段。

解决方案

1. 先获取完整的请求结构

修改Lambda代码,打印完整的请求对象,确认context字段中的设备信息:

exports.handler = function(request, context) {
  console.log("DEBUG: Full Request:", JSON.stringify(request));
  // 原有业务逻辑
}

查看CloudWatch日志,你会发现完整请求包含directive和context两个根节点,其中context.System.device.deviceId就是发起请求的Alexa设备唯一ID。

2. 通过设备ID验证访问权限

直接使用设备ID进行验证是最可靠的方式,无需额外API调用:

exports.handler = function(request, context) {
  // 替换为你允许访问的Alexa设备ID
  const ALLOWED_DEVICE_ID = "amzn1.ask.device.XXX_YOUR_DEVICE_ID_XXX";

  // 检查请求是否包含合法的设备信息
  const hasValidDevice = request.context 
    && request.context.System 
    && request.context.System.device 
    && request.context.System.device.deviceId === ALLOWED_DEVICE_ID;

  if (!hasValidDevice) {
    // 返回拒绝访问的错误响应
    return context.succeed({
      event: {
        header: {
          messageId: request.directive.header.messageId,
          namespace: "Alexa",
          name: "ErrorResponse",
          payloadVersion: "3",
          correlationToken: request.directive.header.correlationToken
        },
        payload: {
          type: "INVALID_AUTHORIZATION",
          message: "该设备无权控制此技能"
        }
      }
    });
  }

  // 执行正常的业务逻辑
  // ...
}

3. 通过设备名称验证(可选)

如果你想通过设备名称(如"Alexa Pop 1")判断,需要调用Alexa设备信息API,步骤如下:

第一步:开启权限

在Alexa开发者控制台进入你的技能,打开「权限」页面,启用Device Information权限(对应权限标识:alexa::devices:all:deviceinfo:read),并让用户在Alexa App中重新授权该技能。

第二步:Lambda代码实现

const axios = require('axios');

exports.handler = async function(request, context) {
  const allowedDeviceName = "Alexa Pop 1";
  const deviceId = request.context?.System?.device?.deviceId;
  const apiToken = request.context?.System?.apiAccessToken;

  if (!deviceId || !apiToken) {
    return context.succeed({
      event: {
        header: {
          messageId: request.directive.header.messageId,
          namespace: "Alexa",
          name: "ErrorResponse",
          payloadVersion: "3",
          correlationToken: request.directive.header.correlationToken
        },
        payload: {
          type: "INVALID_AUTHORIZATION",
          message: "无法验证设备信息"
        }
      }
    });
  }

  try {
    // 调用Alexa设备信息API获取设备名称
    const deviceInfoRes = await axios.get(
      `https://api.amazonalexa.com/v1/devices/${deviceId}/deviceInfo`,
      { headers: { Authorization: `Bearer ${apiToken}` } }
    );
    const deviceName = deviceInfoRes.data.friendlyName;

    if (deviceName !== allowedDeviceName) {
      return context.succeed({
        event: {
          header: {
            messageId: request.directive.header.messageId,
            namespace: "Alexa",
            name: "ErrorResponse",
            payloadVersion: "3",
            correlationToken: request.directive.header.correlationToken
          },
          payload: {
            type: "INVALID_AUTHORIZATION",
            message: "该设备无权控制此技能"
          }
        }
      });
    }

    // 执行正常业务逻辑
    // ...
  } catch (err) {
    console.error("获取设备信息失败:", err);
    return context.succeed({
      event: {
        header: {
          messageId: request.directive.header.messageId,
          namespace: "Alexa",
          name: "ErrorResponse",
          payloadVersion: "3",
          correlationToken: request.directive.header.correlationToken
        },
        payload: {
          type: "INTERNAL_ERROR",
          message: "验证设备时出现异常"
        }
      }
    });
  }
}

内容的提问来源于stack exchange,提问作者UltrasoundJelly

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.02 18:54:54