Вчера я работал над новым навыком Alexa (я действительно хочу, чтобы в этом месяце Amazon раздавала швабру за выпуск навыка), и я дошел до того, что мне нужно было заблокировать сервис. Впервые я рассказал об этом еще в марте (Создание Alexa Skills с помощью OpenWhisk — часть вторая). По сути, Amazon требует, чтобы вы защитили свой сервис Alexa и выполнили различные проверки, чтобы убедиться, что запрос действительно исходит от Alexa.

К счастью, для него есть простой пакет npm (alexa-verifier), и использовать его с OpenWhisk довольно просто. Как только вы добавите код, который я продемонстрировал в сообщении в блоге, вы просто убедитесь, что включили сырую поддержку API. Таким образом, вместо --web true вы должны использовать --web raw.

Но когда я готовился сделать это с навыком, который хотел высвободить, я подумал — почему бы не посмотреть, можно ли просто применить эту логику в его собственном действии? Тогда разработчику просто нужно будет использовать его как часть последовательности. Имея это в виду, я быстро написал следующее.

let alexaVerifier = require('alexa-verifier');

function main(args) {

     return new Promise(function(resolve, reject) {

        let signaturechainurl = args.__ow_headers.signaturecertchainurl;
        let signature =  args.__ow_headers.signature;
        let body = new Buffer(args.__ow_body,'base64').toString('ascii');
        let request = JSON.parse(body).request;

        alexaVerifier(signaturechainurl, signature, body, function(err) {
            if(err) reject(err);
            resolve(JSON.parse(body));
        });

    });
    
}

exports.main = main;

Это действие принимает запрос, извлекает соответствующую информацию HTTP-запроса, а затем выполняет проверочный вызов.

Когда это сделано, он просто разрешает исходный запрос. Это означает, что ваш исходный код, навыки, над которыми вы работали, тестировали и т. д., могут оставаться точно такими же, и в моей книге это чертовски круто.

Итак, как вы его используете?

Во-первых, вы должны сделать новое действие, последовательность, которая объединит мое действие с вашим. Представьте, что действие вашего навыка называется nameCats. Вы можете создать новое проверенное действие следующим образом:

wsk action create --sequence alexa_namecats /[email protected]_My Space/alexa/verifier,nameCats --web raw

Конечным результатом является экшен под названием alexa_namecats, название не самое лучшее, но оно работает. Тогда вам нужен URL:

wsk action get alexa_namecats --url

Возьмите этот URL-адрес, добавьте «.json» в конец и обновите URL-адрес вашего навыка Alexa:

Если вы не хотите использовать мой общий пакет, вы можете сами взять код здесь: https://github.com/cfjedimaster/Serverless-Examples/tree/master/alexa. По мере того, как я буду думать о других вещах, которые имеют смысл, я добавлю их в свой пакет Alexa. (Или, если у вас есть идеи, с удовольствием пришлите мне запрос на включение!)

Первоначально опубликовано на сайте www.raymondcamden.com 18 августа 2017 года.