next-auth-pubkey
Version:
A light-weight Lightning and Nostr auth provider for your Next.js app that's entirely self-hosted and plugs seamlessly into the next-auth framework.
50 lines (49 loc) • 1.87 kB
JavaScript
import { randomBytes } from "crypto";
import lnurlEncode from "../../utils/lnurl/encode.js";
import { createValidation } from "../validation/api.js";
export default async function handler({ body, cookies, url, config, }) {
let state, oldK1;
try {
({ state, k1: oldK1 } = createValidation.parse(body));
}
catch (e) {
return { error: "BadRequest", log: e instanceof Error ? e.message : "" };
}
// if an old k1 is provided, delete it
if (typeof oldK1 === "string") {
try {
await config.storage.delete({ k1: oldK1 }, url, config);
}
catch (e) {
if (config.flags.logs) {
console.error(e);
}
if (config.flags.diagnostics && config.flags.logs) {
console.warn(`An error occurred in the storage.delete method. To debug the error see: ${config.baseUrl + config.apis.diagnostics}`);
}
}
}
const k1 = randomBytes(32).toString("hex");
const callbackUrl = new URL(config.baseUrl + config.apis.callback);
callbackUrl.searchParams.append("k1", k1);
callbackUrl.searchParams.append("tag", "login");
const encoded = lnurlEncode(callbackUrl.toString()).toUpperCase();
try {
await config.storage.set({ k1, data: { k1, state } }, url, config);
}
catch (e) {
if (config.flags.diagnostics && config.flags.logs) {
console.warn(`An error occurred in the storage.set method. To debug the error see: ${config.baseUrl + config.apis.diagnostics}`);
}
return { error: "Default", log: e instanceof Error ? e.message : "" };
}
return {
response: {
success: true,
k1,
lnurl: encoded,
pollInterval: config.intervals.poll,
createInterval: config.intervals.create,
},
};
}