@schemavaults/auth-common 0.22.11 → 0.24.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.
- package/dist/auth_acquire_tokens_grant_types.d.ts +6 -0
- package/dist/auth_acquire_tokens_grant_types.js +4 -0
- package/dist/auth_acquire_tokens_grant_types.js.map +1 -1
- package/dist/index.d.ts +1 -0
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/oauth2/index.d.ts +1 -0
- package/dist/oauth2/index.js +2 -0
- package/dist/oauth2/index.js.map +1 -0
- package/dist/oauth2/is-redirect-uri-in-callback-allowlist.d.ts +15 -0
- package/dist/oauth2/is-redirect-uri-in-callback-allowlist.js +35 -0
- package/dist/oauth2/is-redirect-uri-in-callback-allowlist.js.map +1 -0
- package/dist/oidc/index.d.ts +1 -0
- package/dist/oidc/index.js +1 -0
- package/dist/oidc/index.js.map +1 -1
- package/dist/oidc/sub-claim.d.ts +21 -0
- package/dist/oidc/sub-claim.js +57 -0
- package/dist/oidc/sub-claim.js.map +1 -0
- package/package.json +2 -2
|
@@ -8,6 +8,7 @@ export declare function createAuthorizationCodePOSTBodySchema(z: typeof zod, env
|
|
|
8
8
|
code_verifier: zod.ZodEffects<zod.ZodString, string, string>;
|
|
9
9
|
audience: zod.ZodUnion<[zod.ZodUnion<[zod.ZodEffects<zod.ZodString, string, string>, zod.ZodEffects<zod.ZodEffects<zod.ZodEffects<zod.ZodString, string, string>, string, string>, string, string>]>, zod.ZodArray<zod.ZodUnion<[zod.ZodEffects<zod.ZodString, string, string>, zod.ZodEffects<zod.ZodEffects<zod.ZodEffects<zod.ZodString, string, string>, string, string>, string, string>]>, "many">]>;
|
|
10
10
|
client_app_id: zod.ZodEffects<zod.ZodEffects<zod.ZodString, string, string>, string, string>;
|
|
11
|
+
client_secret: zod.ZodOptional<zod.ZodString>;
|
|
11
12
|
grant_type: zod.ZodLiteral<"authorization_code">;
|
|
12
13
|
redirect_uri: zod.ZodOptional<zod.ZodNullable<zod.ZodString>>;
|
|
13
14
|
}, "strict", zod.ZodTypeAny, {
|
|
@@ -17,6 +18,7 @@ export declare function createAuthorizationCodePOSTBodySchema(z: typeof zod, env
|
|
|
17
18
|
audience: string | string[];
|
|
18
19
|
client_app_id: string;
|
|
19
20
|
grant_type: "authorization_code";
|
|
21
|
+
client_secret?: string | undefined;
|
|
20
22
|
redirect_uri?: string | null | undefined;
|
|
21
23
|
}, {
|
|
22
24
|
code: string;
|
|
@@ -25,21 +27,25 @@ export declare function createAuthorizationCodePOSTBodySchema(z: typeof zod, env
|
|
|
25
27
|
audience: string | string[];
|
|
26
28
|
client_app_id: string;
|
|
27
29
|
grant_type: "authorization_code";
|
|
30
|
+
client_secret?: string | undefined;
|
|
28
31
|
redirect_uri?: string | null | undefined;
|
|
29
32
|
}>;
|
|
30
33
|
export declare function createRefreshTokenPOSTBodySchema(z: typeof zod, environment?: SchemaVaultsAppEnvironment, overrides?: AudienceSchemaOverrides): zod.ZodObject<{
|
|
31
34
|
audience: zod.ZodUnion<[zod.ZodUnion<[zod.ZodEffects<zod.ZodString, string, string>, zod.ZodEffects<zod.ZodEffects<zod.ZodEffects<zod.ZodString, string, string>, string, string>, string, string>]>, zod.ZodArray<zod.ZodUnion<[zod.ZodEffects<zod.ZodString, string, string>, zod.ZodEffects<zod.ZodEffects<zod.ZodEffects<zod.ZodString, string, string>, string, string>, string, string>]>, "many">]>;
|
|
32
35
|
client_app_id: zod.ZodEffects<zod.ZodEffects<zod.ZodString, string, string>, string, string>;
|
|
36
|
+
client_secret: zod.ZodOptional<zod.ZodString>;
|
|
33
37
|
grant_type: zod.ZodLiteral<"refresh_token">;
|
|
34
38
|
replaceRefreshToo: zod.ZodOptional<zod.ZodBoolean>;
|
|
35
39
|
}, "strict", zod.ZodTypeAny, {
|
|
36
40
|
audience: string | string[];
|
|
37
41
|
client_app_id: string;
|
|
38
42
|
grant_type: "refresh_token";
|
|
43
|
+
client_secret?: string | undefined;
|
|
39
44
|
replaceRefreshToo?: boolean | undefined;
|
|
40
45
|
}, {
|
|
41
46
|
audience: string | string[];
|
|
42
47
|
client_app_id: string;
|
|
43
48
|
grant_type: "refresh_token";
|
|
49
|
+
client_secret?: string | undefined;
|
|
44
50
|
replaceRefreshToo?: boolean | undefined;
|
|
45
51
|
}>;
|
|
@@ -16,6 +16,10 @@ function createTokenEndpointBaseSchema(z, environment = getAppEnvironment(), ove
|
|
|
16
16
|
createAudienceListSchema(z, environment, overrides),
|
|
17
17
|
]),
|
|
18
18
|
client_app_id: appIdSchema,
|
|
19
|
+
// OAuth2 client secret (client_secret_post) — required by the token
|
|
20
|
+
// endpoints when the app has a client secret registered
|
|
21
|
+
// (confidential client), and must be omitted otherwise.
|
|
22
|
+
client_secret: z.string().min(1).max(256).optional(),
|
|
19
23
|
});
|
|
20
24
|
}
|
|
21
25
|
export function createAuthorizationCodePOSTBodySchema(z, environment = getAppEnvironment(), overrides) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"auth_acquire_tokens_grant_types.js","sourceRoot":"","sources":["../src/auth_acquire_tokens_grant_types.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,MAAM,QAAQ,CAAC;AAE9C,OAAO,EAEL,wBAAwB,EACxB,oBAAoB,GACrB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EACL,WAAW,EACX,iBAAiB,GAElB,MAAM,+BAA+B,CAAC;AAEvC,MAAM,CAAC,MAAM,WAAW,GAAG;IACzB,oBAAoB;IACpB,eAAe;CACqB,CAAC;AAEvC,SAAS,6BAA6B,CACpC,CAAa,EACb,cAA0C,iBAAiB,EAAE,EAC7D,SAAmC;IAEnC,OAAO,CAAC,CAAC,MAAM,CAAC;QACd,wEAAwE;QACxE,mEAAmE;QACnE,uEAAuE;QACvE,oCAAoC;QACpC,QAAQ,EAAE,CAAC,CAAC,KAAK,CAAC;YAChB,oBAAoB,CAAC,CAAC,EAAE,WAAW,EAAE,SAAS,CAAC;YAC/C,wBAAwB,CAAC,CAAC,EAAE,WAAW,EAAE,SAAS,CAAC;SACpD,CAAC;QACF,aAAa,EAAE,WAAW;
|
|
1
|
+
{"version":3,"file":"auth_acquire_tokens_grant_types.js","sourceRoot":"","sources":["../src/auth_acquire_tokens_grant_types.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,MAAM,QAAQ,CAAC;AAE9C,OAAO,EAEL,wBAAwB,EACxB,oBAAoB,GACrB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EACL,WAAW,EACX,iBAAiB,GAElB,MAAM,+BAA+B,CAAC;AAEvC,MAAM,CAAC,MAAM,WAAW,GAAG;IACzB,oBAAoB;IACpB,eAAe;CACqB,CAAC;AAEvC,SAAS,6BAA6B,CACpC,CAAa,EACb,cAA0C,iBAAiB,EAAE,EAC7D,SAAmC;IAEnC,OAAO,CAAC,CAAC,MAAM,CAAC;QACd,wEAAwE;QACxE,mEAAmE;QACnE,uEAAuE;QACvE,oCAAoC;QACpC,QAAQ,EAAE,CAAC,CAAC,KAAK,CAAC;YAChB,oBAAoB,CAAC,CAAC,EAAE,WAAW,EAAE,SAAS,CAAC;YAC/C,wBAAwB,CAAC,CAAC,EAAE,WAAW,EAAE,SAAS,CAAC;SACpD,CAAC;QACF,aAAa,EAAE,WAAW;QAC1B,oEAAoE;QACpE,wDAAwD;QACxD,wDAAwD;QACxD,aAAa,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE;KACrD,CAAC,CAAC;AACL,CAAC;AAED,MAAM,UAAU,qCAAqC,CACnD,CAAa,EACb,cAA0C,iBAAiB,EAAE,EAC7D,SAAmC;IAEnC,OAAO,6BAA6B,CAAC,CAAC,EAAE,WAAW,EAAE,SAAS,CAAC;SAC5D,MAAM,CAAC;QACN,UAAU,EAAE,CAAC,CAAC,OAAO,CAAC,oBAAoB,CAAC;QAC3C,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,SAAS,EAAE;QAC9C,aAAa,EAAE,oBAAoB,CAAC,mBAAmB;QACvD,cAAc,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,WAAW,EAAE;QACxC,8DAA8D;QAC9D,mEAAmE;QACnE,iEAAiE;QACjE,6DAA6D;QAC7D,+DAA+D;QAC/D,kEAAkE;QAClE,qCAAqC;QACrC,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,EAAE;KACrD,CAAC;SACD,QAAQ,CAAC;QACR,UAAU,EAAE,IAAI;QAChB,QAAQ,EAAE,IAAI;QACd,aAAa,EAAE,IAAI;QACnB,IAAI,EAAE,IAAI;QACV,aAAa,EAAE,IAAI;QACnB,cAAc,EAAE,IAAI;KACrB,CAAC;SACD,MAAM,EAAE,CAAC;AACd,CAAC;AAED,MAAM,UAAU,gCAAgC,CAC9C,CAAa,EACb,cAA0C,iBAAiB,EAAE,EAC7D,SAAmC;IAEnC,OAAO,6BAA6B,CAAC,CAAC,EAAE,WAAW,EAAE,SAAS,CAAC;SAC5D,MAAM,CAAC;QACN,UAAU,EAAE,CAAC,CAAC,OAAO,CAAC,eAAe,CAAC;QACtC,mEAAmE;QACnE,gEAAgE;QAChE,oEAAoE;QACpE,uBAAuB;QACvB,iBAAiB,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE;KAC1C,CAAC;SACD,QAAQ,CAAC;QACR,UAAU,EAAE,IAAI;QAChB,QAAQ,EAAE,IAAI;QACd,aAAa,EAAE,IAAI;KACpB,CAAC;SACD,MAAM,EAAE,CAAC;AACd,CAAC"}
|
package/dist/index.d.ts
CHANGED
|
@@ -37,6 +37,7 @@ export type { PaginationOptions } from "./pagination";
|
|
|
37
37
|
export { timingSafeStringEqual } from "./timing-safe-string-equal";
|
|
38
38
|
export { sanitizeNextHref, MAX_NEXT_HREF_LENGTH, } from "./sanitize-next-href";
|
|
39
39
|
export { isOriginInAllowedList } from "./cors";
|
|
40
|
+
export { isRedirectUriInCallbackAllowlist } from "./oauth2";
|
|
40
41
|
export { oauth2StateSchema, OAUTH2_STATE_VSCHAR_REGEX, parseOAuth2State, OAuth2StateValidationError, } from "./oauth2-state-schema";
|
|
41
42
|
export type { OAuth2State } from "./oauth2-state-schema";
|
|
42
43
|
export { createAuthorizationCodePOSTBodySchema, createRefreshTokenPOSTBodySchema, } from "./auth_acquire_tokens_grant_types";
|
package/dist/index.js
CHANGED
|
@@ -26,6 +26,7 @@ export { paginationOptionsSchema, DEFAULT_PAGINATION_PAGE_INDEX, DEFAULT_PAGINAT
|
|
|
26
26
|
export { timingSafeStringEqual } from "./timing-safe-string-equal";
|
|
27
27
|
export { sanitizeNextHref, MAX_NEXT_HREF_LENGTH, } from "./sanitize-next-href";
|
|
28
28
|
export { isOriginInAllowedList } from "./cors";
|
|
29
|
+
export { isRedirectUriInCallbackAllowlist } from "./oauth2";
|
|
29
30
|
export { oauth2StateSchema, OAUTH2_STATE_VSCHAR_REGEX, parseOAuth2State, OAuth2StateValidationError, } from "./oauth2-state-schema";
|
|
30
31
|
export { createAuthorizationCodePOSTBodySchema, createRefreshTokenPOSTBodySchema, } from "./auth_acquire_tokens_grant_types";
|
|
31
32
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,qBAAqB,EACrB,cAAc,GACf,MAAM,8BAA8B,CAAC;AAGtC,OAAO,EACL,mCAAmC,EACnC,qCAAqC,GACtC,MAAM,gCAAgC,CAAC;AAExC,OAAO,EAAE,cAAc,EAAiB,MAAM,aAAa,CAAC;AAE5D,cAAc,eAAe,CAAC;AAG9B,mBAAmB;AACnB,cAAc,cAAc,CAAC;AAM7B,cAAc,cAAc,CAAC;AAG7B,cAAc,QAAQ,CAAC;AAGvB,cAAc,QAAQ,CAAC;AAGvB,OAAO,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AAEnD,OAAO,EACL,wBAAwB,EACxB,qCAAqC,EACrC,mCAAmC,EACnC,+BAA+B,EAC/B,wCAAwC,EACxC,wBAAwB,EACxB,uBAAuB,GAOxB,MAAM,uBAAuB,CAAC;AAE/B,cAAc,OAAO,CAAC;AACtB,OAAO,EACL,+BAA+B,EAE/B,6CAA6C,GAE9C,MAAM,yBAAyB,CAAC;AAEjC,cAAc,mCAAmC,CAAC;AAGlD,OAAO,EAAE,gBAAgB,EAAE,MAAM,+BAA+B,CAAC;AACjE,OAAO,EAAE,WAAW,EAAE,MAAM,+BAA+B,CAAC;AAE5D,OAAO,EACL,oBAAoB,EACpB,wBAAwB,GACzB,MAAM,mBAAmB,CAAC;AAG3B,OAAO,EACL,sBAAsB,EACtB,0BAA0B,GAC3B,MAAM,eAAe,CAAC;AAGvB,OAAO,EACL,oBAAoB,EACpB,qBAAqB,EACrB,yBAAyB,EACzB,4BAA4B,EAC5B,gBAAgB,EAChB,gCAAgC,EAChC,yCAAyC,EACzC,kCAAkC,EAClC,2CAA2C,EAC3C,0BAA0B,EAC1B,8BAA8B,EAC9B,8BAA8B,EAC9B,sBAAsB,EACtB,sBAAsB,EACtB,iCAAiC,EACjC,kCAAkC,EAClC,4BAA4B,EAC5B,+BAA+B,EAC/B,oCAAoC,EACpC,qCAAqC,EACrC,uCAAuC,EACvC,wCAAwC,GACzC,MAAM,iBAAiB,CAAC;AAezB,OAAO,EAAE,wBAAwB,EAAE,MAAM,4BAA4B,CAAC;AAEtE,OAAO,EACL,sBAAsB,EACtB,4BAA4B,GAC7B,MAAM,2BAA2B,CAAC;AAEnC,OAAO,EACL,qBAAqB,EACrB,2BAA2B,GAC5B,MAAM,0BAA0B,CAAC;AAElC,OAAO,EAAE,wCAAwC,EAAE,MAAM,4CAA4C,CAAC;AAEtG,OAAO,EAAE,kCAAkC,EAAE,MAAM,0CAA0C,CAAC;AAE9F,OAAO,EACL,uBAAuB,EACvB,6BAA6B,EAC7B,4BAA4B,EAC5B,wBAAwB,GACzB,MAAM,cAAc,CAAC;AAGtB,OAAO,EAAE,qBAAqB,EAAE,MAAM,4BAA4B,CAAC;AAEnE,OAAO,EACL,gBAAgB,EAChB,oBAAoB,GACrB,MAAM,sBAAsB,CAAC;AAE9B,OAAO,EAAE,qBAAqB,EAAE,MAAM,QAAQ,CAAC;AAE/C,OAAO,EACL,iBAAiB,EACjB,yBAAyB,EACzB,gBAAgB,EAChB,0BAA0B,GAC3B,MAAM,uBAAuB,CAAC;AAG/B,OAAO,EACL,qCAAqC,EACrC,gCAAgC,GACjC,MAAM,mCAAmC,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,qBAAqB,EACrB,cAAc,GACf,MAAM,8BAA8B,CAAC;AAGtC,OAAO,EACL,mCAAmC,EACnC,qCAAqC,GACtC,MAAM,gCAAgC,CAAC;AAExC,OAAO,EAAE,cAAc,EAAiB,MAAM,aAAa,CAAC;AAE5D,cAAc,eAAe,CAAC;AAG9B,mBAAmB;AACnB,cAAc,cAAc,CAAC;AAM7B,cAAc,cAAc,CAAC;AAG7B,cAAc,QAAQ,CAAC;AAGvB,cAAc,QAAQ,CAAC;AAGvB,OAAO,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AAEnD,OAAO,EACL,wBAAwB,EACxB,qCAAqC,EACrC,mCAAmC,EACnC,+BAA+B,EAC/B,wCAAwC,EACxC,wBAAwB,EACxB,uBAAuB,GAOxB,MAAM,uBAAuB,CAAC;AAE/B,cAAc,OAAO,CAAC;AACtB,OAAO,EACL,+BAA+B,EAE/B,6CAA6C,GAE9C,MAAM,yBAAyB,CAAC;AAEjC,cAAc,mCAAmC,CAAC;AAGlD,OAAO,EAAE,gBAAgB,EAAE,MAAM,+BAA+B,CAAC;AACjE,OAAO,EAAE,WAAW,EAAE,MAAM,+BAA+B,CAAC;AAE5D,OAAO,EACL,oBAAoB,EACpB,wBAAwB,GACzB,MAAM,mBAAmB,CAAC;AAG3B,OAAO,EACL,sBAAsB,EACtB,0BAA0B,GAC3B,MAAM,eAAe,CAAC;AAGvB,OAAO,EACL,oBAAoB,EACpB,qBAAqB,EACrB,yBAAyB,EACzB,4BAA4B,EAC5B,gBAAgB,EAChB,gCAAgC,EAChC,yCAAyC,EACzC,kCAAkC,EAClC,2CAA2C,EAC3C,0BAA0B,EAC1B,8BAA8B,EAC9B,8BAA8B,EAC9B,sBAAsB,EACtB,sBAAsB,EACtB,iCAAiC,EACjC,kCAAkC,EAClC,4BAA4B,EAC5B,+BAA+B,EAC/B,oCAAoC,EACpC,qCAAqC,EACrC,uCAAuC,EACvC,wCAAwC,GACzC,MAAM,iBAAiB,CAAC;AAezB,OAAO,EAAE,wBAAwB,EAAE,MAAM,4BAA4B,CAAC;AAEtE,OAAO,EACL,sBAAsB,EACtB,4BAA4B,GAC7B,MAAM,2BAA2B,CAAC;AAEnC,OAAO,EACL,qBAAqB,EACrB,2BAA2B,GAC5B,MAAM,0BAA0B,CAAC;AAElC,OAAO,EAAE,wCAAwC,EAAE,MAAM,4CAA4C,CAAC;AAEtG,OAAO,EAAE,kCAAkC,EAAE,MAAM,0CAA0C,CAAC;AAE9F,OAAO,EACL,uBAAuB,EACvB,6BAA6B,EAC7B,4BAA4B,EAC5B,wBAAwB,GACzB,MAAM,cAAc,CAAC;AAGtB,OAAO,EAAE,qBAAqB,EAAE,MAAM,4BAA4B,CAAC;AAEnE,OAAO,EACL,gBAAgB,EAChB,oBAAoB,GACrB,MAAM,sBAAsB,CAAC;AAE9B,OAAO,EAAE,qBAAqB,EAAE,MAAM,QAAQ,CAAC;AAE/C,OAAO,EAAE,gCAAgC,EAAE,MAAM,UAAU,CAAC;AAE5D,OAAO,EACL,iBAAiB,EACjB,yBAAyB,EACzB,gBAAgB,EAChB,0BAA0B,GAC3B,MAAM,uBAAuB,CAAC;AAG/B,OAAO,EACL,qCAAqC,EACrC,gCAAgC,GACjC,MAAM,mCAAmC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { isRedirectUriInCallbackAllowlist } from "./is-redirect-uri-in-callback-allowlist";
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/oauth2/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gCAAgC,EAAE,MAAM,yCAAyC,CAAC"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Exact-match check of an OAuth2/OIDC `redirect_uri` against an app's
|
|
3
|
+
* explicit callback-URL allowlist (RFC 6749 §3.1.2.3 simple string
|
|
4
|
+
* comparison).
|
|
5
|
+
*
|
|
6
|
+
* Both sides are parsed with `new URL()` and compared by serialized
|
|
7
|
+
* href, which makes the comparison robust to purely-cosmetic encoding
|
|
8
|
+
* differences (default ports, host casing, the mandatory trailing
|
|
9
|
+
* slash on a bare origin) while still requiring the path, query, and
|
|
10
|
+
* fragment-absence to match byte-for-byte.
|
|
11
|
+
*
|
|
12
|
+
* An unparseable value on either side never matches.
|
|
13
|
+
*/
|
|
14
|
+
export declare function isRedirectUriInCallbackAllowlist(redirect_uri: string, allowedCallbackUrls: readonly string[]): boolean;
|
|
15
|
+
export default isRedirectUriInCallbackAllowlist;
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Exact-match check of an OAuth2/OIDC `redirect_uri` against an app's
|
|
3
|
+
* explicit callback-URL allowlist (RFC 6749 §3.1.2.3 simple string
|
|
4
|
+
* comparison).
|
|
5
|
+
*
|
|
6
|
+
* Both sides are parsed with `new URL()` and compared by serialized
|
|
7
|
+
* href, which makes the comparison robust to purely-cosmetic encoding
|
|
8
|
+
* differences (default ports, host casing, the mandatory trailing
|
|
9
|
+
* slash on a bare origin) while still requiring the path, query, and
|
|
10
|
+
* fragment-absence to match byte-for-byte.
|
|
11
|
+
*
|
|
12
|
+
* An unparseable value on either side never matches.
|
|
13
|
+
*/
|
|
14
|
+
export function isRedirectUriInCallbackAllowlist(redirect_uri, allowedCallbackUrls) {
|
|
15
|
+
if (typeof redirect_uri !== "string" || redirect_uri.length === 0) {
|
|
16
|
+
return false;
|
|
17
|
+
}
|
|
18
|
+
let presented;
|
|
19
|
+
try {
|
|
20
|
+
presented = new URL(redirect_uri);
|
|
21
|
+
}
|
|
22
|
+
catch {
|
|
23
|
+
return false;
|
|
24
|
+
}
|
|
25
|
+
return allowedCallbackUrls.some((allowed) => {
|
|
26
|
+
try {
|
|
27
|
+
return new URL(allowed).href === presented.href;
|
|
28
|
+
}
|
|
29
|
+
catch {
|
|
30
|
+
return false;
|
|
31
|
+
}
|
|
32
|
+
});
|
|
33
|
+
}
|
|
34
|
+
export default isRedirectUriInCallbackAllowlist;
|
|
35
|
+
//# sourceMappingURL=is-redirect-uri-in-callback-allowlist.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"is-redirect-uri-in-callback-allowlist.js","sourceRoot":"","sources":["../../src/oauth2/is-redirect-uri-in-callback-allowlist.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AACH,MAAM,UAAU,gCAAgC,CAC9C,YAAoB,EACpB,mBAAsC;IAEtC,IAAI,OAAO,YAAY,KAAK,QAAQ,IAAI,YAAY,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAClE,OAAO,KAAK,CAAC;IACf,CAAC;IAED,IAAI,SAAc,CAAC;IACnB,IAAI,CAAC;QACH,SAAS,GAAG,IAAI,GAAG,CAAC,YAAY,CAAC,CAAC;IACpC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;IAED,OAAO,mBAAmB,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE;QAC1C,IAAI,CAAC;YACH,OAAO,IAAI,GAAG,CAAC,OAAO,CAAC,CAAC,IAAI,KAAK,SAAS,CAAC,IAAI,CAAC;QAClD,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,KAAK,CAAC;QACf,CAAC;IACH,CAAC,CAAC,CAAC;AACL,CAAC;AAED,eAAe,gCAAgC,CAAC"}
|
package/dist/oidc/index.d.ts
CHANGED
|
@@ -2,3 +2,4 @@ export { OIDC_OPENID_SCOPE, OIDC_SUPPORTED_SCOPES, DEFAULT_AUTH_SCOPE, OIDC_SCOP
|
|
|
2
2
|
export type { OidcSupportedScope, OidcScope, ParsedOidcScopes, } from "./scope";
|
|
3
3
|
export { oidcNonceSchema, OIDC_NONCE_VSCHAR_REGEX, parseOidcNonce, OidcNonceValidationError, } from "./nonce";
|
|
4
4
|
export type { OidcNonce } from "./nonce";
|
|
5
|
+
export { OIDC_SUB_CLAIM_DELIMITER, formatOidcSubClaim, parseOidcSubClaim, } from "./sub-claim";
|
package/dist/oidc/index.js
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
1
|
export { OIDC_OPENID_SCOPE, OIDC_SUPPORTED_SCOPES, DEFAULT_AUTH_SCOPE, OIDC_SCOPE_REGEX, oidcScopeSchema, parseAndGrantScopes, serializeOidcScopes, } from "./scope";
|
|
2
2
|
export { oidcNonceSchema, OIDC_NONCE_VSCHAR_REGEX, parseOidcNonce, OidcNonceValidationError, } from "./nonce";
|
|
3
|
+
export { OIDC_SUB_CLAIM_DELIMITER, formatOidcSubClaim, parseOidcSubClaim, } from "./sub-claim";
|
|
3
4
|
//# sourceMappingURL=index.js.map
|
package/dist/oidc/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/oidc/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,iBAAiB,EACjB,qBAAqB,EACrB,kBAAkB,EAClB,gBAAgB,EAChB,eAAe,EACf,mBAAmB,EACnB,mBAAmB,GACpB,MAAM,SAAS,CAAC;AAOjB,OAAO,EACL,eAAe,EACf,uBAAuB,EACvB,cAAc,EACd,wBAAwB,GACzB,MAAM,SAAS,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/oidc/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,iBAAiB,EACjB,qBAAqB,EACrB,kBAAkB,EAClB,gBAAgB,EAChB,eAAe,EACf,mBAAmB,EACnB,mBAAmB,GACpB,MAAM,SAAS,CAAC;AAOjB,OAAO,EACL,eAAe,EACf,uBAAuB,EACvB,cAAc,EACd,wBAAwB,GACzB,MAAM,SAAS,CAAC;AAGjB,OAAO,EACL,wBAAwB,EACxB,kBAAkB,EAClB,iBAAiB,GAClB,MAAM,aAAa,CAAC"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { type AppId } from "@schemavaults/app-definitions";
|
|
2
|
+
export declare const OIDC_SUB_CLAIM_DELIMITER: "|";
|
|
3
|
+
/**
|
|
4
|
+
* Builds the OIDC-facing `sub` claim for a platform user:
|
|
5
|
+
* `<auth_server_app_id>|<uid>`. The auth server app id is stable per
|
|
6
|
+
* deployment, so the resulting subject is stable for the lifetime of
|
|
7
|
+
* the user (OIDC Core §2: `sub` must be locally unique and never
|
|
8
|
+
* reassigned within the issuer).
|
|
9
|
+
*/
|
|
10
|
+
export declare function formatOidcSubClaim(auth_server_app_id: AppId | string, uid: string): string;
|
|
11
|
+
/**
|
|
12
|
+
* Splits an OIDC-facing `sub` claim back into the issuing deployment's
|
|
13
|
+
* app id and the platform user id. Returns `null` for values not in the
|
|
14
|
+
* `<app_id>|<uid>` shape (e.g. subjects issued by other providers).
|
|
15
|
+
* Only the FIRST delimiter splits — the uid keeps any later characters
|
|
16
|
+
* verbatim.
|
|
17
|
+
*/
|
|
18
|
+
export declare function parseOidcSubClaim(sub: string): {
|
|
19
|
+
auth_server_app_id: AppId;
|
|
20
|
+
uid: string;
|
|
21
|
+
} | null;
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import { appIdSchema } from "@schemavaults/app-definitions";
|
|
2
|
+
// The OIDC-facing `sub` claim namespaces the platform user id with the
|
|
3
|
+
// deployment's own app id (SCHEMAVAULTS_AUTH_SERVER_APP_ID), Auth0-style:
|
|
4
|
+
// `<auth_server_app_id>|<uid>` (e.g. "schemavaults-auth|4f7c…"). The
|
|
5
|
+
// prefix marks which auth deployment a subject came from, so RPs that
|
|
6
|
+
// aggregate identities from several issuers / white-label deployments
|
|
7
|
+
// can't collide or confuse them. It applies ONLY at the OIDC boundary —
|
|
8
|
+
// the id_token, /api/oidc/userinfo, and RFC 7662 introspection, which
|
|
9
|
+
// OIDC Core §5.3.2 requires to agree exactly — never inside the
|
|
10
|
+
// platform's own encrypted access/refresh token payloads, whose
|
|
11
|
+
// `sub === uid` invariant (payload_data.ts) resource servers rely on.
|
|
12
|
+
// The app id charset ([a-z0-9_-]) can never contain the delimiter, so
|
|
13
|
+
// the encoding is unambiguous.
|
|
14
|
+
export const OIDC_SUB_CLAIM_DELIMITER = "|";
|
|
15
|
+
/**
|
|
16
|
+
* Builds the OIDC-facing `sub` claim for a platform user:
|
|
17
|
+
* `<auth_server_app_id>|<uid>`. The auth server app id is stable per
|
|
18
|
+
* deployment, so the resulting subject is stable for the lifetime of
|
|
19
|
+
* the user (OIDC Core §2: `sub` must be locally unique and never
|
|
20
|
+
* reassigned within the issuer).
|
|
21
|
+
*/
|
|
22
|
+
export function formatOidcSubClaim(auth_server_app_id, uid) {
|
|
23
|
+
const app_id = appIdSchema.safeParse(auth_server_app_id);
|
|
24
|
+
if (!app_id.success) {
|
|
25
|
+
throw new TypeError("Invalid auth server app id for OIDC 'sub' claim prefix!", { cause: app_id.error });
|
|
26
|
+
}
|
|
27
|
+
if (typeof uid !== "string" || uid.length === 0) {
|
|
28
|
+
throw new TypeError("A user id is required to build an OIDC 'sub' claim!");
|
|
29
|
+
}
|
|
30
|
+
return `${app_id.data}${OIDC_SUB_CLAIM_DELIMITER}${uid}`;
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Splits an OIDC-facing `sub` claim back into the issuing deployment's
|
|
34
|
+
* app id and the platform user id. Returns `null` for values not in the
|
|
35
|
+
* `<app_id>|<uid>` shape (e.g. subjects issued by other providers).
|
|
36
|
+
* Only the FIRST delimiter splits — the uid keeps any later characters
|
|
37
|
+
* verbatim.
|
|
38
|
+
*/
|
|
39
|
+
export function parseOidcSubClaim(sub) {
|
|
40
|
+
if (typeof sub !== "string") {
|
|
41
|
+
return null;
|
|
42
|
+
}
|
|
43
|
+
const delimiter_index = sub.indexOf(OIDC_SUB_CLAIM_DELIMITER);
|
|
44
|
+
if (delimiter_index <= 0) {
|
|
45
|
+
return null;
|
|
46
|
+
}
|
|
47
|
+
const app_id = appIdSchema.safeParse(sub.slice(0, delimiter_index));
|
|
48
|
+
if (!app_id.success) {
|
|
49
|
+
return null;
|
|
50
|
+
}
|
|
51
|
+
const uid = sub.slice(delimiter_index + OIDC_SUB_CLAIM_DELIMITER.length);
|
|
52
|
+
if (uid.length === 0) {
|
|
53
|
+
return null;
|
|
54
|
+
}
|
|
55
|
+
return { auth_server_app_id: app_id.data, uid };
|
|
56
|
+
}
|
|
57
|
+
//# sourceMappingURL=sub-claim.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sub-claim.js","sourceRoot":"","sources":["../../src/oidc/sub-claim.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAc,MAAM,+BAA+B,CAAC;AAExE,uEAAuE;AACvE,0EAA0E;AAC1E,qEAAqE;AACrE,sEAAsE;AACtE,sEAAsE;AACtE,wEAAwE;AACxE,sEAAsE;AACtE,gEAAgE;AAChE,gEAAgE;AAChE,sEAAsE;AACtE,sEAAsE;AACtE,+BAA+B;AAE/B,MAAM,CAAC,MAAM,wBAAwB,GAAG,GAAY,CAAC;AAErD;;;;;;GAMG;AACH,MAAM,UAAU,kBAAkB,CAChC,kBAAkC,EAClC,GAAW;IAEX,MAAM,MAAM,GAAG,WAAW,CAAC,SAAS,CAAC,kBAAkB,CAAC,CAAC;IACzD,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;QACpB,MAAM,IAAI,SAAS,CACjB,yDAAyD,EACzD,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,EAAE,CACxB,CAAC;IACJ,CAAC;IACD,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,GAAG,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAChD,MAAM,IAAI,SAAS,CAAC,qDAAqD,CAAC,CAAC;IAC7E,CAAC;IACD,OAAO,GAAG,MAAM,CAAC,IAAI,GAAG,wBAAwB,GAAG,GAAG,EAAE,CAAC;AAC3D,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,iBAAiB,CAC/B,GAAW;IAEX,IAAI,OAAO,GAAG,KAAK,QAAQ,EAAE,CAAC;QAC5B,OAAO,IAAI,CAAC;IACd,CAAC;IACD,MAAM,eAAe,GAAG,GAAG,CAAC,OAAO,CAAC,wBAAwB,CAAC,CAAC;IAC9D,IAAI,eAAe,IAAI,CAAC,EAAE,CAAC;QACzB,OAAO,IAAI,CAAC;IACd,CAAC;IACD,MAAM,MAAM,GAAG,WAAW,CAAC,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,eAAe,CAAC,CAAC,CAAC;IACpE,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;QACpB,OAAO,IAAI,CAAC;IACd,CAAC;IACD,MAAM,GAAG,GAAG,GAAG,CAAC,KAAK,CAAC,eAAe,GAAG,wBAAwB,CAAC,MAAM,CAAC,CAAC;IACzE,IAAI,GAAG,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACrB,OAAO,IAAI,CAAC;IACd,CAAC;IACD,OAAO,EAAE,kBAAkB,EAAE,MAAM,CAAC,IAAI,EAAE,GAAG,EAAE,CAAC;AAClD,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@schemavaults/auth-common",
|
|
3
3
|
"description": "Types and utility functions for authentication and authorization",
|
|
4
|
-
"version": "0.
|
|
4
|
+
"version": "0.24.0",
|
|
5
5
|
"license": "UNLICENSED",
|
|
6
6
|
"private": false,
|
|
7
7
|
"repository": {
|
|
@@ -14,7 +14,7 @@
|
|
|
14
14
|
"types": "dist/index.d.ts",
|
|
15
15
|
"dependencies": {
|
|
16
16
|
"zod": "3.25.8",
|
|
17
|
-
"@schemavaults/app-definitions": "0.
|
|
17
|
+
"@schemavaults/app-definitions": "0.12.0",
|
|
18
18
|
"crypto-js": "4.2.0"
|
|
19
19
|
},
|
|
20
20
|
"scripts": {
|