UNPKG

@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
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 };