Chilkat HOME .NET Core C# Android™ AutoIt C C# C++ Chilkat2-Python CkPython Classic ASP DataFlex Delphi ActiveX Delphi DLL Go Java Lianja Mono C# Node.js Objective-C PHP ActiveX PHP Extension Perl PowerBuilder PowerShell PureBasic Ruby SQL Server Swift 2 Swift 3,4,5... Tcl Unicode C Unicode C++ VB.NET VBScript Visual Basic 6.0 Visual FoxPro Xojo Plugin
(Node.js) Verify Signature of Alexa Custom Skill RequestThis example verifies the signature of an Alexa Custom Skill Request.
var os = require('os'); if (os.platform() == 'win32') { if (os.arch() == 'ia32') { var chilkat = require('@chilkat/ck-node21-win-ia32'); } else { var chilkat = require('@chilkat/ck-node21-win64'); } } else if (os.platform() == 'linux') { if (os.arch() == 'arm') { var chilkat = require('@chilkat/ck-node21-arm'); } else if (os.arch() == 'x86') { var chilkat = require('@chilkat/ck-node21-linux32'); } else { var chilkat = require('@chilkat/ck-node21-linux64'); } } else if (os.platform() == 'darwin') { if (os.arch() == 'arm64') { var chilkat = require('@chilkat/ck-node21-mac-m1'); } else { var chilkat = require('@chilkat/ck-node21-macosx'); } } function chilkatExample() { // This example assumes you have a web service that will receive requests from Alexa. // A sample request sent by Alexa will look like the following: // Connection: Keep-Alive // Content-Length: 2583 // Content-Type: application/json; charset=utf-8 // Accept: application/json // Accept-Charset: utf-8 // Host: your.web.server.com // User-Agent: Apache-HttpClient/4.5.x (Java/1.8.0_172) // Signature: dSUmPwxc9...aKAf8mpEXg== // SignatureCertChainUrl: https://s3.amazonaws.com/echo.api/echo-api-cert-6-ats.pem // // {"version":"1.0","session":{"new":true,"sessionId":"amzn1.echo-api.session.433 ... }} // First, assume we've written code to get the 3 pieces of data we need: var signature = "dSUmPwxc9...aKAf8mpEXg=="; var certChainUrl = "https://s3.amazonaws.com/echo.api/echo-api-cert-6-ats.pem"; var jsonBody = "{\"version\":\"1.0\",\"session\":{\"new\":true,\"sessionId\":\"amzn1.echo-api.session.433 ... }}"; // To validate the signature, we do the following: // First, download the PEM-encoded X.509 certificate chain that Alexa used to sign the message var http = new chilkat.Http(); var sbPem = new chilkat.StringBuilder(); var success = http.QuickGetSb(certChainUrl,sbPem); if (success == false) { console.log(http.LastErrorText); return; } var pem = new chilkat.Pem(); success = pem.LoadPem(sbPem.GetAsString(),"passwordNotUsed"); if (success == false) { console.log(pem.LastErrorText); return; } // The 1st certificate should be the signing certificate. // cert: Cert var cert = pem.GetCert(0); if (pem.LastMethodSuccess == false) { console.log(pem.LastErrorText); return; } // Get the public key from the cert. // pubKey: PublicKey var pubKey = cert.ExportPublicKey(); if (cert.LastMethodSuccess == false) { console.log(cert.LastErrorText); return; } // Use the public key extracted from the signing certificate to decrypt the encrypted signature to produce the asserted hash value. var rsa = new chilkat.Rsa(); success = rsa.ImportPublicKeyObj(pubKey); if (success == false) { console.log(cert.LastErrorText); return; } // RSA "decrypt" the signature. // (Amazon's documentation is confusing, because we're simply verifiying the signature against the SHA-1 hash // of the request body. This happens in a single call to VerifyStringENC...) rsa.EncodingMode = "base64"; var bVerified = rsa.VerifyStringENC(jsonBody,"sha1",signature); if (bVerified == true) { console.log("The signature is verified against the JSON body of the request. Yay!"); } else { console.log("Sorry, not verified. Crud!"); } } chilkatExample(); |
© 2000-2024 Chilkat Software, Inc. All Rights Reserved.