@kinde-oss/kinde-node-express
Version:
Kinde SDK for traditional Node.js Express web apps that run on the server
293 lines (292 loc) • 8.35 kB
JavaScript
import e from "crypto";
import t from "express-session";
import { Configuration as n, GrantType as r, GrantType as i, createKindeServerClient as a, managementApi as o } from "@kinde-oss/kinde-typescript-sdk";
import { readFileSync as s } from "fs";
import { createRequire as c } from "module";
import l from "express";
import { JwtRsaVerifier as u } from "aws-jwt-verify";
import { validateToken as d } from "@kinde/jwt-validator";
//#region src/utils.ts
var f = () => e.randomBytes(28).toString("hex"), p = (e) => {
let t = e.get("host");
return new URL(`${e.protocol}://${t}${e.originalUrl}`);
}, m = {
secret: process.env.SESSION_SECRET || f(),
saveUninitialized: !0,
cookie: {
maxAge: 1e3 * 60 * 60 * 24,
sameSite: "lax",
httpOnly: !0,
secure: process.env.NODE_ENV === "production",
path: "/"
},
resave: !1
}, h = () => (e, t, n) => {
e.setSessionItem = async (t, n) => {
e.session[t] = n;
}, e.getSessionItem = async (t) => e.session[t] ?? null, e.removeSessionItem = async (t) => {
delete e.session[t];
}, e.destroySession = async () => {
e.session.destroy((e) => console.log(e));
}, n();
}, g = (e) => e._router && e._router.stack ? e._router.stack.some((e) => e.name === "session") : !1, _ = (e) => {
g(e) || e.use(t(m)), e.use(h());
}, v = {
name: "@kinde-oss/kinde-node-express",
version: "2.0.2",
description: "Kinde SDK for traditional Node.js Express web apps that run on the server",
main: "dist/kinde-node-express.cjs",
module: "dist/kinde-node-express.mjs",
types: "dist/types/index.d.ts",
type: "module",
engines: { node: ">=18.0.0" },
exports: { ".": {
require: {
types: "./dist/types/index.d.ts",
default: "./dist/kinde-node-express.cjs"
},
import: {
types: "./dist/types/index.d.ts",
default: "./dist/kinde-node-express.mjs"
}
} },
repository: {
type: "git",
url: "https://github.com/kinde-oss/kinde-node-express"
},
bugs: "https://github.com/kinde-oss/kinde-node-express",
homepage: "https://kinde.com",
license: "MIT",
scripts: {
lint: "eslint . && prettier -c .",
"lint:fix": "eslint . --fix && prettier --write .",
"lint-staged": "lint-staged",
format: "npm run lint:fix && npm run prettier:write",
build: "rm -rf ./dist ./dist-cjs && vite build",
test: "vitest run",
"test:watch": "vitest",
"test:coverage": "vitest --coverage"
},
author: {
name: "Kinde",
email: "engineering@kinde.com",
url: "https://kinde.com"
},
devDependencies: {
"@eslint/eslintrc": "^3.3.1",
"@eslint/js": "^10.0.0",
"@tsconfig/node24": "^24.0.0",
"@types/express": "^5.0.0",
"@types/express-session": "^1.18.0",
"@types/node": "^24.0.0",
"@types/supertest": "^7.0.0",
"@typescript-eslint/eslint-plugin": "^8.0.0",
"@typescript-eslint/parser": "^8.0.0",
"@vitest/coverage-v8": "4.1.10",
eslint: "^10.0.0",
globals: "^17.0.0",
husky: "^9.0.0",
"lint-staged": "^17.0.0",
nodemon: "^3.0.0",
prettier: "^3.2.5",
rollup: "^4.18.0",
supertest: "^7.0.0",
"ts-node": "^10.9.2",
typescript: "^6.0.0",
"typescript-eslint": "^8.31.1",
vite: "^8.0.0",
"vite-plugin-dts": "^5.0.0",
vitest: "^4.0.0"
},
keywords: [
"Kinde",
"login",
"Regular web app authentication",
"Express"
],
files: [
"dist",
"dist-cjs",
"LICENCE.md"
],
private: !1,
dependencies: {
"@kinde-oss/kinde-typescript-sdk": "^2.13.0",
"@kinde/jwt-validator": "^0.4.0",
"aws-jwt-verify": "^5.1.1",
"eslint-config-prettier": "^10.1.2",
"eslint-plugin-prettier": "^5.2.6",
express: "^5.0.0",
"express-session": "^1.18.1",
qs: "^6.15.2"
}
}, y = c(import.meta.url), b, x, S = [
"grantType",
"issuerBaseUrl",
"postLogoutRedirectUrl",
"siteUrl",
"clientId"
], C = {
[i.AUTHORIZATION_CODE]: [
"secret",
"redirectUrl",
"unAuthorisedUrl"
],
[i.PKCE]: ["redirectUrl", "unAuthorisedUrl"],
[i.CLIENT_CREDENTIALS]: ["secret"]
}, w = () => {
if (b === void 0) throw Error("Initial config is not initialized");
return b;
}, T = () => {
if (x === void 0) throw Error("Internal Kinde server client is not initialized");
return x;
}, E = (e) => {
let t = C[e.grantType];
if (!t) {
let e = Object.values(i).join(", ");
throw Error(`Provided grant type must be one of these values ${e}`);
}
let n = [...S, ...t], r = e;
return n.forEach((e) => {
let t = r[e];
if (!t || typeof t != "string") throw Error(`Required config parameter '${e}' has invalid value ${t}`);
}), e;
}, D = () => {
try {
let e = y.resolve("express/package.json"), t = JSON.parse(s(e, "utf8"));
if (t.name === "express") return t.version;
} catch (e) {
let t = e instanceof Error ? e.message : String(e);
console.warn(`[SDK] Could not determine application's Express.js version: ${t}`);
}
return "Unknown";
}, O = (e) => {
let { issuerBaseUrl: t, redirectUrl: n, postLogoutRedirectUrl: r, audience: i, scope: o, secret: s, clientId: c } = e;
return b = E(e), console.info(`Kinde Express SDK ${v.version} for Express ${D()}`), x = a(b.grantType, {
authDomain: t,
redirectURL: n,
clientId: c ?? "reg@live",
clientSecret: s,
logoutRedirectURL: r,
audience: i ?? void 0,
scope: o ?? void 0,
framework: "ExpressJS",
frameworkVersion: v.version,
sdkVersion: v.version
}), x;
}, k = (e, t) => {
_(e), O(t);
}, A = () => {
let { redirectUrl: e } = w();
return new URL(e).pathname;
}, j = (e) => {
for (let t of ["org_code"]) {
let n = e[t];
if (n !== void 0 && (!n || typeof n != "string")) {
let e = `Provided param '${t}' has invalid value '${n}'`;
return Error(e);
}
}
return null;
}, M = (e) => {
let { invitation_code: t, ...n } = e, r;
return typeof t == "string" ? r = t.trim() : Array.isArray(t) && typeof t[0] == "string" && (r = t[0].trim()), r ? {
...n,
invitation_code: r,
is_invitation: "true"
} : n;
}, N = async (e, t, n) => {
let r = j(e.query);
if (r !== null) return t.status(400), n(r);
let i = await T().login(e, M(e.query));
t.redirect(i.toString());
}, P = async (e, t) => {
let n = await T().portal(e, e.query);
t.redirect(n.url.toString());
}, F = async (e, t, n) => {
let r = j(e.query);
if (r !== null) return t.status(400), n(r);
let i = await T().register(e, M(e.query));
t.redirect(i.toString());
}, I = async (e, t) => {
let n = await T().logout(e);
t.redirect(n.toString());
}, L = async (e, t) => {
try {
let { siteUrl: n } = w(), r = T(), i = p(e);
await r.handleRedirectToApp(e, i), t.redirect(n);
} catch (e) {
console.debug("Error: ", e);
let { unAuthorisedUrl: n } = w();
t.redirect(n);
}
}, R = () => {
let e = A(), t = l.Router();
return t.get("/login", N), t.get("/portal", P), t.get("/logout", I), t.get("/register", F), t.get(e, L), t;
}, z = (e, t) => {
e.use(t, R());
}, B = async (e, t, n) => {
let r = T();
if (!await r.isAuthenticated(e)) {
let n = await r.logout(e);
return t.redirect(n.toString());
}
try {
return e.user = await r.getUserProfile(e), n();
} catch (e) {
return n(e);
}
}, V = async (e, t, n) => {
let { isAuthenticated: r, logout: i, getToken: a } = T(), { issuerBaseUrl: o } = w();
if (e.headers.authorization) {
let r = e.header("Authorization");
if (!r || !r.startsWith("Bearer ")) {
t.sendStatus(401);
return;
}
let i = r.split(" ")[1];
if ((await d({
token: i,
domain: o
})).valid) {
e.setSessionItem("access_token", i), n();
return;
} else {
t.sendStatus(403);
return;
}
}
if (!await r(e)) {
let n = await i(e);
return t.redirect(n.toString());
}
if (!(await d({
token: await a(e),
domain: o
})).valid) {
t.sendStatus(403);
return;
}
n();
}, H = (e, t) => {
let { audience: n } = t, r = u.create({
issuer: e,
audience: n || null,
jwksUri: `${e}/.well-known/jwks.json`
});
return async (e, t, n) => {
try {
let t = e.headers.authorization, i = t && t.split(" ")[1];
e.user = { id: (await r.verify(i)).sub }, n();
} catch (e) {
return console.log("Token not valid!"), console.log(e), t.sendStatus(403);
}
};
}, U = async (e, t, n) => {
let r = j(e.query);
if (r !== null) return t.status(400), n(r);
let { createOrg: i } = T(), a = await i(e, e.query);
t.redirect(a.toString());
}, W = (e, t) => (k(t, e), z(t, "/"), T());
//#endregion
export { n as Configuration, r as GrantType, U as createOrg, B as getUser, H as jwtVerify, o as managementApi, V as protectRoute, W as setupKinde };