Skip to content

Commit

Permalink
Start of signer
Browse files Browse the repository at this point in the history
  • Loading branch information
AlexanderGeere committed Nov 18, 2024
1 parent dc83deb commit f8f6719
Show file tree
Hide file tree
Showing 3 changed files with 89 additions and 21 deletions.
23 changes: 3 additions & 20 deletions mod/provider/cloudfront.js
Original file line number Diff line number Diff line change
Expand Up @@ -3,17 +3,13 @@
The cloudfront provider module exports a method to fetch resources from an AWS cloudfront service.
@requires fs
@requires path
@requires module:/utils/logger
@requires @aws-sdk/cloudfront-signer
@requires module:/sign/cloudfront
@module /provider/cloudfront
*/

const { readFileSync } = require('fs')
const { join } = require('path')
const { getSignedUrl } = require('@aws-sdk/cloudfront-signer');
const cloudfront_signer = require('../sign/cloudfront');
const logger = require('../utils/logger')

/**
Expand Down Expand Up @@ -41,20 +37,7 @@ module.exports = async function cloudfront(ref) {

try {

// Substitutes {*} with process.env.SRC_* key values.
const url = (ref.params?.url || ref).replace(/{(?!{)(.*?)}/g,
matched => process.env[`SRC_${matched.replace(/(^{)|(}$)/g, '')}`])

const date = new Date(Date.now())

date.setDate(date.getDate() + 1);

const signedURL = getSignedUrl({
url: `https://${url}`,
keyPairId: process.env.KEY_CLOUDFRONT,
dateLessThan: date.toDateString(),
privateKey: String(readFileSync(join(__dirname, `../../${process.env.KEY_CLOUDFRONT}.pem`)))
});
const signedURL = JSON.parse(cloudfront_signer(ref))

// Return signedURL only from request.
if (ref.params?.signedURL) {
Expand Down
4 changes: 3 additions & 1 deletion mod/sign/_sign.js
Original file line number Diff line number Diff line change
Expand Up @@ -9,12 +9,14 @@ The sign API provides access to different request signer modules. Signer modules
@module /sign
*/

const cloudfront = require('./cloudfront')
const cloudinary = require('./cloudinary')
const s3 = require('./s3')

const signerModules = {
cloudinary,
s3
s3,
cloudfront
}

/**
Expand Down
83 changes: 83 additions & 0 deletions mod/sign/cloudfront.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,83 @@
/**
## /sign/cloudfront
The cloudfront sign module exports a method to sign requests to an AWS cloudfront service.
@requires fs
@requires path
@requires aws-sdk/cloudfront-signer
@module /sign/cloudfront
*/


let getSignedUrl;

if(!process.env.KEY_CLOUDFRONT){

console.log('Cloudfront Sign: Missing credentials from env: KEY_CLOUDFRONT')
module.exports = null

}
else{

//Third party sources are optional
try{

getSignedUrl = require('@aws-sdk/cloudfront-signer');
module.exports = cloudfront_signer

}catch(err){

if(err.code === 'MODULE_NOT_FOUND'){

console.log('AWS_SDK/Cloudfront-Signer is not available')
module.exports = null
}

else throw err
}
}

const { readFileSync } = require('fs')
const { join } = require('path')

/**
@function cloudfront_signer
@async
@description
The method creates a signed URL for a cloudfront resource.
@param {Object|String} req Reference object or URL string.
@property {Object} [req.params] Optional parameters for the request.
@property {string} [params.url] Cloudfront resource URL.
@returns {Promise<String>} The method resolves to a string which contains the signed url.
*/
async function cloudfront_signer(req) {

try {

// Substitutes {*} with process.env.SRC_* key values.
const url = (req.params?.url || req).replace(/{(?!{)(.*?)}/g,
matched => process.env[`SRC_${matched.replace(/(^{)|(}$)/g, '')}`])

const date = new Date(Date.now())

date.setDate(date.getDate() + 1);

const signedURL = getSignedUrl({
url: `https://${url}`,
keyPairId: process.env.KEY_CLOUDFRONT,
dateLessThan: date.toDateString(),
privateKey: String(readFileSync(join(__dirname, `../../${process.env.KEY_CLOUDFRONT}.pem`)))
});

// Return signedURL only from request.
return JSON.stringify(signedURL)
}
catch(err){
console.error(err)
}
}

0 comments on commit f8f6719

Please sign in to comment.