首页 > 解决方案 > 使用 Amazon 登录以获得 Alexa Skills (LWA)

问题描述

有人有 LWA 和 AWS Lambda 的端到端解决方案吗?当我认为我理解了请求/响应协议时,当我试图让它工作时,我会变得更加困惑。

标签: aws-lambdaalexa-skill

解决方案


在寻找这个问题的解决方案时,我偶然发现了这个问题。由于我使用的是 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"
  }

希望能帮助到你。


推荐阅读