aws-lambda - 使用 Amazon 登录以获得 Alexa Skills (LWA)
问题描述
有人有 LWA 和 AWS Lambda 的端到端解决方案吗?当我认为我理解了请求/响应协议时,当我试图让它工作时,我会变得更加困惑。
解决方案
在寻找这个问题的解决方案时,我偶然发现了这个问题。由于我使用的是 node.js,因此 NHLIVES 的回答对我来说并不是一个问题。以下代码不完整,并根据 Amazon 的示例进行了修改,但应该没有错误。它当然可以改进。但它对我有用,我希望它对下一个人有用。
还有一件事,模块“请求”在 Lambda 中不可用,因此您必须提供它。只需在顶层制作一个包含 index.js 的 zip 文件,一个包含“请求”和“安全缓冲区”目录(从本地节点安装复制)的 node_modules 目录,然后将 zip 文件上传到 Amazon Lambda(在 AWS Lambda 中: “代码输入类型”:“上传 .zip 文件”)。
var AWS = require('aws-sdk');
var requestlib = require('request');
exports.handler = function (request, context) {
var whoami = async function (request) {
var amznProfileURL = 'https://api.amazon.com/user/profile?access_token=';
if (request.directive.header.namespace === 'Alexa.Discovery' && request.directive.header.name === 'Discover') {
amznProfileURL += request.directive.payload.scope.token;
} else {
amznProfileURL += request.directive.endpoint.scope.token;
}
await new Promise(function(resolve, reject) {
log("LWArequest: ", "amznProfileURL ", amznProfileURL);
requestlib(amznProfileURL, function(error, response, body) {
if (response.statusCode == 200) {
var profile = JSON.parse(body);
log("LWArequest: ", "user_id ", body);
resolve();
} else {
log("LWArequest: ", "error ", "can't connect to Amazon Profile Service");
reject();
}
});
}
);
}
whoami(request);
if (request.directive.header.namespace === 'Alexa.Discovery' && request.directive.header.name === 'Discover') {
log("DEBUG:", "Discover request", JSON.stringify(request));
handleDiscovery(request, context, "");
}
function log(message, message1, message2) {
console.log(message + message1 + message2);
}
}
您应该在 CloudWatch 日志文件中看到如下内容:
2018-07-17T23:06:28.108Z 08d795d3-8a16-11e8-b912-0f46b6510aa8
LWArequest: amznProfileURL https://api.amazon.com/user/profile?access_token=Atza|IwEBIP5ozi...
2018-07-17T23:06:28.409Z 08d795d3-8a16-11e8-b912-0f46b6510aa8
LWArequest: user_id
{
"user_id": "amzn1.account.A..........................A"
}
希望能帮助到你。