Передача учетных данных для входа при включении навыка через ask-smapi-sdk

#alexa #alexa-skills-kit #alexa-skill #login-with-amazon #ask-smapi-sdk

#alexa #alexa-skills-kit #alexa-навык #войдите в систему с помощью amazon #ask-smapi-sdk

Вопрос:

Я выполняю произнесение и другое автоматическое тестирование в моем потоке сборки / развертывания для моего навыка Alexa. Теперь я также хочу использовать simulate API (https://developer.amazon.com/en-US/docs/alexa/smapi/skill-simulation-api.html ), чтобы делать целые разговорные потоки, но я сразу же застреваю. В моем навыке используется ссылка на учетную запись, поэтому мне каким-то образом нужно передать учетные данные для пользователя. В документации я не вижу никакого способа передать какие-либо другие аргументы, кроме идентификатора сеанса, языка и выражения. Должен ли я каким-то образом использовать профиль LWA для входа в мой сервис, и в этом случае, как я это сделаю (поскольку это только идентификатор клиента и секрет клиента, без адреса электронной почты / пароля)?

Вот как я настроил код javascript для моего профиля LWA (который работает для всех запросов, кроме API моделирования и API вызова).

 const ASK = require("ask-smapi-sdk");
const refreshTokenConfig = {
  clientId: "amzn1.application-oa2-client.xxx",
  clientSecret: "xxx",
  refreshToken: "Atzr|xxx",
};
const smapiClient = new ASK.StandardSmapiClientBuilder()
  .withRefreshTokenConfig(refreshTokenConfig)
  .client();
 

Если бы я вызвал этот навык сейчас, используя simulate API, образец запроса / ответа выглядел бы примерно так.

 await smapiClient.setSkillEnablementV1(skillId, "development");
const response = await smapiClient.simulateSkillV2(skillId, "development", {
  device: {
    locale: "en-US",
  },
  input: {
    content: "Alexa, ask mySkill to do something",
  },
  session: {
    mode: "FORCE_NEW_SESSION",
  },
});
 

response теперь этот раздел будет содержаться в ответе json.

 body: {
  version: "1.0",
  response: {
    outputSpeech: {
      type: "SSML",
      ssml: "<speak>Hi, to use mySkill, please go to your Alexa app and link your mySkill account.</speak>",
    },
    card: { type: "LinkAccount" },
      shouldEndSession: true,
      type: "_DEFAULT_RESPONSE",
    },
    sessionAttributes: {
      ...
    },
    userAgent: "ask-node/2.10.1 Node/v12.19.0",
  },
},
 

Чтобы повторить мой вопрос, как я могу войти в систему пользователя программно, должен ли я каким-то образом использовать свой профиль LWA или есть другой процесс?

Спасибо!

Ответ №1:

У меня есть два класса, созданные для этого, чтобы облегчить мне жизнь

моделирование навыков:

 const fetch = require('node-fetch');

class simulationId{


  constructor(){

    this.token = process.env.TOKEN
  }
  
  async requestSimulationId(utterance, skillId, locale){

    var requestBody = 
    {
      "session": {
        "mode": "FORCE_NEW_SESSION"
      },
      "input": {
        "content": utterance
      },
      "device": {
        "locale": locale
      }
    }

    const rawResponse = await fetch(skillId, {
    
    method: 'POST',
    headers: {
      'Accept': 'application/json',
      'Content-Type': 'application/json',
      'Authorization': this.token
    },
    body: JSON.stringify(requestBody)
  });


  const buildResponse = rawResponse.json();

  return buildResponse;

}

}

module.exports = simulationId;

 

ответ simualtion:

 const fetch = require('node-fetch');

class simulationResponse{

  
  constructor(){

    this.token = process.env.TOKEN
  
  }

  async requestSimulationResponse(simulationId, skillId){

    const rawResponse = await fetch(skillId simulationId.id, { 
      method: 'GET',
      headers:{
      'Accept': 'application/json',
      'Content-Type': 'application/json',
      'Authorization': this.token
      }});


    const buildResponse = rawResponse.json();
    
    return buildResponse;


  }

}

module.exports = simulationResponse;