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 }