@hearth-auth/node 0.0.1
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.
- package/dist/admin.d.ts +83 -0
- package/dist/admin.d.ts.map +1 -0
- package/dist/admin.js +184 -0
- package/dist/admin.js.map +1 -0
- package/dist/admin.test.d.ts +2 -0
- package/dist/admin.test.d.ts.map +1 -0
- package/dist/admin.test.js +239 -0
- package/dist/admin.test.js.map +1 -0
- package/dist/authorize.d.ts +35 -0
- package/dist/authorize.d.ts.map +1 -0
- package/dist/authorize.js +68 -0
- package/dist/authorize.js.map +1 -0
- package/dist/authorize.test.d.ts +2 -0
- package/dist/authorize.test.d.ts.map +1 -0
- package/dist/authorize.test.js +93 -0
- package/dist/authorize.test.js.map +1 -0
- package/dist/client.d.ts +36 -0
- package/dist/client.d.ts.map +1 -0
- package/dist/client.js +51 -0
- package/dist/client.js.map +1 -0
- package/dist/config.d.ts +47 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +33 -0
- package/dist/config.js.map +1 -0
- package/dist/config.test.d.ts +2 -0
- package/dist/config.test.d.ts.map +1 -0
- package/dist/config.test.js +36 -0
- package/dist/config.test.js.map +1 -0
- package/dist/discovery.d.ts +22 -0
- package/dist/discovery.d.ts.map +1 -0
- package/dist/discovery.js +60 -0
- package/dist/discovery.js.map +1 -0
- package/dist/discovery.test.d.ts +2 -0
- package/dist/discovery.test.d.ts.map +1 -0
- package/dist/discovery.test.js +77 -0
- package/dist/discovery.test.js.map +1 -0
- package/dist/errors.d.ts +120 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +172 -0
- package/dist/errors.js.map +1 -0
- package/dist/errors.test.d.ts +2 -0
- package/dist/errors.test.d.ts.map +1 -0
- package/dist/errors.test.js +89 -0
- package/dist/errors.test.js.map +1 -0
- package/dist/index.d.ts +16 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +18 -0
- package/dist/index.js.map +1 -0
- package/dist/introspect.d.ts +37 -0
- package/dist/introspect.d.ts.map +1 -0
- package/dist/introspect.js +72 -0
- package/dist/introspect.js.map +1 -0
- package/dist/introspect.test.d.ts +2 -0
- package/dist/introspect.test.d.ts.map +1 -0
- package/dist/introspect.test.js +109 -0
- package/dist/introspect.test.js.map +1 -0
- package/dist/jwks.d.ts +26 -0
- package/dist/jwks.d.ts.map +1 -0
- package/dist/jwks.js +106 -0
- package/dist/jwks.js.map +1 -0
- package/dist/jwks.test.d.ts +7 -0
- package/dist/jwks.test.d.ts.map +1 -0
- package/dist/jwks.test.js +154 -0
- package/dist/jwks.test.js.map +1 -0
- package/dist/middleware.d.ts +61 -0
- package/dist/middleware.d.ts.map +1 -0
- package/dist/middleware.js +228 -0
- package/dist/middleware.js.map +1 -0
- package/dist/middleware.mode.test.d.ts +2 -0
- package/dist/middleware.mode.test.d.ts.map +1 -0
- package/dist/middleware.mode.test.js +203 -0
- package/dist/middleware.mode.test.js.map +1 -0
- package/dist/middleware.test.d.ts +2 -0
- package/dist/middleware.test.d.ts.map +1 -0
- package/dist/middleware.test.js +144 -0
- package/dist/middleware.test.js.map +1 -0
- package/dist/token.d.ts +68 -0
- package/dist/token.d.ts.map +1 -0
- package/dist/token.js +111 -0
- package/dist/token.js.map +1 -0
- package/dist/token.test.d.ts +2 -0
- package/dist/token.test.d.ts.map +1 -0
- package/dist/token.test.js +135 -0
- package/dist/token.test.js.map +1 -0
- package/package.json +40 -0
package/dist/token.d.ts
ADDED
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
/** §4 — VerifiedToken: typed claims accessors and helpers. */
|
|
2
|
+
/**
|
|
3
|
+
* Controls how authorization data is delivered to resource servers.
|
|
4
|
+
* Mirrors the server-side `AccessTokenAuthorization` enum (HEA-922).
|
|
5
|
+
*/
|
|
6
|
+
export type AccessTokenAuthorizationMode = "embedded" | "introspection" | "decision";
|
|
7
|
+
import type { JWTPayload } from "jose";
|
|
8
|
+
interface RawPayload extends JWTPayload {
|
|
9
|
+
scope?: string;
|
|
10
|
+
scopes?: string[];
|
|
11
|
+
roles?: string[];
|
|
12
|
+
permissions?: string[];
|
|
13
|
+
groups?: string[];
|
|
14
|
+
oid?: string;
|
|
15
|
+
org_groups?: string[];
|
|
16
|
+
token_type?: string;
|
|
17
|
+
required_actions?: string[];
|
|
18
|
+
[key: string]: unknown;
|
|
19
|
+
}
|
|
20
|
+
export declare class VerifiedToken {
|
|
21
|
+
private readonly _payload;
|
|
22
|
+
private readonly _header;
|
|
23
|
+
constructor(payload: JWTPayload, header: Record<string, unknown>);
|
|
24
|
+
/** The `sub` claim. Returns empty string if absent. */
|
|
25
|
+
subject(): string;
|
|
26
|
+
/** The `iss` claim. Returns empty string if absent. */
|
|
27
|
+
issuer(): string;
|
|
28
|
+
/** The `aud` claim normalized to an array. */
|
|
29
|
+
audiences(): string[];
|
|
30
|
+
/** The `iat` claim as a Date, or null if absent. */
|
|
31
|
+
issuedAt(): Date | null;
|
|
32
|
+
/** The `exp` claim as a Date, or null if absent. */
|
|
33
|
+
expiry(): Date | null;
|
|
34
|
+
/** The `nbf` claim as a Date, or null if absent. */
|
|
35
|
+
notBefore(): Date | null;
|
|
36
|
+
/** The `jti` (JWT ID) claim. Returns empty string if absent. */
|
|
37
|
+
jwtID(): string;
|
|
38
|
+
/** The raw `scope` string claim (space-separated). Returns empty string if absent. */
|
|
39
|
+
scope(): string;
|
|
40
|
+
/** The `scope` claim split into individual values, or the `scopes` array if present. */
|
|
41
|
+
scopes(): string[];
|
|
42
|
+
/** Get an arbitrary claim by key. */
|
|
43
|
+
get(key: string): unknown;
|
|
44
|
+
/** Return the raw JWT payload object. */
|
|
45
|
+
raw(): Readonly<RawPayload>;
|
|
46
|
+
/** Timing-safe check: returns true if the token contains the given scope. */
|
|
47
|
+
hasScope(s: string): boolean;
|
|
48
|
+
/** Timing-safe check: returns true if the token's `roles` claim contains the given role. */
|
|
49
|
+
hasRole(r: string): boolean;
|
|
50
|
+
/** Timing-safe check: returns true if the token's `permissions` claim contains the given permission. */
|
|
51
|
+
hasPermission(p: string): boolean;
|
|
52
|
+
/** Returns true if the token's `groups` claim contains the given group id. */
|
|
53
|
+
inGroup(groupId: string): boolean;
|
|
54
|
+
/** Returns true if the token's `oid` claim exactly matches the given org id. */
|
|
55
|
+
inOrg(orgId: string): boolean;
|
|
56
|
+
/** The `token_type` claim (`"access"`, `"refresh"`, `"required_action"`). Returns empty string if absent. */
|
|
57
|
+
tokenType(): string;
|
|
58
|
+
/** The `oid` (organization ID) claim, or undefined if absent. */
|
|
59
|
+
organizationId(): string | undefined;
|
|
60
|
+
/** The `org_groups` claim (Keycloak-style group paths). Returns empty array if absent. */
|
|
61
|
+
orgGroups(): string[];
|
|
62
|
+
/** The `required_actions` claim. Returns empty array if absent. */
|
|
63
|
+
requiredActions(): string[];
|
|
64
|
+
/** @internal Expose header for downstream use (e.g. kid extraction). */
|
|
65
|
+
get _rawHeader(): Record<string, unknown>;
|
|
66
|
+
}
|
|
67
|
+
export {};
|
|
68
|
+
//# sourceMappingURL=token.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"token.d.ts","sourceRoot":"","sources":["../src/token.ts"],"names":[],"mappings":"AAAA,8DAA8D;AAE9D;;;GAGG;AACH,MAAM,MAAM,4BAA4B,GAAG,UAAU,GAAG,eAAe,GAAG,UAAU,CAAC;AAGrF,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,MAAM,CAAC;AAQvC,UAAU,UAAW,SAAQ,UAAU;IACrC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;IACjB,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;IACvB,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;IAClB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;IACtB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,gBAAgB,CAAC,EAAE,MAAM,EAAE,CAAC;IAC5B,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAED,qBAAa,aAAa;IACxB,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAa;IACtC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAA0B;gBAEtC,OAAO,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;IAKhE,uDAAuD;IACvD,OAAO,IAAI,MAAM;IAIjB,uDAAuD;IACvD,MAAM,IAAI,MAAM;IAIhB,8CAA8C;IAC9C,SAAS,IAAI,MAAM,EAAE;IAMrB,oDAAoD;IACpD,QAAQ,IAAI,IAAI,GAAG,IAAI;IAIvB,oDAAoD;IACpD,MAAM,IAAI,IAAI,GAAG,IAAI;IAIrB,oDAAoD;IACpD,SAAS,IAAI,IAAI,GAAG,IAAI;IAIxB,gEAAgE;IAChE,KAAK,IAAI,MAAM;IAIf,sFAAsF;IACtF,KAAK,IAAI,MAAM;IAIf,wFAAwF;IACxF,MAAM,IAAI,MAAM,EAAE;IAOlB,qCAAqC;IACrC,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO;IAIzB,yCAAyC;IACzC,GAAG,IAAI,QAAQ,CAAC,UAAU,CAAC;IAI3B,6EAA6E;IAC7E,QAAQ,CAAC,CAAC,EAAE,MAAM,GAAG,OAAO;IAI5B,4FAA4F;IAC5F,OAAO,CAAC,CAAC,EAAE,MAAM,GAAG,OAAO;IAI3B,wGAAwG;IACxG,aAAa,CAAC,CAAC,EAAE,MAAM,GAAG,OAAO;IAIjC,8EAA8E;IAC9E,OAAO,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO;IAIjC,gFAAgF;IAChF,KAAK,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO;IAM7B,6GAA6G;IAC7G,SAAS,IAAI,MAAM;IAInB,iEAAiE;IACjE,cAAc,IAAI,MAAM,GAAG,SAAS;IAIpC,0FAA0F;IAC1F,SAAS,IAAI,MAAM,EAAE;IAIrB,mEAAmE;IACnE,eAAe,IAAI,MAAM,EAAE;IAI3B,wEAAwE;IACxE,IAAI,UAAU,IAAI,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAExC;CACF"}
|
package/dist/token.js
ADDED
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
/** §4 — VerifiedToken: typed claims accessors and helpers. */
|
|
2
|
+
import { timingSafeEqual } from "node:crypto";
|
|
3
|
+
function timingSafeStringEqual(a, b) {
|
|
4
|
+
const bufA = Buffer.from(a.padEnd(Math.max(a.length, b.length), "\0"));
|
|
5
|
+
const bufB = Buffer.from(b.padEnd(Math.max(a.length, b.length), "\0"));
|
|
6
|
+
return timingSafeEqual(bufA, bufB);
|
|
7
|
+
}
|
|
8
|
+
export class VerifiedToken {
|
|
9
|
+
_payload;
|
|
10
|
+
_header;
|
|
11
|
+
constructor(payload, header) {
|
|
12
|
+
this._payload = payload;
|
|
13
|
+
this._header = header;
|
|
14
|
+
}
|
|
15
|
+
/** The `sub` claim. Returns empty string if absent. */
|
|
16
|
+
subject() {
|
|
17
|
+
return this._payload.sub ?? "";
|
|
18
|
+
}
|
|
19
|
+
/** The `iss` claim. Returns empty string if absent. */
|
|
20
|
+
issuer() {
|
|
21
|
+
return this._payload.iss ?? "";
|
|
22
|
+
}
|
|
23
|
+
/** The `aud` claim normalized to an array. */
|
|
24
|
+
audiences() {
|
|
25
|
+
const aud = this._payload.aud;
|
|
26
|
+
if (!aud)
|
|
27
|
+
return [];
|
|
28
|
+
return Array.isArray(aud) ? aud : [aud];
|
|
29
|
+
}
|
|
30
|
+
/** The `iat` claim as a Date, or null if absent. */
|
|
31
|
+
issuedAt() {
|
|
32
|
+
return this._payload.iat !== undefined ? new Date(this._payload.iat * 1000) : null;
|
|
33
|
+
}
|
|
34
|
+
/** The `exp` claim as a Date, or null if absent. */
|
|
35
|
+
expiry() {
|
|
36
|
+
return this._payload.exp !== undefined ? new Date(this._payload.exp * 1000) : null;
|
|
37
|
+
}
|
|
38
|
+
/** The `nbf` claim as a Date, or null if absent. */
|
|
39
|
+
notBefore() {
|
|
40
|
+
return this._payload.nbf !== undefined ? new Date(this._payload.nbf * 1000) : null;
|
|
41
|
+
}
|
|
42
|
+
/** The `jti` (JWT ID) claim. Returns empty string if absent. */
|
|
43
|
+
jwtID() {
|
|
44
|
+
return this._payload.jti ?? "";
|
|
45
|
+
}
|
|
46
|
+
/** The raw `scope` string claim (space-separated). Returns empty string if absent. */
|
|
47
|
+
scope() {
|
|
48
|
+
return this._payload.scope ?? "";
|
|
49
|
+
}
|
|
50
|
+
/** The `scope` claim split into individual values, or the `scopes` array if present. */
|
|
51
|
+
scopes() {
|
|
52
|
+
if (this._payload.scopes)
|
|
53
|
+
return [...this._payload.scopes];
|
|
54
|
+
const sc = this._payload.scope;
|
|
55
|
+
if (!sc)
|
|
56
|
+
return [];
|
|
57
|
+
return sc.split(/\s+/).filter(Boolean);
|
|
58
|
+
}
|
|
59
|
+
/** Get an arbitrary claim by key. */
|
|
60
|
+
get(key) {
|
|
61
|
+
return this._payload[key];
|
|
62
|
+
}
|
|
63
|
+
/** Return the raw JWT payload object. */
|
|
64
|
+
raw() {
|
|
65
|
+
return Object.freeze({ ...this._payload });
|
|
66
|
+
}
|
|
67
|
+
/** Timing-safe check: returns true if the token contains the given scope. */
|
|
68
|
+
hasScope(s) {
|
|
69
|
+
return this.scopes().some((sc) => timingSafeStringEqual(sc, s));
|
|
70
|
+
}
|
|
71
|
+
/** Timing-safe check: returns true if the token's `roles` claim contains the given role. */
|
|
72
|
+
hasRole(r) {
|
|
73
|
+
return (this._payload.roles ?? []).some((role) => timingSafeStringEqual(role, r));
|
|
74
|
+
}
|
|
75
|
+
/** Timing-safe check: returns true if the token's `permissions` claim contains the given permission. */
|
|
76
|
+
hasPermission(p) {
|
|
77
|
+
return (this._payload.permissions ?? []).some((perm) => timingSafeStringEqual(perm, p));
|
|
78
|
+
}
|
|
79
|
+
/** Returns true if the token's `groups` claim contains the given group id. */
|
|
80
|
+
inGroup(groupId) {
|
|
81
|
+
return (this._payload.groups ?? []).some((g) => timingSafeStringEqual(g, groupId));
|
|
82
|
+
}
|
|
83
|
+
/** Returns true if the token's `oid` claim exactly matches the given org id. */
|
|
84
|
+
inOrg(orgId) {
|
|
85
|
+
const oid = this._payload.oid;
|
|
86
|
+
if (!oid)
|
|
87
|
+
return false;
|
|
88
|
+
return timingSafeStringEqual(oid, orgId);
|
|
89
|
+
}
|
|
90
|
+
/** The `token_type` claim (`"access"`, `"refresh"`, `"required_action"`). Returns empty string if absent. */
|
|
91
|
+
tokenType() {
|
|
92
|
+
return this._payload.token_type ?? "";
|
|
93
|
+
}
|
|
94
|
+
/** The `oid` (organization ID) claim, or undefined if absent. */
|
|
95
|
+
organizationId() {
|
|
96
|
+
return this._payload.oid;
|
|
97
|
+
}
|
|
98
|
+
/** The `org_groups` claim (Keycloak-style group paths). Returns empty array if absent. */
|
|
99
|
+
orgGroups() {
|
|
100
|
+
return this._payload.org_groups ? [...this._payload.org_groups] : [];
|
|
101
|
+
}
|
|
102
|
+
/** The `required_actions` claim. Returns empty array if absent. */
|
|
103
|
+
requiredActions() {
|
|
104
|
+
return this._payload.required_actions ? [...this._payload.required_actions] : [];
|
|
105
|
+
}
|
|
106
|
+
/** @internal Expose header for downstream use (e.g. kid extraction). */
|
|
107
|
+
get _rawHeader() {
|
|
108
|
+
return this._header;
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
//# sourceMappingURL=token.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"token.js","sourceRoot":"","sources":["../src/token.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"token.test.d.ts","sourceRoot":"","sources":["../src/token.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,135 @@
|
|
|
1
|
+
import { describe, it, expect } from "vitest";
|
|
2
|
+
import { VerifiedToken } from "./token.js";
|
|
3
|
+
function makeToken(overrides = {}) {
|
|
4
|
+
const payload = {
|
|
5
|
+
sub: "user123",
|
|
6
|
+
iss: "https://auth.example.com",
|
|
7
|
+
aud: ["api.example.com", "admin.example.com"],
|
|
8
|
+
iat: 1_700_000_000,
|
|
9
|
+
exp: 1_700_003_600,
|
|
10
|
+
nbf: 1_700_000_000,
|
|
11
|
+
...overrides,
|
|
12
|
+
};
|
|
13
|
+
return new VerifiedToken(payload, { alg: "RS256", kid: "key-1" });
|
|
14
|
+
}
|
|
15
|
+
describe("VerifiedToken claims accessors", () => {
|
|
16
|
+
it("subject() returns sub", () => expect(makeToken().subject()).toBe("user123"));
|
|
17
|
+
it("issuer() returns iss", () => expect(makeToken().issuer()).toBe("https://auth.example.com"));
|
|
18
|
+
it("audiences() returns normalized array", () => expect(makeToken().audiences()).toEqual(["api.example.com", "admin.example.com"]));
|
|
19
|
+
it("audiences() returns [] when absent", () => expect(makeToken({ aud: undefined }).audiences()).toEqual([]));
|
|
20
|
+
it("audiences() wraps single string in array", () => expect(makeToken({ aud: "only.one" }).audiences()).toEqual(["only.one"]));
|
|
21
|
+
it("issuedAt() returns Date", () => expect(makeToken().issuedAt()).toEqual(new Date(1_700_000_000_000)));
|
|
22
|
+
it("expiry() returns Date", () => expect(makeToken().expiry()).toEqual(new Date(1_700_003_600_000)));
|
|
23
|
+
it("notBefore() returns Date", () => expect(makeToken().notBefore()).toEqual(new Date(1_700_000_000_000)));
|
|
24
|
+
it("issuedAt/expiry/notBefore return null when absent", () => {
|
|
25
|
+
const t = makeToken({ iat: undefined, exp: undefined, nbf: undefined });
|
|
26
|
+
expect(t.issuedAt()).toBeNull();
|
|
27
|
+
expect(t.expiry()).toBeNull();
|
|
28
|
+
expect(t.notBefore()).toBeNull();
|
|
29
|
+
});
|
|
30
|
+
it("jwtID() returns jti claim", () => {
|
|
31
|
+
const t = makeToken({ jti: "unique-jwt-id-123" });
|
|
32
|
+
expect(t.jwtID()).toBe("unique-jwt-id-123");
|
|
33
|
+
});
|
|
34
|
+
it("jwtID() returns empty string when absent", () => {
|
|
35
|
+
expect(makeToken().jwtID()).toBe("");
|
|
36
|
+
});
|
|
37
|
+
it("scope() returns raw scope string", () => {
|
|
38
|
+
const t = makeToken({ scope: "openid profile email" });
|
|
39
|
+
expect(t.scope()).toBe("openid profile email");
|
|
40
|
+
});
|
|
41
|
+
it("scopes() splits scope string", () => {
|
|
42
|
+
const t = makeToken({ scope: "openid profile email" });
|
|
43
|
+
expect(t.scopes()).toEqual(["openid", "profile", "email"]);
|
|
44
|
+
});
|
|
45
|
+
it("scopes() prefers scopes array over scope string", () => {
|
|
46
|
+
const t = makeToken({ scopes: ["a", "b"] });
|
|
47
|
+
expect(t.scopes()).toEqual(["a", "b"]);
|
|
48
|
+
});
|
|
49
|
+
it("get(key) returns arbitrary claim", () => {
|
|
50
|
+
const t = makeToken({ custom_claim: "hello" });
|
|
51
|
+
expect(t.get("custom_claim")).toBe("hello");
|
|
52
|
+
});
|
|
53
|
+
it("raw() returns frozen payload copy", () => {
|
|
54
|
+
const t = makeToken();
|
|
55
|
+
const r = t.raw();
|
|
56
|
+
expect(r.sub).toBe("user123");
|
|
57
|
+
expect(Object.isFrozen(r)).toBe(true);
|
|
58
|
+
});
|
|
59
|
+
});
|
|
60
|
+
describe("VerifiedToken hasScope / hasRole / hasPermission (timing-safe)", () => {
|
|
61
|
+
it("hasScope returns true for present scope", () => {
|
|
62
|
+
const t = makeToken({ scope: "openid read:users" });
|
|
63
|
+
expect(t.hasScope("openid")).toBe(true);
|
|
64
|
+
expect(t.hasScope("read:users")).toBe(true);
|
|
65
|
+
});
|
|
66
|
+
it("hasScope returns false for absent scope", () => {
|
|
67
|
+
const t = makeToken({ scope: "openid" });
|
|
68
|
+
expect(t.hasScope("admin")).toBe(false);
|
|
69
|
+
});
|
|
70
|
+
it("hasRole returns true/false correctly", () => {
|
|
71
|
+
const t = makeToken({ roles: ["admin", "viewer"] });
|
|
72
|
+
expect(t.hasRole("admin")).toBe(true);
|
|
73
|
+
expect(t.hasRole("superuser")).toBe(false);
|
|
74
|
+
});
|
|
75
|
+
it("hasPermission returns true/false correctly", () => {
|
|
76
|
+
const t = makeToken({ permissions: ["users:read", "users:write"] });
|
|
77
|
+
expect(t.hasPermission("users:read")).toBe(true);
|
|
78
|
+
expect(t.hasPermission("users:delete")).toBe(false);
|
|
79
|
+
});
|
|
80
|
+
it("hasScope handles empty scopes gracefully", () => {
|
|
81
|
+
const t = makeToken({});
|
|
82
|
+
expect(t.hasScope("anything")).toBe(false);
|
|
83
|
+
});
|
|
84
|
+
});
|
|
85
|
+
describe("VerifiedToken Hearth custom claims", () => {
|
|
86
|
+
it("inGroup() returns true when group is present", () => {
|
|
87
|
+
const t = makeToken({ groups: ["admins", "developers"] });
|
|
88
|
+
expect(t.inGroup("admins")).toBe(true);
|
|
89
|
+
expect(t.inGroup("developers")).toBe(true);
|
|
90
|
+
});
|
|
91
|
+
it("inGroup() returns false when group is absent", () => {
|
|
92
|
+
const t = makeToken({ groups: ["admins"] });
|
|
93
|
+
expect(t.inGroup("viewers")).toBe(false);
|
|
94
|
+
});
|
|
95
|
+
it("inGroup() returns false when groups claim is missing", () => {
|
|
96
|
+
expect(makeToken().inGroup("anything")).toBe(false);
|
|
97
|
+
});
|
|
98
|
+
it("inOrg() returns true when oid matches", () => {
|
|
99
|
+
const t = makeToken({ oid: "org_abc123" });
|
|
100
|
+
expect(t.inOrg("org_abc123")).toBe(true);
|
|
101
|
+
});
|
|
102
|
+
it("inOrg() returns false when oid does not match", () => {
|
|
103
|
+
const t = makeToken({ oid: "org_abc123" });
|
|
104
|
+
expect(t.inOrg("org_xyz789")).toBe(false);
|
|
105
|
+
});
|
|
106
|
+
it("inOrg() returns false when oid claim is missing", () => {
|
|
107
|
+
expect(makeToken().inOrg("org_abc123")).toBe(false);
|
|
108
|
+
});
|
|
109
|
+
it("tokenType() returns token_type claim", () => {
|
|
110
|
+
const t = makeToken({ token_type: "access" });
|
|
111
|
+
expect(t.tokenType()).toBe("access");
|
|
112
|
+
});
|
|
113
|
+
it("tokenType() returns empty string when absent", () => {
|
|
114
|
+
expect(makeToken().tokenType()).toBe("");
|
|
115
|
+
});
|
|
116
|
+
it("tokenType() returns required_action for required-action tokens", () => {
|
|
117
|
+
const t = makeToken({ token_type: "required_action" });
|
|
118
|
+
expect(t.tokenType()).toBe("required_action");
|
|
119
|
+
});
|
|
120
|
+
it("organizationId() returns oid claim", () => {
|
|
121
|
+
const t = makeToken({ oid: "org_abc123" });
|
|
122
|
+
expect(t.organizationId()).toBe("org_abc123");
|
|
123
|
+
});
|
|
124
|
+
it("organizationId() returns undefined when absent", () => {
|
|
125
|
+
expect(makeToken().organizationId()).toBeUndefined();
|
|
126
|
+
});
|
|
127
|
+
it("orgGroups() returns org_groups claim array", () => {
|
|
128
|
+
const t = makeToken({ org_groups: ["/acme/engineers", "/acme/admins"] });
|
|
129
|
+
expect(t.orgGroups()).toEqual(["/acme/engineers", "/acme/admins"]);
|
|
130
|
+
});
|
|
131
|
+
it("orgGroups() returns empty array when absent", () => {
|
|
132
|
+
expect(makeToken().orgGroups()).toEqual([]);
|
|
133
|
+
});
|
|
134
|
+
});
|
|
135
|
+
//# sourceMappingURL=token.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"token.test.js","sourceRoot":"","sources":["../src/token.test.ts"],"names":[],"mappings":"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"}
|
package/package.json
ADDED
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@hearth-auth/node",
|
|
3
|
+
"version": "0.0.1",
|
|
4
|
+
"description": "Hearth server-side Node.js SDK — JWKS verification, token introspection, Express/Fastify middleware",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"main": "./dist/index.cjs",
|
|
7
|
+
"module": "./dist/index.js",
|
|
8
|
+
"types": "./dist/index.d.ts",
|
|
9
|
+
"exports": {
|
|
10
|
+
".": {
|
|
11
|
+
"types": "./dist/index.d.ts",
|
|
12
|
+
"import": "./dist/index.js",
|
|
13
|
+
"require": "./dist/index.cjs"
|
|
14
|
+
}
|
|
15
|
+
},
|
|
16
|
+
"files": [
|
|
17
|
+
"dist"
|
|
18
|
+
],
|
|
19
|
+
"scripts": {
|
|
20
|
+
"build": "tsc",
|
|
21
|
+
"test": "vitest run --coverage",
|
|
22
|
+
"test:watch": "vitest",
|
|
23
|
+
"typecheck": "tsc --noEmit"
|
|
24
|
+
},
|
|
25
|
+
"dependencies": {
|
|
26
|
+
"jose": "5.9.6"
|
|
27
|
+
},
|
|
28
|
+
"devDependencies": {
|
|
29
|
+
"@types/node": "^22.0.0",
|
|
30
|
+
"@vitest/coverage-v8": "^3.2.0",
|
|
31
|
+
"typescript": "^5.5.0",
|
|
32
|
+
"vitest": "^3.2.0"
|
|
33
|
+
},
|
|
34
|
+
"engines": {
|
|
35
|
+
"node": ">=18.0.0"
|
|
36
|
+
},
|
|
37
|
+
"publishConfig": {
|
|
38
|
+
"access": "public"
|
|
39
|
+
}
|
|
40
|
+
}
|