Skip to content

Folders and files

NameName
Last commit message
Last commit date

Latest commit

History

27 Commits

Repository files navigation

Express/Connect middleware for proxying files from S3 to Internet

With this middleware you can:

  • check authorization of a user to access a target object(using ACL, RBAC, etc.)
  • translate urls to S3 keys

This middleware supports:

  • Caching objects
  • Piping objects from S3 to response, so objects don't fully loaded in memory

Install

npm install s3layer

Usage example:

varapp=require("express")(),S3Layer=require("s3layer");AWS_SETUP={accessKeyId: "...",secretAccessKey: "...",bucket: "..."// default bucket};// create a middlewarevars3l=S3Layer({AWS: AWS_SETUP,// the default bucket, can be overwritten by a getS3Key's returned valuebucket: AWS_SETUP.bucket,/** * params has fields: * req - http request * res - http response * url - requested url */getS3Key: function(params,cb){params.url=params.url.replace(/^\//,"");if(params.url=="restricted-file.png"){params.res.status(403).send("Forbidden");return;}// proxy request to Key = params.urlcb(null,params.url);}});// use the middleware in the express applicationapp.use("/files",s3l);

getS3Key

Accepts a request params and a callback function, in the callback function you can return:

  • string - interpreted as S3 Key
  • object which can contain key and bucket fields

For example:

 getS3Key: function(params,cb){params.url=params.url.replace(/^\//,"");if(params.url=="restricted-file.png"){params.res.status(403).send("Forbidden");return;}// proxy request to Key = params.urlcb(null,{key: params.url,bucket: "another-bucket"});}

modifyHeaders

You can modify headers returned for a file, with modifyHeaders callback:

For example

/** * @param {Object} params * @return {Object} params.headers - headers returned by Amazon S3 * @return {Object} params.outHeaders - headers that will be returned in a HTTP response, you can modify them directly */
modifyHeaders: function(params){if(params.headers["content-type"]&&params.headers["content-type"].indexOf("image/")===0){// force download all imagesparams.outHeaders["Content-Disposition"]='attachment; filename="img.jpg"';}}

modifyHeaders is synchronous!

About

The layer between S3 and Internet that aims to authorize access to objects

Topics

Resources

Stars

1 star

Watchers

1 watching

Forks

Releases

Packages

Used by

Contributors

Languages