alinea
Version:
Headless git-based CMS
65 lines (63 loc) • 1.75 kB
JavaScript
import "../../chunks/chunk-NZLE2WMY.js";
// src/backend/api/BasicAuth.ts
import { AuthResultType } from "alinea/cloud/AuthResult";
import { atob } from "alinea/core/util/Encoding";
import {
AuthAction,
InvalidCredentialsError,
MissingCredentialsError
} from "../Auth.js";
var BasicAuth = class {
constructor(context, verify) {
this.
this.
}
async authenticate(request) {
try {
const verified = await this.verify(request);
const url = new URL(request.url);
const action = url.searchParams.get("auth");
switch (action) {
case AuthAction.Status: {
return Response.json({
type: AuthResultType.Authenticated,
user: verified.user
});
}
default:
return new Response("Bad request", { status: 400 });
}
} catch {
return unauthorized();
}
}
async verify(request) {
const ctx = this.
const auth = request.headers.get("Authorization");
if (!auth) throw new MissingCredentialsError("Missing authorization header");
const [scheme, token] = auth.split(" ", 2);
if (scheme !== "Basic")
throw new MissingCredentialsError("Invalid authorization scheme");
const [username, password] = atob(token).split(":");
const authorized = await this.
if (!authorized) throw new InvalidCredentialsError("Invalid credentials");
return {
...ctx,
user: { sub: username },
token
};
}
};
function unauthorized() {
return new Response("Unauthorized", {
status: 401,
headers: {
"WWW-Authenticate": 'Basic realm="Secure Area"'
}
});
}
export {
BasicAuth
};