NAME

    Net::Amazon::AlexaValidator - implements all security-related checks
    required for Amazon Alexa Skills.

SYNOPSIS

      my $alexa_validator = Net::Amazon::AlexaValidator->new({
        application_id => 'my_application_id_from_amazon_dev_site',
        echo_domain    => 'DNS:echo-api.amazon.com',
        cert_dir       => '/tmp/',
        });
      my $request = $c->req; # Requires a L<Catalyst::Request> object
      my $ret = $alexa_validator->validate_request($request);

DESCRIPTION

    Highlights of the validation include:

      * Verifies the Signature Certificate URL. Amazon's requirements are
      listed here:
      https://developer.amazon.com/public/solutions/alexa/alexa-skills-kit/docs/developing-an-alexa-skill-as-a-web-service#h2_verify_sig_cert

      * Downloads the PEM-encoded X.509 certificate chain that Alexa used
      to sign the message as specified by the SignatureCertChainUrl header
      value on the request.

      * Validates that the signing certificate has not expired (examine
      both the Not Before and Not After dates).

      * Validates that the domain echo-api.amazon.com is present in the
      Subject Alternative Names (SANs) section of the signing certificate.

      * Validates that all certificates in the chain combine to create a
      chain of trust to a trusted root CA certificate.

      * Base64-decodes the Signature header value on the request to obtain
      the encrypted signature.

      * Uses the public key extracted from the signing certificate to
      decrypt the encrypted signature to produce the asserted hash value.
      Generates a SHA-1 hash value from the full HTTPS request body to
      produce the derived hash value, and compares the asserted hash value
      and derived hash values to ensure that they match.

      * Checks the request timestamp to ensure that the request is not an
      old request being sent as part of a "replay" attack.

Configuration options

 echo_domain

    The echo domain that must be present in the Subject Alternative Names
    (SANs) section of the signing certificate

 application_id

    Application ID from your app's Amazon Alexa App settings

 cert_dir

    Directory in which to store your Alexa certificate, once validated

Subroutines

 validate_request

    Verifies this is a valid Amazon Alexa request. Checks things like
    application_id, certificates, timestamp.

    returns { success, error_msg }

