Instantly share code, notes, and snippets.

What would you like to do?
Basic HTTP Authentication for CloudFront with Lambda@Edge
'use strict';
exports.handler = (event, context, callback) => {
// Get request and request headers
const request = event.Records[0].cf.request;
const headers = request.headers;
// Configure authentication
const authUser = 'user';
const authPass = 'pass';
// Construct the Basic Auth string
const authString = 'Basic ' + new Buffer(authUser + ':' + authPass).toString('base64');
// Require Basic authentication
if (typeof headers.authorization == 'undefined' || headers.authorization[0].value != authString) {
const body = 'Unauthorized';
const response = {
status: '401',
statusDescription: 'Unauthorized',
body: body,
headers: {
'www-authenticate': [{key: 'WWW-Authenticate', value:'Basic'}]
callback(null, response);
// Continue request processing if authentication passed
callback(null, request);

This comment has been minimized.


lmakarov commented Aug 30, 2017

See my article on Medium for details.


This comment has been minimized.

homaily commented Jan 16, 2018

Thanks Leonid for sharing this.

Lines 8 to 13 if moved before the function (before line 2) it will be parsed just once and cached in memory for next executions.


This comment has been minimized.

vssystemluba commented Mar 27, 2018

This should be in the official AWS docs. Extremely useful; thanks for sharing!


This comment has been minimized.

pmcdowell-okta commented Apr 12, 2018

Agreed ! There is little documentation on Lambda Edge. Thank you for sharing the code


This comment has been minimized.

trinath-k commented Apr 12, 2018

Imakarov did you finish full doc on how to setup this? I am having hard time implementing this getting errors when assigning role to lambda. Which role should i use and which policies i have to add that role?


This comment has been minimized.

pmcdowell-okta commented Apr 13, 2018


I had the same problem. Your Lambda has to be in N. Virginia (althought that might have changed).

Find the role you assigned to the Lambda Function, and edit the policy "Trust Relationship" to something like this:

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Service": [ "", "" ] }, "Action": "sts:AssumeRole" } ] }

This worked for me. AWS Documentation does not explain that very well.

Good Luck !


This comment has been minimized.

trinath-k commented Apr 13, 2018

Hi, I have configured everything. But i still can't access file in my s3 bucket. I am trying to access a file in this s3 bucket. it's only listing the object. I wanted it be able to download or read.

This XML file does not appear to have any style information associated with it. The document tree is shown below.





This comment has been minimized.

iamwalker commented Apr 24, 2018

Is there a way to set this up on specific directories in the s3 bucket? i.e. allowed, triggers auth


This comment has been minimized.

tvalleley commented Jun 13, 2018

@iamwalker In CloudFront, under "Origin Settings", you can set the Origin Path. For example, I'm running an S3 bucket with dev, stage and prod folders. I have one CloudFront distribution for each one.


This comment has been minimized.

mathieug commented Jul 2, 2018

You should return the callback or wrap the second call to it into a else case.


This comment has been minimized.

Spaideri commented Nov 15, 2018


Inspired from this I made my own version which is using a shared cookie secret to allow application to use Authorization header for JWT Bearer tokens. See webscale-oy/aws-cloudfront-basic-auth for Cloudformation templates and documentation.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment