@hearth-auth/sdk 2.0.4 → 3.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/README.md +295 -101
- package/dist/admin.d.ts +82 -47
- package/dist/admin.js +179 -132
- package/dist/admin.js.map +1 -1
- package/dist/claims.d.ts +10 -0
- package/dist/claims.js +16 -0
- package/dist/claims.js.map +1 -1
- package/dist/errors.d.ts +18 -6
- package/dist/errors.js +70 -7
- package/dist/errors.js.map +1 -1
- package/dist/generated/admin/schema.d.ts +3650 -0
- package/dist/generated/admin/schema.js +6 -0
- package/dist/generated/admin/schema.js.map +1 -0
- package/dist/hearth-client.d.ts +129 -10
- package/dist/hearth-client.js +278 -83
- package/dist/hearth-client.js.map +1 -1
- package/dist/index.d.ts +6 -5
- package/dist/index.js +4 -3
- package/dist/index.js.map +1 -1
- package/dist/introspection-client.d.ts +9 -3
- package/dist/introspection-client.js +35 -14
- package/dist/introspection-client.js.map +1 -1
- package/dist/jwks-client.d.ts +8 -2
- package/dist/jwks-client.js +20 -10
- package/dist/jwks-client.js.map +1 -1
- package/dist/middleware.d.ts +117 -0
- package/dist/middleware.js +171 -1
- package/dist/middleware.js.map +1 -1
- package/dist/nextjs/edge.d.ts +26 -0
- package/dist/nextjs/edge.js +31 -0
- package/dist/nextjs/edge.js.map +1 -0
- package/dist/nextjs/index.d.ts +50 -0
- package/dist/nextjs/index.js +55 -0
- package/dist/nextjs/index.js.map +1 -0
- package/dist/session-version-cache.js.map +1 -1
- package/dist/types.d.ts +62 -4
- package/package.json +20 -3
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `@hearth-auth/sdk/nextjs` — Next.js helpers for the Node.js runtime
|
|
3
|
+
* (Pages Router API routes and App Router Route Handlers).
|
|
4
|
+
*
|
|
5
|
+
* For `middleware.ts`, which runs on the Edge Runtime, import
|
|
6
|
+
* `hearthEdgeMiddleware` from `@hearth-auth/sdk/nextjs/edge`.
|
|
7
|
+
*/
|
|
8
|
+
import { hearthMiddleware } from "../middleware.js";
|
|
9
|
+
/**
|
|
10
|
+
* Wrap a Pages Router API route with Hearth authentication.
|
|
11
|
+
*
|
|
12
|
+
* Verifies the `Authorization: Bearer` token, applies the guards in `options`,
|
|
13
|
+
* sets `req.hearthClaims` and calls `handler`. When the request fails it
|
|
14
|
+
* answers 401 or 403 and `handler` is not called.
|
|
15
|
+
*
|
|
16
|
+
* @throws {@link ConfigurationError} when the client cannot serve the mode.
|
|
17
|
+
*/
|
|
18
|
+
export function withHearthAuth(handler, options) {
|
|
19
|
+
const middleware = hearthMiddleware(options);
|
|
20
|
+
return async (req, res) => {
|
|
21
|
+
let proceed = false;
|
|
22
|
+
let failure;
|
|
23
|
+
await middleware(req, res, (err) => {
|
|
24
|
+
if (err === undefined)
|
|
25
|
+
proceed = true;
|
|
26
|
+
else
|
|
27
|
+
failure = err;
|
|
28
|
+
});
|
|
29
|
+
if (failure !== undefined)
|
|
30
|
+
throw failure;
|
|
31
|
+
if (proceed)
|
|
32
|
+
await handler(req, res);
|
|
33
|
+
};
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Verify the bearer token on an App Router Route Handler request.
|
|
37
|
+
*
|
|
38
|
+
* Returns the verified {@link Claims}, or `null` when the `Authorization`
|
|
39
|
+
* header is missing or not a bearer token, the token does not verify, or the
|
|
40
|
+
* token is a `required_action` token. Create the {@link HearthClient} once at
|
|
41
|
+
* module scope so its JWKS cache is shared across requests.
|
|
42
|
+
*/
|
|
43
|
+
export async function getHearthClaims(req, client) {
|
|
44
|
+
const match = /^Bearer[ ]+(\S+)\s*$/i.exec(req.headers.get("authorization") ?? "");
|
|
45
|
+
if (!match)
|
|
46
|
+
return null;
|
|
47
|
+
try {
|
|
48
|
+
const claims = await client.verifyToken(match[1]);
|
|
49
|
+
return claims.tokenType() === "required_action" ? null : claims;
|
|
50
|
+
}
|
|
51
|
+
catch {
|
|
52
|
+
return null;
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/nextjs/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAIH,OAAO,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AA4BpD;;;;;;;;GAQG;AACH,MAAM,UAAU,cAAc,CAC5B,OAA6B,EAC7B,OAAgC;IAEhC,MAAM,UAAU,GAAG,gBAAgB,CAAC,OAAO,CAAC,CAAC;IAC7C,OAAO,KAAK,EAAE,GAAQ,EAAE,GAAQ,EAAiB,EAAE;QACjD,IAAI,OAAO,GAAG,KAAK,CAAC;QACpB,IAAI,OAAgB,CAAC;QACrB,MAAM,UAAU,CAAC,GAAG,EAAE,GAAG,EAAE,CAAC,GAAa,EAAE,EAAE;YAC3C,IAAI,GAAG,KAAK,SAAS;gBAAE,OAAO,GAAG,IAAI,CAAC;;gBACjC,OAAO,GAAG,GAAG,CAAC;QACrB,CAAC,CAAC,CAAC;QACH,IAAI,OAAO,KAAK,SAAS;YAAE,MAAM,OAAO,CAAC;QACzC,IAAI,OAAO;YAAE,MAAM,OAAO,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;IACvC,CAAC,CAAC;AACJ,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,CAAC,KAAK,UAAU,eAAe,CACnC,GAAgB,EAChB,MAAoB;IAEpB,MAAM,KAAK,GAAG,uBAAuB,CAAC,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,eAAe,CAAC,IAAI,EAAE,CAAC,CAAC;IACnF,IAAI,CAAC,KAAK;QAAE,OAAO,IAAI,CAAC;IACxB,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;QAClD,OAAO,MAAM,CAAC,SAAS,EAAE,KAAK,iBAAiB,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC;IAClE,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"session-version-cache.js","sourceRoot":"","sources":["../src/session-version-cache.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,6BAA6B,EAAE,0BAA0B,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"session-version-cache.js","sourceRoot":"","sources":["../src/session-version-cache.ts"],"names":[],"mappings":"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"}
|
package/dist/types.d.ts
CHANGED
|
@@ -40,13 +40,17 @@ export interface DeviceAuthorizationResponse {
|
|
|
40
40
|
/** Minimum polling interval in seconds. */
|
|
41
41
|
interval: number;
|
|
42
42
|
}
|
|
43
|
-
/**
|
|
43
|
+
/**
|
|
44
|
+
* Response from the token endpoint. `refresh_token` and `id_token` are present
|
|
45
|
+
* only for grants that issue them (a client-credentials grant issues neither).
|
|
46
|
+
*/
|
|
44
47
|
export interface TokenResponse {
|
|
45
48
|
access_token: string;
|
|
46
|
-
id_token: string;
|
|
47
49
|
token_type: string;
|
|
48
50
|
expires_in: number;
|
|
49
|
-
refresh_token
|
|
51
|
+
refresh_token?: string;
|
|
52
|
+
id_token?: string;
|
|
53
|
+
scope?: string;
|
|
50
54
|
}
|
|
51
55
|
/** UserInfo response from the OIDC UserInfo endpoint. */
|
|
52
56
|
export interface UserInfoResponse {
|
|
@@ -54,6 +58,48 @@ export interface UserInfoResponse {
|
|
|
54
58
|
name?: string;
|
|
55
59
|
email?: string;
|
|
56
60
|
email_verified?: boolean;
|
|
61
|
+
preferred_username?: string;
|
|
62
|
+
/** Any other claim the server releases for the granted scopes. */
|
|
63
|
+
[claim: string]: unknown;
|
|
64
|
+
}
|
|
65
|
+
/** Options for `HearthClient.exchangeCode()`. */
|
|
66
|
+
export interface ExchangeCodeOptions {
|
|
67
|
+
/** PKCE code verifier. Required when the authorization request sent a `code_challenge`. */
|
|
68
|
+
codeVerifier?: string;
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* Result of `HearthClient.beginLogin()`. Store `state` and `codeVerifier` in
|
|
72
|
+
* the server-side session, then redirect the browser to `authorizationUrl`.
|
|
73
|
+
*/
|
|
74
|
+
export interface LoginBeginResult {
|
|
75
|
+
/** Full authorization URL to redirect the browser to. */
|
|
76
|
+
authorizationUrl: string;
|
|
77
|
+
/** CSRF value. Check it equals the `state` query parameter on the callback. */
|
|
78
|
+
state: string;
|
|
79
|
+
/** PKCE code verifier. Pass it to `completeLogin()` on the callback. */
|
|
80
|
+
codeVerifier: string;
|
|
81
|
+
}
|
|
82
|
+
/** Response from `GET /oauth/session-versions/snapshot` (RFC HEA-930). */
|
|
83
|
+
export interface SvSnapshotResponse {
|
|
84
|
+
realm: string;
|
|
85
|
+
/** Sequence number to pass as `since` to the first delta call. */
|
|
86
|
+
current_seq: number;
|
|
87
|
+
/** Minimum accepted `sv` per session ID. */
|
|
88
|
+
versions: Record<string, number>;
|
|
89
|
+
}
|
|
90
|
+
/** One session-version bump in the delta feed (RFC HEA-930). */
|
|
91
|
+
export interface SvDeltaEntry {
|
|
92
|
+
seq: number;
|
|
93
|
+
session_id: string;
|
|
94
|
+
min_sv: number;
|
|
95
|
+
bumped_at?: number;
|
|
96
|
+
}
|
|
97
|
+
/** Response from `GET /oauth/session-versions?since=<seq>` (RFC HEA-930). */
|
|
98
|
+
export interface SvDeltaResponse {
|
|
99
|
+
realm: string;
|
|
100
|
+
/** Sequence number to pass as `since` to the next call. */
|
|
101
|
+
next_seq: number;
|
|
102
|
+
deltas: SvDeltaEntry[];
|
|
57
103
|
}
|
|
58
104
|
/** An entry in the `allow_credentials` list during a WebAuthn authentication ceremony. */
|
|
59
105
|
export interface WebAuthnAllowCredential {
|
|
@@ -141,11 +187,16 @@ export interface User {
|
|
|
141
187
|
created_at?: number;
|
|
142
188
|
updated_at?: number;
|
|
143
189
|
}
|
|
190
|
+
/**
|
|
191
|
+
* A user's lifecycle status, as `PATCH /admin/users/{id}` accepts it: the
|
|
192
|
+
* proto enum name. The server refuses the short form (`"active"`).
|
|
193
|
+
*/
|
|
194
|
+
export type UserStatus = "USER_STATUS_ACTIVE" | "USER_STATUS_DISABLED" | "USER_STATUS_PENDING_VERIFICATION";
|
|
144
195
|
/** Parameters for updating a user. */
|
|
145
196
|
export interface UpdateUserParams {
|
|
146
197
|
email?: string;
|
|
147
198
|
displayName?: string;
|
|
148
|
-
status?:
|
|
199
|
+
status?: UserStatus;
|
|
149
200
|
}
|
|
150
201
|
/** Realm record from the API. */
|
|
151
202
|
export interface Realm {
|
|
@@ -167,6 +218,13 @@ export interface UpdateRealmParams {
|
|
|
167
218
|
status?: string;
|
|
168
219
|
config?: Record<string, unknown>;
|
|
169
220
|
}
|
|
221
|
+
/** Pagination options for admin list calls. */
|
|
222
|
+
export interface PageOptions {
|
|
223
|
+
/** Maximum number of items to return. */
|
|
224
|
+
limit?: number;
|
|
225
|
+
/** `next_cursor` from the previous page. */
|
|
226
|
+
cursor?: string;
|
|
227
|
+
}
|
|
170
228
|
/** Paginated list response. */
|
|
171
229
|
export interface PageResponse<T> {
|
|
172
230
|
items: T[];
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@hearth-auth/sdk",
|
|
3
|
-
"version": "
|
|
3
|
+
"version": "3.0.1",
|
|
4
4
|
"repository": {
|
|
5
5
|
"type": "git",
|
|
6
6
|
"url": "git+https://github.com/hearth-auth/hearth.git",
|
|
@@ -13,6 +13,16 @@
|
|
|
13
13
|
"types": "./dist/index.d.ts",
|
|
14
14
|
"import": "./dist/index.js",
|
|
15
15
|
"default": "./dist/index.js"
|
|
16
|
+
},
|
|
17
|
+
"./nextjs": {
|
|
18
|
+
"types": "./dist/nextjs/index.d.ts",
|
|
19
|
+
"import": "./dist/nextjs/index.js",
|
|
20
|
+
"default": "./dist/nextjs/index.js"
|
|
21
|
+
},
|
|
22
|
+
"./nextjs/edge": {
|
|
23
|
+
"types": "./dist/nextjs/edge.d.ts",
|
|
24
|
+
"import": "./dist/nextjs/edge.js",
|
|
25
|
+
"default": "./dist/nextjs/edge.js"
|
|
16
26
|
}
|
|
17
27
|
},
|
|
18
28
|
"files": [
|
|
@@ -27,26 +37,33 @@
|
|
|
27
37
|
"format:check": "prettier --check ."
|
|
28
38
|
},
|
|
29
39
|
"dependencies": {
|
|
30
|
-
"jose": "^
|
|
40
|
+
"jose": "^6.2.12",
|
|
41
|
+
"openapi-fetch": "^0.17.0"
|
|
31
42
|
},
|
|
32
43
|
"peerDependencies": {
|
|
44
|
+
"next": ">=14.0.0",
|
|
33
45
|
"react": ">=17.0.0 <20.0.0"
|
|
34
46
|
},
|
|
35
47
|
"peerDependenciesMeta": {
|
|
48
|
+
"next": {
|
|
49
|
+
"optional": true
|
|
50
|
+
},
|
|
36
51
|
"react": {
|
|
37
52
|
"optional": true
|
|
38
53
|
}
|
|
39
54
|
},
|
|
40
55
|
"devDependencies": {
|
|
41
56
|
"@eslint/js": "^10.0.1",
|
|
42
|
-
"@testing-library/react": "^16.
|
|
57
|
+
"@testing-library/react": "^16.3.3",
|
|
43
58
|
"@types/react": "^18.3.0",
|
|
44
59
|
"@types/react-dom": "^18.3.0",
|
|
45
60
|
"eslint": "^10.11.0",
|
|
46
61
|
"jsdom": "^25.0.0",
|
|
62
|
+
"openapi-typescript": "7.13.0",
|
|
47
63
|
"prettier": "3.9.9",
|
|
48
64
|
"react": "^18.3.0",
|
|
49
65
|
"react-dom": "^18.3.0",
|
|
66
|
+
"tsx": "4.23.15",
|
|
50
67
|
"typescript": "^5.0.0",
|
|
51
68
|
"typescript-eslint": "^8.71.0",
|
|
52
69
|
"vitest": "^4.1.6"
|