@nexauthxyz/browser 0.1.2
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/discovery.d.ts +19 -0
- package/dist/discovery.d.ts.map +1 -0
- package/dist/discovery.js +190 -0
- package/dist/discovery.js.map +1 -0
- package/dist/errors.d.ts +16 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +26 -0
- package/dist/errors.js.map +1 -0
- package/dist/id-token-verifier.d.ts +8 -0
- package/dist/id-token-verifier.d.ts.map +1 -0
- package/dist/id-token-verifier.js +121 -0
- package/dist/id-token-verifier.js.map +1 -0
- package/dist/index.d.ts +8 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +7 -0
- package/dist/index.js.map +1 -0
- package/dist/nexauth-browser-client.d.ts +23 -0
- package/dist/nexauth-browser-client.d.ts.map +1 -0
- package/dist/nexauth-browser-client.js +496 -0
- package/dist/nexauth-browser-client.js.map +1 -0
- package/dist/pkce.d.ts +9 -0
- package/dist/pkce.d.ts.map +1 -0
- package/dist/pkce.js +58 -0
- package/dist/pkce.js.map +1 -0
- package/dist/storage.d.ts +14 -0
- package/dist/storage.d.ts.map +1 -0
- package/dist/storage.js +95 -0
- package/dist/storage.js.map +1 -0
- package/dist/types.d.ts +143 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/package.json +66 -0
- package/readme.md +282 -0
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import type { OpenIdConfiguration } from './types.js';
|
|
2
|
+
export interface OpenIdDiscoveryClientOptions {
|
|
3
|
+
readonly issuer: string;
|
|
4
|
+
readonly fetch: typeof globalThis.fetch;
|
|
5
|
+
}
|
|
6
|
+
declare function normalizeIssuer(value: string): string;
|
|
7
|
+
declare function parseDiscoveryDocument(value: unknown, expectedIssuer: string): OpenIdConfiguration;
|
|
8
|
+
export declare class OpenIdDiscoveryClient {
|
|
9
|
+
private readonly issuer;
|
|
10
|
+
private readonly fetchImplementation;
|
|
11
|
+
private request;
|
|
12
|
+
constructor(options: OpenIdDiscoveryClientOptions);
|
|
13
|
+
getIssuer(): string;
|
|
14
|
+
getConfiguration(): Promise<OpenIdConfiguration>;
|
|
15
|
+
clearCache(): void;
|
|
16
|
+
private loadConfiguration;
|
|
17
|
+
}
|
|
18
|
+
export { normalizeIssuer, parseDiscoveryDocument };
|
|
19
|
+
//# sourceMappingURL=discovery.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"discovery.d.ts","sourceRoot":"","sources":["../src/discovery.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AAEtD,MAAM,WAAW,4BAA4B;IAC3C,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,KAAK,EAAE,OAAO,UAAU,CAAC,KAAK,CAAC;CACzC;AAqCD,iBAAS,eAAe,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAuC9C;AA4CD,iBAAS,sBAAsB,CAC7B,KAAK,EAAE,OAAO,EACd,cAAc,EAAE,MAAM,GACrB,mBAAmB,CAyIrB;AAED,qBAAa,qBAAqB;IAChC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAS;IAChC,OAAO,CAAC,QAAQ,CAAC,mBAAmB,CAA0B;IAC9D,OAAO,CAAC,OAAO,CAA2C;gBAEvC,OAAO,EAAE,4BAA4B;IAKjD,SAAS,IAAI,MAAM;IAInB,gBAAgB,IAAI,OAAO,CAAC,mBAAmB,CAAC;IAgBhD,UAAU,IAAI,IAAI;YAIX,iBAAiB;CAqDhC;AAED,OAAO,EAAE,eAAe,EAAE,sBAAsB,EAAE,CAAC"}
|
|
@@ -0,0 +1,190 @@
|
|
|
1
|
+
import { NexAuthError } from './errors.js';
|
|
2
|
+
function isRecord(value) {
|
|
3
|
+
return typeof value === 'object' && value !== null;
|
|
4
|
+
}
|
|
5
|
+
function requireString(value, field) {
|
|
6
|
+
if (typeof value !== 'string' || value.trim().length === 0) {
|
|
7
|
+
throw new NexAuthError('invalid_discovery_document', `NexAuth discovery metadata is missing "${field}".`);
|
|
8
|
+
}
|
|
9
|
+
return value.trim();
|
|
10
|
+
}
|
|
11
|
+
function requireStringArray(value, field) {
|
|
12
|
+
if (!Array.isArray(value) ||
|
|
13
|
+
!value.every((item) => typeof item === 'string')) {
|
|
14
|
+
throw new NexAuthError('invalid_discovery_document', `NexAuth discovery metadata contains an invalid "${field}" value.`);
|
|
15
|
+
}
|
|
16
|
+
return value;
|
|
17
|
+
}
|
|
18
|
+
function isLocalHostname(hostname) {
|
|
19
|
+
return (hostname === 'localhost' || hostname === '127.0.0.1' || hostname === '[::1]');
|
|
20
|
+
}
|
|
21
|
+
function normalizeIssuer(value) {
|
|
22
|
+
const normalized = value.trim().replace(/\/+$/, '');
|
|
23
|
+
let url;
|
|
24
|
+
try {
|
|
25
|
+
url = new URL(normalized);
|
|
26
|
+
}
|
|
27
|
+
catch (error) {
|
|
28
|
+
throw new NexAuthError('invalid_configuration', 'The NexAuth issuer must be a valid absolute URL.', {
|
|
29
|
+
cause: error,
|
|
30
|
+
});
|
|
31
|
+
}
|
|
32
|
+
if (url.username || url.password) {
|
|
33
|
+
throw new NexAuthError('invalid_configuration', 'The NexAuth issuer must not contain URL credentials.');
|
|
34
|
+
}
|
|
35
|
+
if (url.search || url.hash) {
|
|
36
|
+
throw new NexAuthError('invalid_configuration', 'The NexAuth issuer must not contain query parameters or a fragment.');
|
|
37
|
+
}
|
|
38
|
+
if (url.protocol !== 'https:' && !isLocalHostname(url.hostname)) {
|
|
39
|
+
throw new NexAuthError('invalid_configuration', 'The NexAuth issuer must use HTTPS outside local development.');
|
|
40
|
+
}
|
|
41
|
+
return normalized;
|
|
42
|
+
}
|
|
43
|
+
function validateEndpoint(value, field) {
|
|
44
|
+
const endpoint = requireString(value, field);
|
|
45
|
+
let url;
|
|
46
|
+
try {
|
|
47
|
+
url = new URL(endpoint);
|
|
48
|
+
}
|
|
49
|
+
catch (error) {
|
|
50
|
+
throw new NexAuthError('invalid_discovery_document', `NexAuth discovery metadata contains an invalid "${field}" URL.`, {
|
|
51
|
+
cause: error,
|
|
52
|
+
});
|
|
53
|
+
}
|
|
54
|
+
if (url.username || url.password) {
|
|
55
|
+
throw new NexAuthError('invalid_discovery_document', `NexAuth discovery endpoint "${field}" must not contain URL credentials.`);
|
|
56
|
+
}
|
|
57
|
+
if (url.protocol !== 'https:' && !isLocalHostname(url.hostname)) {
|
|
58
|
+
throw new NexAuthError('invalid_discovery_document', `NexAuth discovery endpoint "${field}" must use HTTPS.`);
|
|
59
|
+
}
|
|
60
|
+
return url.toString();
|
|
61
|
+
}
|
|
62
|
+
function optionalEndpoint(value, field) {
|
|
63
|
+
if (value === undefined || value === null) {
|
|
64
|
+
return undefined;
|
|
65
|
+
}
|
|
66
|
+
return validateEndpoint(value, field);
|
|
67
|
+
}
|
|
68
|
+
function parseDiscoveryDocument(value, expectedIssuer) {
|
|
69
|
+
if (!isRecord(value)) {
|
|
70
|
+
throw new NexAuthError('invalid_discovery_document', 'NexAuth returned an invalid OpenID configuration.');
|
|
71
|
+
}
|
|
72
|
+
const discoveredIssuer = normalizeIssuer(requireString(value.issuer, 'issuer'));
|
|
73
|
+
if (discoveredIssuer !== expectedIssuer) {
|
|
74
|
+
throw new NexAuthError('invalid_discovery_document', 'The discovered NexAuth issuer does not match the configured issuer.');
|
|
75
|
+
}
|
|
76
|
+
const responseTypes = requireStringArray(value.response_types_supported, 'response_types_supported');
|
|
77
|
+
const grantTypes = requireStringArray(value.grant_types_supported, 'grant_types_supported');
|
|
78
|
+
const signingAlgorithms = requireStringArray(value.id_token_signing_alg_values_supported, 'id_token_signing_alg_values_supported');
|
|
79
|
+
const challengeMethods = requireStringArray(value.code_challenge_methods_supported, 'code_challenge_methods_supported');
|
|
80
|
+
const tokenAuthenticationMethods = requireStringArray(value.token_endpoint_auth_methods_supported, 'token_endpoint_auth_methods_supported');
|
|
81
|
+
if (!responseTypes.includes('code')) {
|
|
82
|
+
throw new NexAuthError('invalid_discovery_document', 'NexAuth does not advertise Authorization Code support.');
|
|
83
|
+
}
|
|
84
|
+
if (!grantTypes.includes('authorization_code')) {
|
|
85
|
+
throw new NexAuthError('invalid_discovery_document', 'NexAuth does not advertise the authorization_code grant.');
|
|
86
|
+
}
|
|
87
|
+
if (!signingAlgorithms.includes('RS256')) {
|
|
88
|
+
throw new NexAuthError('invalid_discovery_document', 'NexAuth does not advertise RS256 ID-token signing.');
|
|
89
|
+
}
|
|
90
|
+
if (!challengeMethods.includes('S256')) {
|
|
91
|
+
throw new NexAuthError('invalid_discovery_document', 'NexAuth does not advertise PKCE S256 support.');
|
|
92
|
+
}
|
|
93
|
+
if (!tokenAuthenticationMethods.includes('none')) {
|
|
94
|
+
throw new NexAuthError('invalid_discovery_document', 'NexAuth does not advertise support for public clients.');
|
|
95
|
+
}
|
|
96
|
+
const endSessionEndpoint = optionalEndpoint(value.end_session_endpoint, 'end_session_endpoint');
|
|
97
|
+
const claimsSupported = value.claims_supported === undefined
|
|
98
|
+
? undefined
|
|
99
|
+
: requireStringArray(value.claims_supported, 'claims_supported');
|
|
100
|
+
return {
|
|
101
|
+
issuer: discoveredIssuer,
|
|
102
|
+
authorization_endpoint: validateEndpoint(value.authorization_endpoint, 'authorization_endpoint'),
|
|
103
|
+
token_endpoint: validateEndpoint(value.token_endpoint, 'token_endpoint'),
|
|
104
|
+
userinfo_endpoint: validateEndpoint(value.userinfo_endpoint, 'userinfo_endpoint'),
|
|
105
|
+
jwks_uri: validateEndpoint(value.jwks_uri, 'jwks_uri'),
|
|
106
|
+
...(endSessionEndpoint
|
|
107
|
+
? {
|
|
108
|
+
end_session_endpoint: endSessionEndpoint,
|
|
109
|
+
}
|
|
110
|
+
: {}),
|
|
111
|
+
response_types_supported: responseTypes,
|
|
112
|
+
grant_types_supported: grantTypes,
|
|
113
|
+
subject_types_supported: requireStringArray(value.subject_types_supported, 'subject_types_supported'),
|
|
114
|
+
id_token_signing_alg_values_supported: signingAlgorithms,
|
|
115
|
+
scopes_supported: requireStringArray(value.scopes_supported, 'scopes_supported'),
|
|
116
|
+
...(claimsSupported
|
|
117
|
+
? {
|
|
118
|
+
claims_supported: claimsSupported,
|
|
119
|
+
}
|
|
120
|
+
: {}),
|
|
121
|
+
code_challenge_methods_supported: challengeMethods,
|
|
122
|
+
token_endpoint_auth_methods_supported: tokenAuthenticationMethods,
|
|
123
|
+
};
|
|
124
|
+
}
|
|
125
|
+
export class OpenIdDiscoveryClient {
|
|
126
|
+
issuer;
|
|
127
|
+
fetchImplementation;
|
|
128
|
+
request;
|
|
129
|
+
constructor(options) {
|
|
130
|
+
this.issuer = normalizeIssuer(options.issuer);
|
|
131
|
+
this.fetchImplementation = options.fetch;
|
|
132
|
+
}
|
|
133
|
+
getIssuer() {
|
|
134
|
+
return this.issuer;
|
|
135
|
+
}
|
|
136
|
+
getConfiguration() {
|
|
137
|
+
if (!this.request) {
|
|
138
|
+
this.request = this.loadConfiguration().catch((error) => {
|
|
139
|
+
/*
|
|
140
|
+
* Do not permanently cache discovery failures. A later request
|
|
141
|
+
* should be able to retry after a temporary network outage.
|
|
142
|
+
*/
|
|
143
|
+
this.request = undefined;
|
|
144
|
+
throw error;
|
|
145
|
+
});
|
|
146
|
+
}
|
|
147
|
+
return this.request;
|
|
148
|
+
}
|
|
149
|
+
clearCache() {
|
|
150
|
+
this.request = undefined;
|
|
151
|
+
}
|
|
152
|
+
async loadConfiguration() {
|
|
153
|
+
const discoveryUrl = `${this.issuer}/.well-known/openid-configuration`;
|
|
154
|
+
let response;
|
|
155
|
+
try {
|
|
156
|
+
response = await this.fetchImplementation(discoveryUrl, {
|
|
157
|
+
method: 'GET',
|
|
158
|
+
headers: {
|
|
159
|
+
Accept: 'application/json',
|
|
160
|
+
},
|
|
161
|
+
});
|
|
162
|
+
}
|
|
163
|
+
catch (error) {
|
|
164
|
+
throw new NexAuthError('network_error', 'Unable to connect to the NexAuth OpenID provider.', {
|
|
165
|
+
cause: error,
|
|
166
|
+
});
|
|
167
|
+
}
|
|
168
|
+
const requestId = response.headers.get('x-request-id')?.trim() || undefined;
|
|
169
|
+
if (!response.ok) {
|
|
170
|
+
throw new NexAuthError('discovery_failed', `Unable to load NexAuth OpenID configuration (${response.status}).`, {
|
|
171
|
+
status: response.status,
|
|
172
|
+
...(requestId ? { requestId } : {}),
|
|
173
|
+
});
|
|
174
|
+
}
|
|
175
|
+
let body;
|
|
176
|
+
try {
|
|
177
|
+
body = await response.json();
|
|
178
|
+
}
|
|
179
|
+
catch (error) {
|
|
180
|
+
throw new NexAuthError('invalid_discovery_document', 'NexAuth returned malformed OpenID configuration JSON.', {
|
|
181
|
+
status: response.status,
|
|
182
|
+
...(requestId ? { requestId } : {}),
|
|
183
|
+
cause: error,
|
|
184
|
+
});
|
|
185
|
+
}
|
|
186
|
+
return parseDiscoveryDocument(body, this.issuer);
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
export { normalizeIssuer, parseDiscoveryDocument };
|
|
190
|
+
//# sourceMappingURL=discovery.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"discovery.js","sourceRoot":"","sources":["../src/discovery.ts"],"names":[],"mappings":"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"}
|
package/dist/errors.d.ts
ADDED
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
export type NexAuthErrorCode = 'invalid_configuration' | 'discovery_failed' | 'invalid_discovery_document' | 'login_failed' | 'callback_failed' | 'invalid_state' | 'missing_authorization_code' | 'missing_pkce_transaction' | 'token_exchange_failed' | 'invalid_token_response' | 'id_token_validation_failed' | 'userinfo_failed' | 'logout_failed' | 'network_error' | 'storage_error' | 'authorization_error';
|
|
2
|
+
export interface NexAuthErrorOptions {
|
|
3
|
+
readonly status?: number;
|
|
4
|
+
readonly requestId?: string;
|
|
5
|
+
readonly cause?: unknown;
|
|
6
|
+
}
|
|
7
|
+
export declare class NexAuthError extends Error {
|
|
8
|
+
readonly code: NexAuthErrorCode;
|
|
9
|
+
readonly status: number | undefined;
|
|
10
|
+
readonly requestId: string | undefined;
|
|
11
|
+
readonly cause: unknown;
|
|
12
|
+
constructor(code: NexAuthErrorCode, message: string, options?: NexAuthErrorOptions);
|
|
13
|
+
}
|
|
14
|
+
export declare function isNexAuthError(error: unknown): error is NexAuthError;
|
|
15
|
+
export declare function toNexAuthError(error: unknown, fallbackCode: NexAuthErrorCode, fallbackMessage: string): NexAuthError;
|
|
16
|
+
//# sourceMappingURL=errors.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,gBAAgB,GACxB,uBAAuB,GACvB,kBAAkB,GAClB,4BAA4B,GAC5B,cAAc,GACd,iBAAiB,GACjB,eAAe,GACf,4BAA4B,GAC5B,0BAA0B,GAC1B,uBAAuB,GACvB,wBAAwB,GACxB,4BAA4B,GAC5B,iBAAiB,GACjB,eAAe,GACf,eAAe,GACf,eAAe,GACf,qBAAqB,CAAC;AAE1B,MAAM,WAAW,mBAAmB;IAClC,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,KAAK,CAAC,EAAE,OAAO,CAAC;CAC1B;AAED,qBAAa,YAAa,SAAQ,KAAK;IACrC,SAAgB,IAAI,EAAE,gBAAgB,CAAC;IACvC,SAAgB,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC;IAC3C,SAAgB,SAAS,EAAE,MAAM,GAAG,SAAS,CAAC;IAC9C,SAAyB,KAAK,EAAE,OAAO,CAAC;gBAGtC,IAAI,EAAE,gBAAgB,EACtB,OAAO,EAAE,MAAM,EACf,OAAO,GAAE,mBAAwB;CAUpC;AAED,wBAAgB,cAAc,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,YAAY,CAEpE;AAED,wBAAgB,cAAc,CAC5B,KAAK,EAAE,OAAO,EACd,YAAY,EAAE,gBAAgB,EAC9B,eAAe,EAAE,MAAM,GACtB,YAAY,CAQd"}
|
package/dist/errors.js
ADDED
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
export class NexAuthError extends Error {
|
|
2
|
+
code;
|
|
3
|
+
status;
|
|
4
|
+
requestId;
|
|
5
|
+
cause;
|
|
6
|
+
constructor(code, message, options = {}) {
|
|
7
|
+
super(message);
|
|
8
|
+
this.name = 'NexAuthError';
|
|
9
|
+
this.code = code;
|
|
10
|
+
this.status = options.status;
|
|
11
|
+
this.requestId = options.requestId;
|
|
12
|
+
this.cause = options.cause;
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
export function isNexAuthError(error) {
|
|
16
|
+
return error instanceof NexAuthError;
|
|
17
|
+
}
|
|
18
|
+
export function toNexAuthError(error, fallbackCode, fallbackMessage) {
|
|
19
|
+
if (isNexAuthError(error)) {
|
|
20
|
+
return error;
|
|
21
|
+
}
|
|
22
|
+
return new NexAuthError(fallbackCode, fallbackMessage, {
|
|
23
|
+
cause: error,
|
|
24
|
+
});
|
|
25
|
+
}
|
|
26
|
+
//# sourceMappingURL=errors.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAwBA,MAAM,OAAO,YAAa,SAAQ,KAAK;IACrB,IAAI,CAAmB;IACvB,MAAM,CAAqB;IAC3B,SAAS,CAAqB;IACrB,KAAK,CAAU;IAExC,YACE,IAAsB,EACtB,OAAe,EACf,UAA+B,EAAE;QAEjC,KAAK,CAAC,OAAO,CAAC,CAAC;QAEf,IAAI,CAAC,IAAI,GAAG,cAAc,CAAC;QAC3B,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,IAAI,CAAC,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;QAC7B,IAAI,CAAC,SAAS,GAAG,OAAO,CAAC,SAAS,CAAC;QACnC,IAAI,CAAC,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC;IAC7B,CAAC;CACF;AAED,MAAM,UAAU,cAAc,CAAC,KAAc;IAC3C,OAAO,KAAK,YAAY,YAAY,CAAC;AACvC,CAAC;AAED,MAAM,UAAU,cAAc,CAC5B,KAAc,EACd,YAA8B,EAC9B,eAAuB;IAEvB,IAAI,cAAc,CAAC,KAAK,CAAC,EAAE,CAAC;QAC1B,OAAO,KAAK,CAAC;IACf,CAAC;IAED,OAAO,IAAI,YAAY,CAAC,YAAY,EAAE,eAAe,EAAE;QACrD,KAAK,EAAE,KAAK;KACb,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { NexAuthIdTokenClaims, OpenIdConfiguration } from './types.js';
|
|
2
|
+
export declare class IdTokenVerifier {
|
|
3
|
+
private readonly clientId;
|
|
4
|
+
private readonly keySets;
|
|
5
|
+
constructor(clientId: string);
|
|
6
|
+
verify(idToken: string, configuration: OpenIdConfiguration, expectedNonce: string): Promise<NexAuthIdTokenClaims>;
|
|
7
|
+
}
|
|
8
|
+
//# sourceMappingURL=id-token-verifier.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"id-token-verifier.d.ts","sourceRoot":"","sources":["../src/id-token-verifier.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,oBAAoB,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AAiD5E,qBAAa,eAAe;IAC1B,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAS;IAClC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAmC;gBAExC,QAAQ,EAAE,MAAM;IAItB,MAAM,CACjB,OAAO,EAAE,MAAM,EACf,aAAa,EAAE,mBAAmB,EAClC,aAAa,EAAE,MAAM,GACpB,OAAO,CAAC,oBAAoB,CAAC;CAoHjC"}
|
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
import { createRemoteJWKSet, jwtVerify } from 'jose';
|
|
2
|
+
import { NexAuthError } from './errors.js';
|
|
3
|
+
function requireStringClaim(value, claim) {
|
|
4
|
+
if (typeof value !== 'string' || !value.trim()) {
|
|
5
|
+
throw new NexAuthError('id_token_validation_failed', `The NexAuth ID token is missing the required "${claim}" claim.`);
|
|
6
|
+
}
|
|
7
|
+
return value;
|
|
8
|
+
}
|
|
9
|
+
function requireNumberClaim(value, claim) {
|
|
10
|
+
if (typeof value !== 'number' || !Number.isFinite(value)) {
|
|
11
|
+
throw new NexAuthError('id_token_validation_failed', `The NexAuth ID token is missing the required "${claim}" claim.`);
|
|
12
|
+
}
|
|
13
|
+
return value;
|
|
14
|
+
}
|
|
15
|
+
function validateAudience(audience) {
|
|
16
|
+
if (typeof audience === 'string' && audience.trim()) {
|
|
17
|
+
return audience;
|
|
18
|
+
}
|
|
19
|
+
if (Array.isArray(audience) &&
|
|
20
|
+
audience.length > 0 &&
|
|
21
|
+
audience.every((value) => typeof value === 'string' && value.trim().length > 0)) {
|
|
22
|
+
return audience;
|
|
23
|
+
}
|
|
24
|
+
throw new NexAuthError('id_token_validation_failed', 'The NexAuth ID token contains an invalid audience.');
|
|
25
|
+
}
|
|
26
|
+
export class IdTokenVerifier {
|
|
27
|
+
clientId;
|
|
28
|
+
keySets = new Map();
|
|
29
|
+
constructor(clientId) {
|
|
30
|
+
this.clientId = clientId;
|
|
31
|
+
}
|
|
32
|
+
async verify(idToken, configuration, expectedNonce) {
|
|
33
|
+
if (!idToken.trim()) {
|
|
34
|
+
throw new NexAuthError('id_token_validation_failed', 'NexAuth did not return an ID token.');
|
|
35
|
+
}
|
|
36
|
+
let keySet = this.keySets.get(configuration.jwks_uri);
|
|
37
|
+
if (!keySet) {
|
|
38
|
+
keySet = createRemoteJWKSet(new URL(configuration.jwks_uri));
|
|
39
|
+
this.keySets.set(configuration.jwks_uri, keySet);
|
|
40
|
+
}
|
|
41
|
+
let payload;
|
|
42
|
+
try {
|
|
43
|
+
const result = await jwtVerify(idToken, keySet, {
|
|
44
|
+
issuer: configuration.issuer,
|
|
45
|
+
audience: this.clientId,
|
|
46
|
+
algorithms: ['RS256'],
|
|
47
|
+
clockTolerance: 5,
|
|
48
|
+
});
|
|
49
|
+
payload = result.payload;
|
|
50
|
+
}
|
|
51
|
+
catch (error) {
|
|
52
|
+
throw new NexAuthError('id_token_validation_failed', 'The NexAuth ID token could not be verified.', {
|
|
53
|
+
cause: error,
|
|
54
|
+
});
|
|
55
|
+
}
|
|
56
|
+
const issuer = requireStringClaim(payload.iss, 'iss');
|
|
57
|
+
const subject = requireStringClaim(payload.sub, 'sub');
|
|
58
|
+
const audience = validateAudience(payload.aud);
|
|
59
|
+
const expiresAt = requireNumberClaim(payload.exp, 'exp');
|
|
60
|
+
const issuedAt = requireNumberClaim(payload.iat, 'iat');
|
|
61
|
+
const nonce = requireStringClaim(payload.nonce, 'nonce');
|
|
62
|
+
if (nonce !== expectedNonce) {
|
|
63
|
+
throw new NexAuthError('id_token_validation_failed', 'The NexAuth ID token nonce does not match the authorization request.');
|
|
64
|
+
}
|
|
65
|
+
/*
|
|
66
|
+
* OIDC requires azp when an ID token contains multiple audiences.
|
|
67
|
+
*/
|
|
68
|
+
if (Array.isArray(audience) && audience.length > 1) {
|
|
69
|
+
if (typeof payload.azp !== 'string' || payload.azp !== this.clientId) {
|
|
70
|
+
throw new NexAuthError('id_token_validation_failed', 'The NexAuth ID token contains an invalid authorized party.');
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
/*
|
|
74
|
+
* Remove typed optional claims before spreading the JWT payload.
|
|
75
|
+
* They are added back only when their runtime types are valid.
|
|
76
|
+
*/
|
|
77
|
+
const sanitizedPayload = {
|
|
78
|
+
...payload,
|
|
79
|
+
};
|
|
80
|
+
delete sanitizedPayload.email;
|
|
81
|
+
delete sanitizedPayload.email_verified;
|
|
82
|
+
delete sanitizedPayload.name;
|
|
83
|
+
delete sanitizedPayload.picture;
|
|
84
|
+
delete sanitizedPayload.azp;
|
|
85
|
+
return {
|
|
86
|
+
...sanitizedPayload,
|
|
87
|
+
iss: issuer,
|
|
88
|
+
sub: subject,
|
|
89
|
+
aud: audience,
|
|
90
|
+
exp: expiresAt,
|
|
91
|
+
iat: issuedAt,
|
|
92
|
+
nonce,
|
|
93
|
+
...(typeof payload.azp === 'string'
|
|
94
|
+
? {
|
|
95
|
+
azp: payload.azp,
|
|
96
|
+
}
|
|
97
|
+
: {}),
|
|
98
|
+
...(typeof payload.email === 'string'
|
|
99
|
+
? {
|
|
100
|
+
email: payload.email,
|
|
101
|
+
}
|
|
102
|
+
: {}),
|
|
103
|
+
...(typeof payload.email_verified === 'boolean'
|
|
104
|
+
? {
|
|
105
|
+
email_verified: payload.email_verified,
|
|
106
|
+
}
|
|
107
|
+
: {}),
|
|
108
|
+
...(typeof payload.name === 'string'
|
|
109
|
+
? {
|
|
110
|
+
name: payload.name,
|
|
111
|
+
}
|
|
112
|
+
: {}),
|
|
113
|
+
...(typeof payload.picture === 'string'
|
|
114
|
+
? {
|
|
115
|
+
picture: payload.picture,
|
|
116
|
+
}
|
|
117
|
+
: {}),
|
|
118
|
+
};
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
//# sourceMappingURL=id-token-verifier.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"id-token-verifier.js","sourceRoot":"","sources":["../src/id-token-verifier.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
export declare const NEXAUTH_BROWSER_SDK_VERSION = "0.1.0";
|
|
2
|
+
export { NexAuthBrowserClient } from './nexauth-browser-client.js';
|
|
3
|
+
export { NexAuthError, isNexAuthError, toNexAuthError, type NexAuthErrorCode, type NexAuthErrorOptions, } from './errors.js';
|
|
4
|
+
export type { AuthenticationStatus, AuthorizationCallbackInput, AuthorizationCallbackResult, AuthorizationTransaction, LoginOptions, LogoutOptions, NexAuthBrowserClientOptions, NexAuthIdTokenClaims, NexAuthSession, NexAuthStorage, NexAuthUser, OAuthTokenResponse, OpenIdConfiguration, } from './types.js';
|
|
5
|
+
export { getDefaultBrowserStorage, NexAuthStorageManager, type NexAuthStorageEntry, } from './storage.js';
|
|
6
|
+
export { createCodeChallenge, createPkcePair, generateSecureRandomValue, type PkcePair, } from './pkce.js';
|
|
7
|
+
export { OpenIdDiscoveryClient, normalizeIssuer, parseDiscoveryDocument, type OpenIdDiscoveryClientOptions, } from './discovery.js';
|
|
8
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,2BAA2B,UAAU,CAAC;AACnD,OAAO,EAAE,oBAAoB,EAAE,MAAM,6BAA6B,CAAC;AACnE,OAAO,EACL,YAAY,EACZ,cAAc,EACd,cAAc,EACd,KAAK,gBAAgB,EACrB,KAAK,mBAAmB,GACzB,MAAM,aAAa,CAAC;AAErB,YAAY,EACV,oBAAoB,EACpB,0BAA0B,EAC1B,2BAA2B,EAC3B,wBAAwB,EACxB,YAAY,EACZ,aAAa,EACb,2BAA2B,EAC3B,oBAAoB,EACpB,cAAc,EACd,cAAc,EACd,WAAW,EACX,kBAAkB,EAClB,mBAAmB,GACpB,MAAM,YAAY,CAAC;AACpB,OAAO,EACL,wBAAwB,EACxB,qBAAqB,EACrB,KAAK,mBAAmB,GACzB,MAAM,cAAc,CAAC;AAEtB,OAAO,EACL,mBAAmB,EACnB,cAAc,EACd,yBAAyB,EACzB,KAAK,QAAQ,GACd,MAAM,WAAW,CAAC;AACnB,OAAO,EACL,qBAAqB,EACrB,eAAe,EACf,sBAAsB,EACtB,KAAK,4BAA4B,GAClC,MAAM,gBAAgB,CAAC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
export const NEXAUTH_BROWSER_SDK_VERSION = '0.1.0';
|
|
2
|
+
export { NexAuthBrowserClient } from './nexauth-browser-client.js';
|
|
3
|
+
export { NexAuthError, isNexAuthError, toNexAuthError, } from './errors.js';
|
|
4
|
+
export { getDefaultBrowserStorage, NexAuthStorageManager, } from './storage.js';
|
|
5
|
+
export { createCodeChallenge, createPkcePair, generateSecureRandomValue, } from './pkce.js';
|
|
6
|
+
export { OpenIdDiscoveryClient, normalizeIssuer, parseDiscoveryDocument, } from './discovery.js';
|
|
7
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,2BAA2B,GAAG,OAAO,CAAC;AACnD,OAAO,EAAE,oBAAoB,EAAE,MAAM,6BAA6B,CAAC;AACnE,OAAO,EACL,YAAY,EACZ,cAAc,EACd,cAAc,GAGf,MAAM,aAAa,CAAC;AAiBrB,OAAO,EACL,wBAAwB,EACxB,qBAAqB,GAEtB,MAAM,cAAc,CAAC;AAEtB,OAAO,EACL,mBAAmB,EACnB,cAAc,EACd,yBAAyB,GAE1B,MAAM,WAAW,CAAC;AACnB,OAAO,EACL,qBAAqB,EACrB,eAAe,EACf,sBAAsB,GAEvB,MAAM,gBAAgB,CAAC"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import type { AuthorizationCallbackInput, AuthorizationCallbackResult, LoginOptions, LogoutOptions, NexAuthBrowserClientOptions, NexAuthSession, NexAuthUser, OpenIdConfiguration } from './types.js';
|
|
2
|
+
export declare class NexAuthBrowserClient {
|
|
3
|
+
private readonly clientId;
|
|
4
|
+
private readonly redirectUri;
|
|
5
|
+
private readonly scope;
|
|
6
|
+
private readonly fetchImplementation;
|
|
7
|
+
private readonly storage;
|
|
8
|
+
private readonly discovery;
|
|
9
|
+
private readonly idTokenVerifier;
|
|
10
|
+
constructor(options: NexAuthBrowserClientOptions);
|
|
11
|
+
getConfiguration(): Promise<OpenIdConfiguration>;
|
|
12
|
+
login(options?: LoginOptions): Promise<void>;
|
|
13
|
+
handleCallback(input?: AuthorizationCallbackInput): Promise<AuthorizationCallbackResult>;
|
|
14
|
+
getSession(): NexAuthSession | null;
|
|
15
|
+
isAuthenticated(): boolean;
|
|
16
|
+
getAccessToken(): string | null;
|
|
17
|
+
getUser(): NexAuthUser | null;
|
|
18
|
+
logout(options?: LogoutOptions): Promise<void>;
|
|
19
|
+
clearLocalSession(): void;
|
|
20
|
+
private exchangeAuthorizationCode;
|
|
21
|
+
private loadUserInfo;
|
|
22
|
+
}
|
|
23
|
+
//# sourceMappingURL=nexauth-browser-client.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"nexauth-browser-client.d.ts","sourceRoot":"","sources":["../src/nexauth-browser-client.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EACV,0BAA0B,EAC1B,2BAA2B,EAE3B,YAAY,EACZ,aAAa,EACb,2BAA2B,EAE3B,cAAc,EACd,WAAW,EAEX,mBAAmB,EACpB,MAAM,YAAY,CAAC;AAiSpB,qBAAa,oBAAoB;IAC/B,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAS;IAClC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAS;IACrC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAS;IAC/B,OAAO,CAAC,QAAQ,CAAC,mBAAmB,CAA0B;IAC9D,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAwB;IAChD,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAwB;IAClD,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAkB;gBAE/B,OAAO,EAAE,2BAA2B;IA4C1C,gBAAgB,IAAI,OAAO,CAAC,mBAAmB,CAAC;IAIhD,KAAK,CAAC,OAAO,GAAE,YAAiB,GAAG,OAAO,CAAC,IAAI,CAAC;IAwChD,cAAc,CACzB,KAAK,GAAE,0BAA+B,GACrC,OAAO,CAAC,2BAA2B,CAAC;IAuJhC,UAAU,IAAI,cAAc,GAAG,IAAI;IA8BnC,eAAe,IAAI,OAAO;IAI1B,cAAc,IAAI,MAAM,GAAG,IAAI;IAI/B,OAAO,IAAI,WAAW,GAAG,IAAI;IAIvB,MAAM,CAAC,OAAO,GAAE,aAAkB,GAAG,OAAO,CAAC,IAAI,CAAC;IAuExD,iBAAiB,IAAI,IAAI;YAIlB,yBAAyB;YAoEzB,YAAY;CA4D3B"}
|