@m1212e/oidc 0.0.0-stage → 0.1.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/LICENSE +201 -0
- package/README.md +164 -2
- package/out/index.cjs +1017 -0
- package/out/index.cjs.map +1 -0
- package/out/index.d.cts +298 -0
- package/out/index.d.cts.map +1 -0
- package/out/index.d.mts +298 -0
- package/out/index.d.mts.map +1 -0
- package/out/index.mjs +975 -0
- package/out/index.mjs.map +1 -0
- package/package.json +47 -4
package/out/index.d.mts
ADDED
|
@@ -0,0 +1,298 @@
|
|
|
1
|
+
import { JWTPayload } from "jose";
|
|
2
|
+
import { IntrospectionResponse, TokenEndpointResponse, TokenEndpointResponseHelpers, UserInfoResponse } from "openid-client";
|
|
3
|
+
import { Static, Type } from "typebox";
|
|
4
|
+
type TokenKind = "access" | "id";
|
|
5
|
+
type RefreshedTokenSet = TokenEndpointResponse & TokenEndpointResponseHelpers;
|
|
6
|
+
declare class OidcError extends Error {
|
|
7
|
+
refreshedTokens?: RefreshedTokenSet;
|
|
8
|
+
constructor(message: string, options?: ErrorOptions);
|
|
9
|
+
}
|
|
10
|
+
declare class OidcInputError extends OidcError {
|
|
11
|
+
constructor(message: string, options?: ErrorOptions);
|
|
12
|
+
}
|
|
13
|
+
declare class OidcTokenError extends OidcError {
|
|
14
|
+
readonly tokenKind: TokenKind;
|
|
15
|
+
readonly claim: string;
|
|
16
|
+
constructor(tokenKind: TokenKind, claim: string, message: string);
|
|
17
|
+
}
|
|
18
|
+
type TokenValidationFailure = {
|
|
19
|
+
tokenKind: TokenKind;
|
|
20
|
+
stage: string;
|
|
21
|
+
error: unknown;
|
|
22
|
+
};
|
|
23
|
+
declare class OidcTokenValidationError extends OidcError {
|
|
24
|
+
readonly tokenKinds: readonly TokenKind[];
|
|
25
|
+
readonly failures: readonly TokenValidationFailure[];
|
|
26
|
+
constructor(tokenKinds: readonly TokenKind[], failures: readonly TokenValidationFailure[]);
|
|
27
|
+
}
|
|
28
|
+
declare class OidcSubjectError extends OidcError {
|
|
29
|
+
readonly expected: string;
|
|
30
|
+
readonly actual: string;
|
|
31
|
+
constructor(message: string, expected: string, actual: string);
|
|
32
|
+
}
|
|
33
|
+
declare class OidcGrantError extends OidcError {
|
|
34
|
+
readonly grant: "authorization_code" | "refresh_token";
|
|
35
|
+
constructor(grant: "authorization_code" | "refresh_token", message: string, options?: ErrorOptions);
|
|
36
|
+
}
|
|
37
|
+
declare class OidcStateError extends OidcError {
|
|
38
|
+
constructor(message: string, options?: ErrorOptions);
|
|
39
|
+
}
|
|
40
|
+
declare class OidcClaimsError extends OidcError {
|
|
41
|
+
constructor(message: string, options?: ErrorOptions);
|
|
42
|
+
}
|
|
43
|
+
declare class OidcUserInfoError extends OidcError {
|
|
44
|
+
constructor(message: string, options?: ErrorOptions);
|
|
45
|
+
}
|
|
46
|
+
declare class OidcLogoutError extends OidcError {
|
|
47
|
+
constructor(message: string, options?: ErrorOptions);
|
|
48
|
+
}
|
|
49
|
+
declare function attachRefreshedTokens<E>(error: E, refreshedTokens?: RefreshedTokenSet): E;
|
|
50
|
+
declare const DEFAULT_AUTHORIZED_PARTY_CLAIMS: readonly string[];
|
|
51
|
+
type AudienceClaims = Readonly<Record<string, unknown>>;
|
|
52
|
+
type AudiencePolicy = {
|
|
53
|
+
clientId: string;
|
|
54
|
+
expectedAudience?: string[];
|
|
55
|
+
authorizedPartyClaims: readonly string[];
|
|
56
|
+
verifyAudience?: (claims: AudienceClaims, tokenKind: TokenKind) => boolean;
|
|
57
|
+
};
|
|
58
|
+
declare class OidcAudienceError extends OidcTokenError {
|
|
59
|
+
constructor(tokenKind: TokenKind, claim: string, message: string);
|
|
60
|
+
}
|
|
61
|
+
declare function audienceVerifyOption(policy: AudiencePolicy, tokenKind: TokenKind): string | string[] | undefined;
|
|
62
|
+
declare function assertAudienceClaim(claims: AudienceClaims, tokenKind: TokenKind, policy: AudiencePolicy): void;
|
|
63
|
+
declare function assertAuthorizedParty(claims: AudienceClaims, tokenKind: TokenKind, policy: AudiencePolicy): void;
|
|
64
|
+
declare function assertAudienceAfterJwtVerify(claims: AudienceClaims, tokenKind: TokenKind, policy: AudiencePolicy): void;
|
|
65
|
+
declare function assertTokenAudience(claims: AudienceClaims, tokenKind: TokenKind, policy: AudiencePolicy): void;
|
|
66
|
+
declare function assertIntrospectedIdTokenAudience(claims: AudienceClaims, policy: AudiencePolicy): void;
|
|
67
|
+
declare function buildAudiencePolicy(opts: {
|
|
68
|
+
clientId: string;
|
|
69
|
+
expectedAudience?: string | string[];
|
|
70
|
+
authorizedPartyClaims?: readonly string[];
|
|
71
|
+
verifyAudience?: (claims: AudienceClaims, tokenKind: TokenKind) => boolean;
|
|
72
|
+
}): AudiencePolicy;
|
|
73
|
+
type LogLevel = "silent" | "error" | "warn" | "info" | "debug";
|
|
74
|
+
type Logger = {
|
|
75
|
+
debug: (...args: unknown[]) => void;
|
|
76
|
+
info: (...args: unknown[]) => void;
|
|
77
|
+
warn: (...args: unknown[]) => void;
|
|
78
|
+
error: (...args: unknown[]) => void;
|
|
79
|
+
};
|
|
80
|
+
declare function buildLogger(logger?: Logger, logLevel?: LogLevel): Logger;
|
|
81
|
+
declare const OIDCUserSchema: Type.TObject<{
|
|
82
|
+
iss: Type.TOptional<Type.TString>;
|
|
83
|
+
sub: Type.TString;
|
|
84
|
+
email: Type.TOptional<Type.TUnion<[Type.TNull, Type.TCodec<Type.TString, string>]>>;
|
|
85
|
+
email_verified: Type.TOptional<Type.TUnion<[Type.TNull, Type.TCodec<Type.TUnion<[Type.TBoolean, Type.TString, Type.TNumber]>, boolean>]>>;
|
|
86
|
+
name: Type.TOptional<Type.TUnion<[Type.TNull, Type.TString]>>;
|
|
87
|
+
given_name: Type.TOptional<Type.TUnion<[Type.TNull, Type.TString]>>;
|
|
88
|
+
family_name: Type.TOptional<Type.TUnion<[Type.TNull, Type.TString]>>;
|
|
89
|
+
middle_name: Type.TOptional<Type.TUnion<[Type.TNull, Type.TString]>>;
|
|
90
|
+
nickname: Type.TOptional<Type.TUnion<[Type.TNull, Type.TString]>>;
|
|
91
|
+
preferred_username: Type.TOptional<Type.TUnion<[Type.TNull, Type.TString]>>;
|
|
92
|
+
profile: Type.TOptional<Type.TUnion<[Type.TNull, Type.TString]>>;
|
|
93
|
+
picture: Type.TOptional<Type.TUnion<[Type.TNull, Type.TString]>>;
|
|
94
|
+
website: Type.TOptional<Type.TUnion<[Type.TNull, Type.TString]>>;
|
|
95
|
+
gender: Type.TOptional<Type.TUnion<[Type.TNull, Type.TString]>>;
|
|
96
|
+
birthdate: Type.TOptional<Type.TUnion<[Type.TNull, Type.TString]>>;
|
|
97
|
+
zoneinfo: Type.TOptional<Type.TUnion<[Type.TNull, Type.TString]>>;
|
|
98
|
+
locale: Type.TOptional<Type.TUnion<[Type.TNull, Type.TString]>>;
|
|
99
|
+
phone_number: Type.TOptional<Type.TUnion<[Type.TNull, Type.TString]>>;
|
|
100
|
+
phone_number_verified: Type.TOptional<Type.TUnion<[Type.TNull, Type.TCodec<Type.TUnion<[Type.TBoolean, Type.TString, Type.TNumber]>, boolean>]>>;
|
|
101
|
+
address: Type.TOptional<Type.TUnion<[Type.TNull, Type.TObject<{
|
|
102
|
+
formatted: Type.TOptional<Type.TString>;
|
|
103
|
+
street_address: Type.TOptional<Type.TString>;
|
|
104
|
+
locality: Type.TOptional<Type.TString>;
|
|
105
|
+
region: Type.TOptional<Type.TString>;
|
|
106
|
+
postal_code: Type.TOptional<Type.TString>;
|
|
107
|
+
country: Type.TOptional<Type.TString>;
|
|
108
|
+
}>]>>;
|
|
109
|
+
updated_at: Type.TOptional<Type.TUnion<[Type.TNull, Type.TNumber]>>;
|
|
110
|
+
}>;
|
|
111
|
+
type OIDCUser = Static<typeof OIDCUserSchema>;
|
|
112
|
+
declare function parseOIDCUser(value: unknown): OIDCUser;
|
|
113
|
+
declare const OIDCFlowStateSchema: Type.TObject<{
|
|
114
|
+
visitedUrl: Type.TString;
|
|
115
|
+
random: Type.TString;
|
|
116
|
+
nonce: Type.TOptional<Type.TString>;
|
|
117
|
+
}>;
|
|
118
|
+
type OIDCFlowState = Static<typeof OIDCFlowStateSchema>;
|
|
119
|
+
declare function parseOIDCFlowState(value: string): OIDCFlowState;
|
|
120
|
+
type AccessTokenClaims = JWTPayload | IntrospectionResponse | undefined;
|
|
121
|
+
type IdTokenClaims = JWTPayload | IntrospectionResponse | UserInfoResponse | undefined;
|
|
122
|
+
type ValidationResult = {
|
|
123
|
+
user: OIDCUser;
|
|
124
|
+
accessTokenClaims: AccessTokenClaims;
|
|
125
|
+
idTokenClaims: IdTokenClaims;
|
|
126
|
+
};
|
|
127
|
+
declare function mergeTokenClaims(accessTokenClaims: Record<string, unknown> | undefined, idTokenClaims: Record<string, unknown> | undefined, onConflict?: (claim: string) => void): Record<string, unknown>;
|
|
128
|
+
type OidcCoreOptions = {
|
|
129
|
+
issuer: string;
|
|
130
|
+
clientId: string;
|
|
131
|
+
clientSecret?: string;
|
|
132
|
+
expectedAudience?: string | string[];
|
|
133
|
+
authorizedPartyClaims?: readonly string[];
|
|
134
|
+
verifyAudience?: (claims: AudienceClaims, tokenKind: TokenKind) => boolean;
|
|
135
|
+
idTokenOnlyClaims?: readonly string[];
|
|
136
|
+
accessTokenTyp?: string;
|
|
137
|
+
requireIntrospectedTokenType?: boolean;
|
|
138
|
+
introspection?: "opaque-only" | "auto" | "never";
|
|
139
|
+
allowedReturnToOrigins?: readonly string[];
|
|
140
|
+
clockTolerance?: string | number;
|
|
141
|
+
signingAlgorithms?: string[];
|
|
142
|
+
development?: boolean;
|
|
143
|
+
logger?: Logger;
|
|
144
|
+
logLevel?: LogLevel;
|
|
145
|
+
};
|
|
146
|
+
type StartSigninResult = {
|
|
147
|
+
codeVerifier: string;
|
|
148
|
+
authorizationUrl: URL;
|
|
149
|
+
state: string;
|
|
150
|
+
};
|
|
151
|
+
type ResolveSigninResult = {
|
|
152
|
+
tokens: TokenEndpointResponse & TokenEndpointResponseHelpers;
|
|
153
|
+
returnTo: string;
|
|
154
|
+
};
|
|
155
|
+
type SubjectBinding = {
|
|
156
|
+
subject?: string;
|
|
157
|
+
};
|
|
158
|
+
type ProcessTokensInput = SubjectBinding & ({
|
|
159
|
+
access_token: string | null;
|
|
160
|
+
id_token?: string | null;
|
|
161
|
+
refresh_token?: string | null;
|
|
162
|
+
} | {
|
|
163
|
+
access_token?: string | null;
|
|
164
|
+
id_token: string | null;
|
|
165
|
+
refresh_token?: string | null;
|
|
166
|
+
});
|
|
167
|
+
type ProcessTokensResult = ValidationResult & ({
|
|
168
|
+
refreshed: true;
|
|
169
|
+
refreshedTokens: TokenEndpointResponse & TokenEndpointResponseHelpers;
|
|
170
|
+
} | {
|
|
171
|
+
refreshed: false;
|
|
172
|
+
refreshedTokens?: undefined;
|
|
173
|
+
});
|
|
174
|
+
/**
|
|
175
|
+
* A JSON object.
|
|
176
|
+
*/
|
|
177
|
+
type JsonObject = { [Key in string]?: JsonValue; };
|
|
178
|
+
/**
|
|
179
|
+
* A JSON array.
|
|
180
|
+
*/
|
|
181
|
+
type JsonArray = JsonValue[];
|
|
182
|
+
/**
|
|
183
|
+
* A JSON primitive value.
|
|
184
|
+
*/
|
|
185
|
+
type JsonPrimitive = string | number | boolean | null;
|
|
186
|
+
/**
|
|
187
|
+
* Any JSON-compatible value.
|
|
188
|
+
*/
|
|
189
|
+
type JsonValue = JsonPrimitive | JsonObject | JsonArray;
|
|
190
|
+
/**
|
|
191
|
+
* The structured `address` claim in an OpenID Connect UserInfo response.
|
|
192
|
+
*/
|
|
193
|
+
interface UserInfoAddress {
|
|
194
|
+
readonly formatted?: string;
|
|
195
|
+
readonly street_address?: string;
|
|
196
|
+
readonly locality?: string;
|
|
197
|
+
readonly region?: string;
|
|
198
|
+
readonly postal_code?: string;
|
|
199
|
+
readonly country?: string;
|
|
200
|
+
readonly [claim: string]: JsonValue | undefined;
|
|
201
|
+
}
|
|
202
|
+
/**
|
|
203
|
+
* Claims from a parsed OpenID Connect UserInfo response.
|
|
204
|
+
*/
|
|
205
|
+
interface UserInfoResponse$1 {
|
|
206
|
+
readonly sub: string;
|
|
207
|
+
readonly name?: string;
|
|
208
|
+
readonly given_name?: string;
|
|
209
|
+
readonly family_name?: string;
|
|
210
|
+
readonly middle_name?: string;
|
|
211
|
+
readonly nickname?: string;
|
|
212
|
+
readonly preferred_username?: string;
|
|
213
|
+
readonly profile?: string;
|
|
214
|
+
readonly picture?: string;
|
|
215
|
+
readonly website?: string;
|
|
216
|
+
readonly email?: string;
|
|
217
|
+
readonly email_verified?: boolean;
|
|
218
|
+
readonly gender?: string;
|
|
219
|
+
readonly birthdate?: string;
|
|
220
|
+
readonly zoneinfo?: string;
|
|
221
|
+
readonly locale?: string;
|
|
222
|
+
readonly phone_number?: string;
|
|
223
|
+
readonly updated_at?: number;
|
|
224
|
+
readonly address?: UserInfoAddress;
|
|
225
|
+
readonly [claim: string]: JsonValue | undefined;
|
|
226
|
+
}
|
|
227
|
+
declare function resolveDevelopment(development?: boolean): boolean;
|
|
228
|
+
declare const DEFAULT_SIGNING_ALGORITHMS: readonly string[];
|
|
229
|
+
declare function resolveJwksUri(jwksUri: string, development: boolean): URL;
|
|
230
|
+
declare function assertDiscoveredIssuer(configured: string, discovered: string): void;
|
|
231
|
+
declare function assertPkceSupported(methods: string[] | undefined, clientSecret: string | undefined, log: Logger): void;
|
|
232
|
+
declare function resolveClockTolerance(clockTolerance?: string | number): number;
|
|
233
|
+
/**
|
|
234
|
+
* Discovers the issuer and returns the sign-in, validation, refresh and logout functions.
|
|
235
|
+
* @example const oidc = await createOidcCore({ issuer: "https://auth.example.com", clientId: "my-app" });
|
|
236
|
+
*/
|
|
237
|
+
declare function createOidcCore(opts: OidcCoreOptions): Promise<{
|
|
238
|
+
configuration: import("openid-client").Configuration;
|
|
239
|
+
startSignin: ({ redirectUri, returnTo, scope }: {
|
|
240
|
+
redirectUri: string;
|
|
241
|
+
returnTo: string;
|
|
242
|
+
scope?: string;
|
|
243
|
+
}) => Promise<StartSigninResult>;
|
|
244
|
+
resolveSignin: ({ callbackUrl, codeVerifier, expectedState }: {
|
|
245
|
+
callbackUrl: URL;
|
|
246
|
+
codeVerifier: string;
|
|
247
|
+
expectedState: string;
|
|
248
|
+
}) => Promise<ResolveSigninResult>;
|
|
249
|
+
processTokens: (input: ProcessTokensInput) => Promise<ProcessTokensResult>;
|
|
250
|
+
refresh: ({ refreshToken, expectedSubject }: {
|
|
251
|
+
refreshToken: string;
|
|
252
|
+
expectedSubject?: string;
|
|
253
|
+
}) => Promise<RefreshedTokenSet>;
|
|
254
|
+
getLogoutUrl: ({ postLogoutRedirectUri, idTokenHint, state }: {
|
|
255
|
+
postLogoutRedirectUri: string;
|
|
256
|
+
idTokenHint?: string;
|
|
257
|
+
state?: string;
|
|
258
|
+
}) => Promise<URL>;
|
|
259
|
+
fetchUserInfoFromIssuer: ({ accessToken, expectedSubject }: {
|
|
260
|
+
accessToken: string;
|
|
261
|
+
expectedSubject: string;
|
|
262
|
+
}) => Promise<UserInfoResponse$1>;
|
|
263
|
+
}>;
|
|
264
|
+
type OidcCore = Awaited<ReturnType<typeof createOidcCore>>;
|
|
265
|
+
declare class OidcReturnToError extends OidcError {
|
|
266
|
+
readonly returnTo: string;
|
|
267
|
+
constructor(returnTo: string, message: string);
|
|
268
|
+
}
|
|
269
|
+
type ReturnToPolicy = {
|
|
270
|
+
allowedOrigins: readonly string[];
|
|
271
|
+
};
|
|
272
|
+
declare function buildReturnToPolicy(opts: {
|
|
273
|
+
allowedReturnToOrigins?: readonly string[];
|
|
274
|
+
}): ReturnToPolicy;
|
|
275
|
+
declare function assertSafeReturnTo(returnTo: string, policy: ReturnToPolicy): string;
|
|
276
|
+
declare function assertSafeRedirectUri(uri: string, label: string): string;
|
|
277
|
+
declare const DEFAULT_ID_TOKEN_ONLY_CLAIMS: readonly string[];
|
|
278
|
+
declare class OidcTokenTypeError extends OidcTokenError {
|
|
279
|
+
constructor(tokenKind: TokenKind, claim: string, message: string);
|
|
280
|
+
}
|
|
281
|
+
type TokenTypePolicy = {
|
|
282
|
+
idTokenOnlyClaims: readonly string[];
|
|
283
|
+
accessTokenTyp?: string;
|
|
284
|
+
requireIntrospectedTokenType: boolean;
|
|
285
|
+
};
|
|
286
|
+
declare function buildTokenTypePolicy(opts: {
|
|
287
|
+
idTokenOnlyClaims?: readonly string[];
|
|
288
|
+
accessTokenTyp?: string;
|
|
289
|
+
requireIntrospectedTokenType?: boolean;
|
|
290
|
+
}): TokenTypePolicy;
|
|
291
|
+
declare function assertTokenTypeFromClaims(claims: AudienceClaims, tokenKind: TokenKind, policy: TokenTypePolicy): void;
|
|
292
|
+
declare function assertTokenTypeAfterJwtVerify(claims: AudienceClaims, header: {
|
|
293
|
+
typ?: string;
|
|
294
|
+
}, tokenKind: TokenKind, policy: TokenTypePolicy): void;
|
|
295
|
+
declare function assertIntrospectedAccessToken(claims: AudienceClaims, policy: TokenTypePolicy): void;
|
|
296
|
+
declare function assertIntrospectedIdToken(claims: AudienceClaims, policy: TokenTypePolicy): void;
|
|
297
|
+
export { type AccessTokenClaims, type AudienceClaims, type AudiencePolicy, DEFAULT_AUTHORIZED_PARTY_CLAIMS, DEFAULT_ID_TOKEN_ONLY_CLAIMS, DEFAULT_SIGNING_ALGORITHMS, type IdTokenClaims, type LogLevel, type Logger, type OIDCFlowState, type OIDCUser, OidcAudienceError, OidcClaimsError, type OidcCore, type OidcCoreOptions, OidcError, OidcGrantError, OidcInputError, OidcLogoutError, OidcReturnToError, OidcStateError, OidcSubjectError, OidcTokenError, OidcTokenTypeError, OidcTokenValidationError, OidcUserInfoError, type ProcessTokensInput, type ProcessTokensResult, type RefreshedTokenSet, type ResolveSigninResult, type ReturnToPolicy, type StartSigninResult, type TokenKind, type TokenTypePolicy, type TokenValidationFailure, type ValidationResult, assertAudienceAfterJwtVerify, assertAudienceClaim, assertAuthorizedParty, assertDiscoveredIssuer, assertIntrospectedAccessToken, assertIntrospectedIdToken, assertIntrospectedIdTokenAudience, assertPkceSupported, assertSafeRedirectUri, assertSafeReturnTo, assertTokenAudience, assertTokenTypeAfterJwtVerify, assertTokenTypeFromClaims, attachRefreshedTokens, audienceVerifyOption, buildAudiencePolicy, buildLogger, buildReturnToPolicy, buildTokenTypePolicy, createOidcCore, mergeTokenClaims, parseOIDCFlowState, parseOIDCUser, resolveClockTolerance, resolveDevelopment, resolveJwksUri };
|
|
298
|
+
//# sourceMappingURL=index.d.mts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.mts","names":["UserInfoResponse","_$__options0.StartSigninResult","_$__options0.ResolveSigninResult","_$__options0.ProcessTokensInput","_$__options0.ProcessTokensResult","_$__0.RefreshedTokenSet","_$oauth4webapi.UserInfoResponse"],"sources":["../lib/errors.ts","../lib/audience.ts","../lib/logger.ts","../lib/types.ts","../lib/core/options.ts","../node_modules/oauth4webapi/build/index.d.ts","../lib/discovery.ts","../lib/core/index.ts","../lib/returnTo.ts","../lib/tokenType.ts"],"ignoreList":[5],"mappings":"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"}
|