如何在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
相关产品推荐
相关产品推荐

