@iaurelius/accounts-nextjs 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,48 @@
1
+ import { type SessionUser } from "@iaurelius/accounts/oidc";
2
+ import type { AccountsConfig } from "./config.js";
3
+ import { type CookieOptions } from "./cookies.js";
4
+ export declare const SESSION_COOKIE = "__accounts_session";
5
+ /** The person's profile as userinfo gave it: Accounts keeps it out of the ID token. */
6
+ export type Profile = {
7
+ email?: string;
8
+ email_verified?: boolean;
9
+ name?: string;
10
+ picture?: string;
11
+ };
12
+ /** What the cookie keeps: the tokens, when the access token expires (Unix seconds) and the profile. */
13
+ export type Session = {
14
+ at: string;
15
+ rt?: string;
16
+ it?: string;
17
+ exp: number;
18
+ u?: Profile;
19
+ };
20
+ export type SessionInfo = {
21
+ user: SessionUser;
22
+ sessionId: string | null;
23
+ orgId: string | null;
24
+ /** When the access token expires (Unix seconds). */
25
+ expiresAt: number;
26
+ };
27
+ export declare const cookieOptions: (cfg: AccountsConfig, secure: boolean, maxAge?: number) => CookieOptions;
28
+ export declare function readSession(cookies: Map<string, string>, cfg: AccountsConfig): Promise<Session | null>;
29
+ export declare function writeSession(s: Session, cookies: Map<string, string>, cfg: AccountsConfig, secure: boolean): Promise<string[]>;
30
+ export declare const clearSession: (cookies: Map<string, string>, cfg: AccountsConfig, secure: boolean) => string[];
31
+ /** Who is signed in, from the session's ID token (verified when it was received, kept encrypted). */
32
+ export declare function infoOf(s: Session): SessionInfo | null;
33
+ export type Resolved = {
34
+ session: Session | null;
35
+ setCookies: string[];
36
+ };
37
+ /** The profile claims worth keeping, from userinfo. */
38
+ export declare function profileOf(cfg: AccountsConfig, accessToken: string): Promise<Profile | undefined>;
39
+ /**
40
+ * The request's session, refreshed if its access token is about to expire. A refresh the application
41
+ * refuses (revoked, banned, session over) signs the person out here; one that cannot reach it keeps
42
+ * the cookie for the next request and treats this one as signed out only if the token already expired.
43
+ */
44
+ export declare function resolveSession(cookies: Map<string, string>, cfg: AccountsConfig, secure: boolean): Promise<Resolved>;
45
+ /** The request's cookies with the ones just set applied: what the rest of this request must see. */
46
+ export declare function applySetCookies(cookies: Map<string, string>, setCookies: string[]): Map<string, string>;
47
+ export declare const cookieHeader: (cookies: Map<string, string>) => string;
48
+ //# sourceMappingURL=session.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session.d.ts","sourceRoot":"","sources":["../src/session.ts"],"names":[],"mappings":"AAAA,OAAO,EAAyE,KAAK,WAAW,EAAE,MAAM,0BAA0B,CAAC;AACnI,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAClD,OAAO,EAAyD,KAAK,aAAa,EAAE,MAAM,cAAc,CAAC;AAEzG,eAAO,MAAM,cAAc,uBAAuB,CAAC;AAEnD,uFAAuF;AACvF,MAAM,MAAM,OAAO,GAAG;IAAE,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,cAAc,CAAC,EAAE,OAAO,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC;AAEpG,uGAAuG;AACvG,MAAM,MAAM,OAAO,GAAG;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,EAAE,CAAC,EAAE,MAAM,CAAC;IAAC,EAAE,CAAC,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAC;IAAC,CAAC,CAAC,EAAE,OAAO,CAAA;CAAE,CAAC;AAEzF,MAAM,MAAM,WAAW,GAAG;IACxB,IAAI,EAAE,WAAW,CAAC;IAClB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,oDAAoD;IACpD,SAAS,EAAE,MAAM,CAAC;CACnB,CAAC;AAEF,eAAO,MAAM,aAAa,QAAS,cAAc,UAAU,OAAO,WAAW,MAAM,KAAG,aAAgD,CAAC;AAEvI,wBAAsB,WAAW,CAAC,OAAO,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,GAAG,EAAE,cAAc,GAAG,OAAO,CAAC,OAAO,GAAG,IAAI,CAAC,CAI5G;AAED,wBAAsB,YAAY,CAAC,CAAC,EAAE,OAAO,EAAE,OAAO,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,GAAG,EAAE,cAAc,EAAE,MAAM,EAAE,OAAO,qBAIhH;AAED,eAAO,MAAM,YAAY,YAAa,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,OAAO,cAAc,UAAU,OAAO,aAAsE,CAAC;AAEtK,qGAAqG;AACrG,wBAAgB,MAAM,CAAC,CAAC,EAAE,OAAO,GAAG,WAAW,GAAG,IAAI,CAQrD;AAED,MAAM,MAAM,QAAQ,GAAG;IAAE,OAAO,EAAE,OAAO,GAAG,IAAI,CAAC;IAAC,UAAU,EAAE,MAAM,EAAE,CAAA;CAAE,CAAC;AAEzE,uDAAuD;AACvD,wBAAsB,SAAS,CAAC,GAAG,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,GAAG,SAAS,CAAC,CAStG;AAED;;;;GAIG;AACH,wBAAsB,cAAc,CAAC,OAAO,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,GAAG,EAAE,cAAc,EAAE,MAAM,EAAE,OAAO,GAAG,OAAO,CAAC,QAAQ,CAAC,CAmB1H;AAED,oGAAoG;AACpG,wBAAgB,eAAe,CAAC,OAAO,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,UAAU,EAAE,MAAM,EAAE,GAAG,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAWvG;AAED,eAAO,MAAM,YAAY,YAAa,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,WAAyD,CAAC"}
@@ -0,0 +1,89 @@
1
+ import { OAuthError, fetchUserInfo, readIdToken, refreshTokens, userFromClaims } from "@iaurelius/accounts/oidc";
2
+ import { clearChunked, readChunked, seal, unseal, writeChunked } from "./cookies.js";
3
+ export const SESSION_COOKIE = "__accounts_session";
4
+ export const cookieOptions = (cfg, secure, maxAge) => ({ secure, maxAge, path: "/" });
5
+ export async function readSession(cookies, cfg) {
6
+ // The access token's expiry travels as `ax`: `exp` is the cookie's own (the JWE's expiration).
7
+ const s = await unseal(readChunked(SESSION_COOKIE, cookies), cfg.cookieSecret, "session");
8
+ return s && s.typ === "session" && typeof s.at === "string" && typeof s.ax === "number" ? { at: s.at, rt: s.rt, it: s.it, exp: s.ax, u: s.u } : null;
9
+ }
10
+ export async function writeSession(s, cookies, cfg, secure) {
11
+ const maxAge = cfg.sessionMaxAgeDays * 86_400;
12
+ const value = await seal({ typ: "session", at: s.at, ...(s.rt && { rt: s.rt }), ...(s.it && { it: s.it }), ax: s.exp, ...(s.u && { u: s.u }) }, cfg.cookieSecret, "session", maxAge);
13
+ return writeChunked(SESSION_COOKIE, value, cookies, cookieOptions(cfg, secure, maxAge));
14
+ }
15
+ export const clearSession = (cookies, cfg, secure) => clearChunked(SESSION_COOKIE, cookies, cookieOptions(cfg, secure));
16
+ /** Who is signed in, from the session's ID token (verified when it was received, kept encrypted). */
17
+ export function infoOf(s) {
18
+ if (!s.it)
19
+ return null;
20
+ try {
21
+ const c = readIdToken(s.it);
22
+ return { user: userFromClaims({ ...c, ...s.u, sub: c.sub }), sessionId: typeof c.sid === "string" ? c.sid : null, orgId: typeof c.org_id === "string" ? c.org_id : null, expiresAt: s.exp };
23
+ }
24
+ catch {
25
+ return null;
26
+ }
27
+ }
28
+ /** The profile claims worth keeping, from userinfo. */
29
+ export async function profileOf(cfg, accessToken) {
30
+ const c = await fetchUserInfo({ issuer: cfg.issuer, accessToken, fetch: cfg.fetch });
31
+ if (!c)
32
+ return undefined;
33
+ const p = {};
34
+ if (typeof c.email === "string")
35
+ p.email = c.email;
36
+ if (typeof c.email_verified === "boolean")
37
+ p.email_verified = c.email_verified;
38
+ if (typeof c.name === "string" && c.name)
39
+ p.name = c.name;
40
+ if (typeof c.picture === "string" && c.picture)
41
+ p.picture = c.picture;
42
+ return p;
43
+ }
44
+ /**
45
+ * The request's session, refreshed if its access token is about to expire. A refresh the application
46
+ * refuses (revoked, banned, session over) signs the person out here; one that cannot reach it keeps
47
+ * the cookie for the next request and treats this one as signed out only if the token already expired.
48
+ */
49
+ export async function resolveSession(cookies, cfg, secure) {
50
+ const s = await readSession(cookies, cfg);
51
+ const now = Math.floor(Date.now() / 1000);
52
+ if (!s) {
53
+ // A cookie we cannot read (another secret, tampered, expired) is dropped.
54
+ const stale = readChunked(SESSION_COOKIE, cookies) !== undefined;
55
+ return { session: null, setCookies: stale ? clearSession(cookies, cfg, secure) : [] };
56
+ }
57
+ if (s.exp - now > cfg.refreshBeforeSeconds)
58
+ return { session: s, setCookies: [] };
59
+ if (!s.rt)
60
+ return s.exp > now ? { session: s, setCookies: [] } : { session: null, setCookies: clearSession(cookies, cfg, secure) };
61
+ try {
62
+ const t = await refreshTokens({ issuer: cfg.issuer, clientId: cfg.clientId, clientSecret: cfg.clientSecret, fetch: cfg.fetch }, { refreshToken: s.rt, resource: cfg.audience });
63
+ // The profile may have changed (a new name): read again, keeping the old one if userinfo does not answer.
64
+ const next = { at: t.accessToken, rt: t.refreshToken ?? s.rt, it: t.idToken ?? s.it, exp: t.expiresAt, u: (await profileOf(cfg, t.accessToken)) ?? s.u };
65
+ return { session: next, setCookies: await writeSession(next, cookies, cfg, secure) };
66
+ }
67
+ catch (e) {
68
+ if (e instanceof OAuthError && e.status >= 400 && e.status < 500)
69
+ return { session: null, setCookies: clearSession(cookies, cfg, secure) };
70
+ return { session: s.exp > now ? s : null, setCookies: [] };
71
+ }
72
+ }
73
+ /** The request's cookies with the ones just set applied: what the rest of this request must see. */
74
+ export function applySetCookies(cookies, setCookies) {
75
+ const out = new Map(cookies);
76
+ for (const sc of setCookies) {
77
+ const [pair, ...attrs] = sc.split(";");
78
+ const i = pair.indexOf("=");
79
+ const name = pair.slice(0, i);
80
+ const removed = attrs.some((a) => a.trim().toLowerCase() === "max-age=0");
81
+ if (removed)
82
+ out.delete(name);
83
+ else
84
+ out.set(name, pair.slice(i + 1));
85
+ }
86
+ return out;
87
+ }
88
+ export const cookieHeader = (cookies) => [...cookies].map(([k, v]) => `${k}=${v}`).join("; ");
89
+ //# sourceMappingURL=session.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session.js","sourceRoot":"","sources":["../src/session.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,58 @@
1
+ {
2
+ "name": "@iaurelius/accounts-nextjs",
3
+ "version": "0.1.0",
4
+ "description": "Accounts by iAurelius for Next.js (App Router): sign-in on the hosted page, sessions in an encrypted cookie, auth() on the server and <UserButton /> in your UI.",
5
+ "keywords": [
6
+ "auth",
7
+ "authentication",
8
+ "nextjs",
9
+ "oidc",
10
+ "passkeys"
11
+ ],
12
+ "homepage": "https://accounts.iaurelius.com",
13
+ "license": "MIT",
14
+ "type": "module",
15
+ "sideEffects": false,
16
+ "exports": {
17
+ ".": {
18
+ "types": "./dist/index.d.ts",
19
+ "react-server": "./dist/index.server.js",
20
+ "default": "./dist/index.js"
21
+ },
22
+ "./server": {
23
+ "types": "./dist/server.d.ts",
24
+ "default": "./dist/server.js"
25
+ },
26
+ "./package.json": "./package.json"
27
+ },
28
+ "files": [
29
+ "dist",
30
+ "README.md",
31
+ "LICENSE"
32
+ ],
33
+ "engines": {
34
+ "node": ">=20"
35
+ },
36
+ "scripts": {
37
+ "build": "rm -rf dist && tsc -p tsconfig.build.json",
38
+ "typecheck": "tsc -p tsconfig.json --noEmit"
39
+ },
40
+ "dependencies": {
41
+ "@iaurelius/accounts": "^0.1.0",
42
+ "jose": "^6.2.12"
43
+ },
44
+ "peerDependencies": {
45
+ "next": ">=15.3.0",
46
+ "react": ">=19.0.0"
47
+ },
48
+ "devDependencies": {
49
+ "@types/react": "19.3.0",
50
+ "@types/react-dom": "19.3.0",
51
+ "next": "16.3.6",
52
+ "react": "19.3.0",
53
+ "react-dom": "19.3.0"
54
+ },
55
+ "publishConfig": {
56
+ "access": "public"
57
+ }
58
+ }