为什么来自 Postman 的 Azure 端点的 400 响应在 Alexa 控制台上运行良好?

Why a 400 response from Azure endpoint for Postman but works fine with the Alexa console?

我是开发 Alexa 技能的新手,所以我使用在网络上找到的示例作为托管在 Azure 上的 C# 端点。它与 Alexa 控制台一起正常工作,但是当我尝试使用 Postman 应用程序测试相同的端点时,我收到 400 错误。

当我使用 Alexa 控制台时,它会显示发送到端点的 JSON 输入和从端点接收的 JSON 输出。如果我复制 JSON 输入并将其粘贴到 Postman 并将其发送到同一端点,我会收到 400 错误。显然,我遗漏了一些东西。

以下是我的两个源文件和JSON输入。

RollTheDice.cs

public static class RollTheDice
{
    [FunctionName("RollTheDice")]
    public static async Task<HttpResponseMessage> Run([HttpTrigger(AuthorizationLevel.Anonymous, "get", "post", Route = null)]HttpRequestMessage req, TraceWriter log)
    {
    log.Info("C# HTTP trigger function processed a request.");

    var speechlet = new RollTheDiceSpeechlet();
    return await speechlet.GetResponseAsync(req);
    }
}

RollTheDiceSpeechlet.cs

public class RollTheDiceSpeechlet : SpeechletBase, ISpeechletWithContext
{
  public SpeechletResponse OnIntent(IntentRequest intentRequest, Session session, Context context)
  {
    try
    {
      // Default to 6 sides if not specified
      if (!int.TryParse(intentRequest.Intent.Slots["DiceType"].Value, out int numSides))
        numSides = 6;

      var rollResults = new Random().Next(Math.Max(1, numSides - 1)) + 1; // Account for random returning '0'
      return new SpeechletResponse
      {
        ShouldEndSession = false,
        OutputSpeech = new PlainTextOutputSpeech { Text = $"I rolled a {numSides} sided die and got a {rollResults}." }
      };
    }
    catch (Exception ex)
    {
      return new SpeechletResponse
      {
        ShouldEndSession = false,
        OutputSpeech = new PlainTextOutputSpeech { Text = ex.Message }
      };
    }

  }

  public SpeechletResponse OnLaunch(LaunchRequest launchRequest, Session session, Context context)
  {
    return new SpeechletResponse
    {
      ShouldEndSession = false,
      OutputSpeech = new PlainTextOutputSpeech { Text = "Welcome to the Roll the Dice. Ask me to roll the dice." }
    };
  }

  public void OnSessionEnded(SessionEndedRequest sessionEndedRequest, Session session, Context context)
  {
    return;
  }

  public void OnSessionStarted(SessionStartedRequest sessionStartedRequest, Session session, Context context)
  {
    return;
  }
}

JSON 输入

同样,一切正常,但当我使用 Postman 对其进行测试时,出现 404 错误。 端点是我在 Visual Studio 201 中开发的 C# 无服务器函数。 当我在本地 运行 时,我 copy/paste Postman 应用程序中的 URL 并发送 post。请参阅随附的屏幕截图。

错误表明您缺少 SignatureSignatureCertChainUrl headers。这些有助于保护您的端点并验证传入请求是否由 Alexa 发送。应拒绝来自其他来源的任何请求。当您通过测试控制台对其进行测试时,这些 headers 已包含在内并且您会获得成功的响应。

Headers:

Signature 
SignatureCertChainUrl

验证传入请求分为两部分:

  1. 检查请求签名以验证请求的真实性。
  2. 检查请求时间戳以确保该请求不是旧请求。

有关验证请求是否由 Alexa 发送的更多信息here