Skip to content

Instantly share code, notes, and snippets.

@slaskis
Last active Oct 21, 2015
Embed
What would you like to do?
Basic Auth for S3
{
"name": "bucket-password",
"version": "1.0.0",
"description": "",
"main": "server.js",
"dependencies": {
"aws-sdk": "^2.2.10",
"basic-auth": "^1.0.3"
},
"devDependencies": {},
"scripts": {
"start": "node server",
"test": "echo \"Error: no test specified\" && exit 1"
},
"author": "",
"license": "ISC"
}
var http = require('http');
var path = require('path');
var auth = require('basic-auth');
var aws = require('aws-sdk');
// Expects the AWS credentials according to the official docs:
// http://docs.aws.amazon.com/AWSJavaScriptSDK/guide/node-configuring.html
// (if using heroku the easiest is ENV-variables)
var s3 = new aws.S3({
region: 'eu-west-1'
});
var BUCKET = 'buckit';
var USERNAME = 'secretagent';
var PASSWORD = 'verysecret';
var server = http.createServer(function (req, res) {
var credentials = auth(req)
if (!credentials || credentials.name !== USERNAME || credentials.pass !== PASSWORD) {
res.writeHead(401, 'Access denied', {
'WWW-Authenticate': 'Basic realm="'+ BUCKET + '"'
});
res.end();
} else {
var url = s3.getSignedUrl('getObject', {
Bucket: BUCKET,
Key: req.url.slice(1), // strip the starting /
Expires: 60, // 1 minute from now
ResponseContentDisposition: 'attachment; filename=' + path.basename(req.url)
});
console.log('redirecting to %s', url);
res.writeHead(301, {
'Location': url,
'Cache-Control': 'no-cache, no-store, must-revalidate',
'Pragma': 'no-cache',
'Expires': '0'
});
res.end();
}
})
server.listen(process.env.PORT, function() {
console.log('started server on', this.address())
});
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment