Abe Estrada

AWS Cloudfront Lambda Basic Auth

En ocasiones es necesario proteger un sitio web con una contraseña, pero no es necesario tener una lista de usuarios con Cognito o cualquier otro proveedor, tal vez una protección temporal es necesaria. Es por eso que HTTP Basic Authentication sigue siendo la mejor y más rápida solución.

En este caso vamos a utilizar Cloudfront ejecutando una función de Lambda@Edge en cada “Viewer request”.

Es necesario agregar edgelambda.amazonaws.com dentro de Trusted entities en el rol de la función para que pueda ser ejecutada por Edge.

index.js
const credentials = ["user1:apple", "user2:bird", "user3:cake"];
const authStrings = credentials.map((element) => `Basic ${Buffer.from(element, "utf-8").toString("base64")}`);

exports.handler = async (event) => {
  const request = event.Records[0].cf.request;
  const headers = request.headers || {};

  if (!headers.authorization || !authStrings.includes(headers.authorization[0].value)) {
    const response = {
      status: "401",
      statusDescription: "Unauthorized",
      body: "Unauthorized",
      headers: {
        "www-authenticate": [{ key: "WWW-Authenticate", value: 'Basic realm="Authentication"' }],
      },
    };
    return response;
  }

  return request;
};