auth.js 9.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224
  1. "use strict";
  2. var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
  3. if (k2 === undefined) k2 = k;
  4. var desc = Object.getOwnPropertyDescriptor(m, k);
  5. if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
  6. desc = { enumerable: true, get: function() { return m[k]; } };
  7. }
  8. Object.defineProperty(o, k2, desc);
  9. }) : (function(o, m, k, k2) {
  10. if (k2 === undefined) k2 = k;
  11. o[k2] = m[k];
  12. }));
  13. var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
  14. Object.defineProperty(o, "default", { enumerable: true, value: v });
  15. }) : function(o, v) {
  16. o["default"] = v;
  17. });
  18. var __importStar = (this && this.__importStar) || function (mod) {
  19. if (mod && mod.__esModule) return mod;
  20. var result = {};
  21. if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
  22. __setModuleDefault(result, mod);
  23. return result;
  24. };
  25. Object.defineProperty(exports, "__esModule", { value: true });
  26. exports.OAuthTokenRevocationRequestSchema = exports.OAuthClientRegistrationErrorSchema = exports.OAuthClientInformationFullSchema = exports.OAuthClientInformationSchema = exports.OAuthClientMetadataSchema = exports.OptionalSafeUrlSchema = exports.OAuthErrorResponseSchema = exports.OAuthTokensSchema = exports.OpenIdProviderDiscoveryMetadataSchema = exports.OpenIdProviderMetadataSchema = exports.OAuthMetadataSchema = exports.OAuthProtectedResourceMetadataSchema = exports.SafeUrlSchema = void 0;
  27. const z = __importStar(require("zod/v4"));
  28. /**
  29. * Reusable URL validation that disallows javascript: scheme
  30. */
  31. exports.SafeUrlSchema = z
  32. .url()
  33. .superRefine((val, ctx) => {
  34. if (!URL.canParse(val)) {
  35. ctx.addIssue({
  36. code: z.ZodIssueCode.custom,
  37. message: 'URL must be parseable',
  38. fatal: true
  39. });
  40. return z.NEVER;
  41. }
  42. })
  43. .refine(url => {
  44. const u = new URL(url);
  45. return u.protocol !== 'javascript:' && u.protocol !== 'data:' && u.protocol !== 'vbscript:';
  46. }, { message: 'URL cannot use javascript:, data:, or vbscript: scheme' });
  47. /**
  48. * RFC 9728 OAuth Protected Resource Metadata
  49. */
  50. exports.OAuthProtectedResourceMetadataSchema = z.looseObject({
  51. resource: z.string().url(),
  52. authorization_servers: z.array(exports.SafeUrlSchema).optional(),
  53. jwks_uri: z.string().url().optional(),
  54. scopes_supported: z.array(z.string()).optional(),
  55. bearer_methods_supported: z.array(z.string()).optional(),
  56. resource_signing_alg_values_supported: z.array(z.string()).optional(),
  57. resource_name: z.string().optional(),
  58. resource_documentation: z.string().optional(),
  59. resource_policy_uri: z.string().url().optional(),
  60. resource_tos_uri: z.string().url().optional(),
  61. tls_client_certificate_bound_access_tokens: z.boolean().optional(),
  62. authorization_details_types_supported: z.array(z.string()).optional(),
  63. dpop_signing_alg_values_supported: z.array(z.string()).optional(),
  64. dpop_bound_access_tokens_required: z.boolean().optional()
  65. });
  66. /**
  67. * RFC 8414 OAuth 2.0 Authorization Server Metadata
  68. */
  69. exports.OAuthMetadataSchema = z.looseObject({
  70. issuer: z.string(),
  71. authorization_endpoint: exports.SafeUrlSchema,
  72. token_endpoint: exports.SafeUrlSchema,
  73. registration_endpoint: exports.SafeUrlSchema.optional(),
  74. scopes_supported: z.array(z.string()).optional(),
  75. response_types_supported: z.array(z.string()),
  76. response_modes_supported: z.array(z.string()).optional(),
  77. grant_types_supported: z.array(z.string()).optional(),
  78. token_endpoint_auth_methods_supported: z.array(z.string()).optional(),
  79. token_endpoint_auth_signing_alg_values_supported: z.array(z.string()).optional(),
  80. service_documentation: exports.SafeUrlSchema.optional(),
  81. revocation_endpoint: exports.SafeUrlSchema.optional(),
  82. revocation_endpoint_auth_methods_supported: z.array(z.string()).optional(),
  83. revocation_endpoint_auth_signing_alg_values_supported: z.array(z.string()).optional(),
  84. introspection_endpoint: z.string().optional(),
  85. introspection_endpoint_auth_methods_supported: z.array(z.string()).optional(),
  86. introspection_endpoint_auth_signing_alg_values_supported: z.array(z.string()).optional(),
  87. code_challenge_methods_supported: z.array(z.string()).optional(),
  88. client_id_metadata_document_supported: z.boolean().optional()
  89. });
  90. /**
  91. * OpenID Connect Discovery 1.0 Provider Metadata
  92. * see: https://openid.net/specs/openid-connect-discovery-1_0.html#ProviderMetadata
  93. */
  94. exports.OpenIdProviderMetadataSchema = z.looseObject({
  95. issuer: z.string(),
  96. authorization_endpoint: exports.SafeUrlSchema,
  97. token_endpoint: exports.SafeUrlSchema,
  98. userinfo_endpoint: exports.SafeUrlSchema.optional(),
  99. jwks_uri: exports.SafeUrlSchema,
  100. registration_endpoint: exports.SafeUrlSchema.optional(),
  101. scopes_supported: z.array(z.string()).optional(),
  102. response_types_supported: z.array(z.string()),
  103. response_modes_supported: z.array(z.string()).optional(),
  104. grant_types_supported: z.array(z.string()).optional(),
  105. acr_values_supported: z.array(z.string()).optional(),
  106. subject_types_supported: z.array(z.string()),
  107. id_token_signing_alg_values_supported: z.array(z.string()),
  108. id_token_encryption_alg_values_supported: z.array(z.string()).optional(),
  109. id_token_encryption_enc_values_supported: z.array(z.string()).optional(),
  110. userinfo_signing_alg_values_supported: z.array(z.string()).optional(),
  111. userinfo_encryption_alg_values_supported: z.array(z.string()).optional(),
  112. userinfo_encryption_enc_values_supported: z.array(z.string()).optional(),
  113. request_object_signing_alg_values_supported: z.array(z.string()).optional(),
  114. request_object_encryption_alg_values_supported: z.array(z.string()).optional(),
  115. request_object_encryption_enc_values_supported: z.array(z.string()).optional(),
  116. token_endpoint_auth_methods_supported: z.array(z.string()).optional(),
  117. token_endpoint_auth_signing_alg_values_supported: z.array(z.string()).optional(),
  118. display_values_supported: z.array(z.string()).optional(),
  119. claim_types_supported: z.array(z.string()).optional(),
  120. claims_supported: z.array(z.string()).optional(),
  121. service_documentation: z.string().optional(),
  122. claims_locales_supported: z.array(z.string()).optional(),
  123. ui_locales_supported: z.array(z.string()).optional(),
  124. claims_parameter_supported: z.boolean().optional(),
  125. request_parameter_supported: z.boolean().optional(),
  126. request_uri_parameter_supported: z.boolean().optional(),
  127. require_request_uri_registration: z.boolean().optional(),
  128. op_policy_uri: exports.SafeUrlSchema.optional(),
  129. op_tos_uri: exports.SafeUrlSchema.optional(),
  130. client_id_metadata_document_supported: z.boolean().optional()
  131. });
  132. /**
  133. * OpenID Connect Discovery metadata that may include OAuth 2.0 fields
  134. * This schema represents the real-world scenario where OIDC providers
  135. * return a mix of OpenID Connect and OAuth 2.0 metadata fields
  136. */
  137. exports.OpenIdProviderDiscoveryMetadataSchema = z.object({
  138. ...exports.OpenIdProviderMetadataSchema.shape,
  139. ...exports.OAuthMetadataSchema.pick({
  140. code_challenge_methods_supported: true
  141. }).shape
  142. });
  143. /**
  144. * OAuth 2.1 token response
  145. */
  146. exports.OAuthTokensSchema = z
  147. .object({
  148. access_token: z.string(),
  149. id_token: z.string().optional(), // Optional for OAuth 2.1, but necessary in OpenID Connect
  150. token_type: z.string(),
  151. expires_in: z.coerce.number().optional(),
  152. scope: z.string().optional(),
  153. refresh_token: z.string().optional()
  154. })
  155. .strip();
  156. /**
  157. * OAuth 2.1 error response
  158. */
  159. exports.OAuthErrorResponseSchema = z.object({
  160. error: z.string(),
  161. error_description: z.string().optional(),
  162. error_uri: z.string().optional()
  163. });
  164. /**
  165. * Optional version of SafeUrlSchema that allows empty string for retrocompatibility on tos_uri and logo_uri
  166. */
  167. exports.OptionalSafeUrlSchema = exports.SafeUrlSchema.optional().or(z.literal('').transform(() => undefined));
  168. /**
  169. * RFC 7591 OAuth 2.0 Dynamic Client Registration metadata
  170. */
  171. exports.OAuthClientMetadataSchema = z
  172. .object({
  173. redirect_uris: z.array(exports.SafeUrlSchema),
  174. token_endpoint_auth_method: z.string().optional(),
  175. grant_types: z.array(z.string()).optional(),
  176. response_types: z.array(z.string()).optional(),
  177. client_name: z.string().optional(),
  178. client_uri: exports.SafeUrlSchema.optional(),
  179. logo_uri: exports.OptionalSafeUrlSchema,
  180. scope: z.string().optional(),
  181. contacts: z.array(z.string()).optional(),
  182. tos_uri: exports.OptionalSafeUrlSchema,
  183. policy_uri: z.string().optional(),
  184. jwks_uri: exports.SafeUrlSchema.optional(),
  185. jwks: z.any().optional(),
  186. software_id: z.string().optional(),
  187. software_version: z.string().optional(),
  188. software_statement: z.string().optional()
  189. })
  190. .strip();
  191. /**
  192. * RFC 7591 OAuth 2.0 Dynamic Client Registration client information
  193. */
  194. exports.OAuthClientInformationSchema = z
  195. .object({
  196. client_id: z.string(),
  197. client_secret: z.string().optional(),
  198. client_id_issued_at: z.number().optional(),
  199. client_secret_expires_at: z.number().optional()
  200. })
  201. .strip();
  202. /**
  203. * RFC 7591 OAuth 2.0 Dynamic Client Registration full response (client information plus metadata)
  204. */
  205. exports.OAuthClientInformationFullSchema = exports.OAuthClientMetadataSchema.merge(exports.OAuthClientInformationSchema);
  206. /**
  207. * RFC 7591 OAuth 2.0 Dynamic Client Registration error response
  208. */
  209. exports.OAuthClientRegistrationErrorSchema = z
  210. .object({
  211. error: z.string(),
  212. error_description: z.string().optional()
  213. })
  214. .strip();
  215. /**
  216. * RFC 7009 OAuth 2.0 Token Revocation request
  217. */
  218. exports.OAuthTokenRevocationRequestSchema = z
  219. .object({
  220. token: z.string(),
  221. token_type_hint: z.string().optional()
  222. })
  223. .strip();
  224. //# sourceMappingURL=auth.js.map