deno.land / x / deno@v1.28.2 / cli / bench / testdata / npm / hono / dist / middleware / basic-auth / index.js
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849"use strict";Object.defineProperty(exports, "__esModule", { value: true });exports.basicAuth = void 0;const buffer_1 = require("../../utils/buffer");const encode_1 = require("../../utils/encode");const CREDENTIALS_REGEXP = /^ *(?:[Bb][Aa][Ss][Ii][Cc]) +([A-Za-z0-9._~+/-]+=*) *$/;const USER_PASS_REGEXP = /^([^:]*):(.*)$/;const auth = (req) => { const match = CREDENTIALS_REGEXP.exec(req.headers.get('Authorization') || ''); if (!match) { return undefined; } const userPass = USER_PASS_REGEXP.exec((0, encode_1.decodeBase64)(match[1])); if (!userPass) { return undefined; } return { username: userPass[1], password: userPass[2] };};const basicAuth = (options, ...users) => { if (!options) { throw new Error('basic auth middleware requires options for "username and password"'); } if (!options.realm) { options.realm = 'Secure Area'; } users.unshift({ username: options.username, password: options.password }); return async (ctx, next) => { const requestUser = auth(ctx.req); if (requestUser) { for (const user of users) { const usernameEqual = await (0, buffer_1.timingSafeEqual)(user.username, requestUser.username, options.hashFunction); const passwordEqual = await (0, buffer_1.timingSafeEqual)(user.password, requestUser.password, options.hashFunction); if (usernameEqual && passwordEqual) { // Authorized OK await next(); return; } } } ctx.res = new Response('Unauthorized', { status: 401, headers: { 'WWW-Authenticate': 'Basic realm="' + options.realm?.replace(/"/g, '\\"') + '"', }, }); };};exports.basicAuth = basicAuth;
Version Info