@effect-auth/core 0.1.0-alpha.15 → 0.1.0-alpha.18
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 +21 -0
- package/README.md +332 -131
- package/dist/AbuseProtection.d.ts +100 -0
- package/dist/AbuseProtection.d.ts.map +1 -0
- package/dist/AbuseProtection.js +71 -0
- package/dist/AbuseProtection.js.map +1 -0
- package/dist/AccessGrant.d.ts +344 -0
- package/dist/AccessGrant.d.ts.map +1 -0
- package/dist/AccessGrant.js +687 -0
- package/dist/AccessGrant.js.map +1 -0
- package/dist/ApiKey.d.ts +2 -14
- package/dist/ApiKey.d.ts.map +1 -1
- package/dist/ApiKey.js +36 -27
- package/dist/ApiKey.js.map +1 -1
- package/dist/Assurance.d.ts +415 -0
- package/dist/Assurance.d.ts.map +1 -0
- package/dist/Assurance.js +764 -0
- package/dist/Assurance.js.map +1 -0
- package/dist/AtomicPlanExecutor.d.ts +28 -0
- package/dist/AtomicPlanExecutor.d.ts.map +1 -0
- package/dist/AtomicPlanExecutor.js +5 -0
- package/dist/AtomicPlanExecutor.js.map +1 -0
- package/dist/AuditLog.d.ts +2314 -52
- package/dist/AuditLog.d.ts.map +1 -1
- package/dist/AuditLog.js +511 -33
- package/dist/AuditLog.js.map +1 -1
- package/dist/AuthConfig.d.ts.map +1 -1
- package/dist/AuthConfig.js.map +1 -1
- package/dist/AuthFlow.d.ts +326 -220
- package/dist/AuthFlow.d.ts.map +1 -1
- package/dist/AuthFlow.js +611 -263
- package/dist/AuthFlow.js.map +1 -1
- package/dist/AuthKernel.d.ts +1 -1
- package/dist/AuthRateLimit.d.ts +96 -0
- package/dist/AuthRateLimit.d.ts.map +1 -0
- package/dist/AuthRateLimit.js +212 -0
- package/dist/AuthRateLimit.js.map +1 -0
- package/dist/Challenge.d.ts +0 -3
- package/dist/Challenge.d.ts.map +1 -1
- package/dist/Challenge.js +1 -4
- package/dist/Challenge.js.map +1 -1
- package/dist/Client.d.ts +205 -10
- package/dist/Client.d.ts.map +1 -1
- package/dist/Client.js +397 -16
- package/dist/Client.js.map +1 -1
- package/dist/CloudflareTurnstile.d.ts +28 -0
- package/dist/CloudflareTurnstile.d.ts.map +1 -0
- package/dist/CloudflareTurnstile.js +205 -0
- package/dist/CloudflareTurnstile.js.map +1 -0
- package/dist/Crypto.d.ts +0 -3
- package/dist/Crypto.d.ts.map +1 -1
- package/dist/Crypto.js +5 -7
- package/dist/Crypto.js.map +1 -1
- package/dist/DelegatedAccessStorageMigrations.d.ts +7 -0
- package/dist/DelegatedAccessStorageMigrations.d.ts.map +1 -0
- package/dist/DelegatedAccessStorageMigrations.js +159 -0
- package/dist/DelegatedAccessStorageMigrations.js.map +1 -0
- package/dist/DisposableEmailDomains.d.ts +19 -0
- package/dist/DisposableEmailDomains.d.ts.map +1 -0
- package/dist/DisposableEmailDomains.js +85 -0
- package/dist/DisposableEmailDomains.js.map +1 -0
- package/dist/DomainVerification.d.ts +0 -9
- package/dist/DomainVerification.d.ts.map +1 -1
- package/dist/DomainVerification.js +36 -22
- package/dist/DomainVerification.js.map +1 -1
- package/dist/DrizzleBunSqliteStorage.d.ts +18 -0
- package/dist/DrizzleBunSqliteStorage.d.ts.map +1 -0
- package/dist/DrizzleBunSqliteStorage.js +11 -0
- package/dist/DrizzleBunSqliteStorage.js.map +1 -0
- package/dist/DrizzleD1SqliteStorage.d.ts +28 -0
- package/dist/DrizzleD1SqliteStorage.d.ts.map +1 -0
- package/dist/DrizzleD1SqliteStorage.js +10 -0
- package/dist/DrizzleD1SqliteStorage.js.map +1 -0
- package/dist/DrizzleDurableObjectSqliteStorage.d.ts +19 -0
- package/dist/DrizzleDurableObjectSqliteStorage.d.ts.map +1 -0
- package/dist/DrizzleDurableObjectSqliteStorage.js +14 -0
- package/dist/DrizzleDurableObjectSqliteStorage.js.map +1 -0
- package/dist/DrizzleEffectSqliteStorage.d.ts +31 -0
- package/dist/DrizzleEffectSqliteStorage.d.ts.map +1 -0
- package/dist/DrizzleEffectSqliteStorage.js +108 -0
- package/dist/DrizzleEffectSqliteStorage.js.map +1 -0
- package/dist/DrizzleNodeSqliteStorage.d.ts +18 -0
- package/dist/DrizzleNodeSqliteStorage.d.ts.map +1 -0
- package/dist/DrizzleNodeSqliteStorage.js +11 -0
- package/dist/DrizzleNodeSqliteStorage.js.map +1 -0
- package/dist/DrizzleWasmSqliteStorage.d.ts +23 -0
- package/dist/DrizzleWasmSqliteStorage.d.ts.map +1 -0
- package/dist/DrizzleWasmSqliteStorage.js +15 -0
- package/dist/DrizzleWasmSqliteStorage.js.map +1 -0
- package/dist/EffectQbPostgresDelegatedAccessStorage.d.ts +34 -0
- package/dist/EffectQbPostgresDelegatedAccessStorage.d.ts.map +1 -0
- package/dist/EffectQbPostgresDelegatedAccessStorage.js +499 -0
- package/dist/EffectQbPostgresDelegatedAccessStorage.js.map +1 -0
- package/dist/EffectQbPostgresStorage.d.ts +171 -0
- package/dist/EffectQbPostgresStorage.d.ts.map +1 -0
- package/dist/EffectQbPostgresStorage.js +4280 -0
- package/dist/EffectQbPostgresStorage.js.map +1 -0
- package/dist/EffectQbSqliteDelegatedAccessStorage.d.ts +112 -0
- package/dist/EffectQbSqliteDelegatedAccessStorage.d.ts.map +1 -0
- package/dist/EffectQbSqliteDelegatedAccessStorage.js +602 -0
- package/dist/EffectQbSqliteDelegatedAccessStorage.js.map +1 -0
- package/dist/EffectQbSqliteStorage.d.ts +184 -27
- package/dist/EffectQbSqliteStorage.d.ts.map +1 -1
- package/dist/EffectQbSqliteStorage.js +1729 -135
- package/dist/EffectQbSqliteStorage.js.map +1 -1
- package/dist/EmailAuth.d.ts +65 -0
- package/dist/EmailAuth.d.ts.map +1 -0
- package/dist/EmailAuth.js +171 -0
- package/dist/EmailAuth.js.map +1 -0
- package/dist/EmailIdentityAuth.d.ts +30 -0
- package/dist/EmailIdentityAuth.d.ts.map +1 -0
- package/dist/EmailIdentityAuth.js +142 -0
- package/dist/EmailIdentityAuth.js.map +1 -0
- package/dist/EmailOtp.d.ts +10 -11
- package/dist/EmailOtp.d.ts.map +1 -1
- package/dist/EmailOtp.js +44 -81
- package/dist/EmailOtp.js.map +1 -1
- package/dist/EmailRisk.d.ts +48 -0
- package/dist/EmailRisk.d.ts.map +1 -0
- package/dist/EmailRisk.js +33 -0
- package/dist/EmailRisk.js.map +1 -0
- package/dist/EmailVerification.d.ts +10 -16
- package/dist/EmailVerification.d.ts.map +1 -1
- package/dist/EmailVerification.js +85 -42
- package/dist/EmailVerification.js.map +1 -1
- package/dist/Guard.d.ts +11 -0
- package/dist/Guard.d.ts.map +1 -0
- package/dist/Guard.js +11 -0
- package/dist/Guard.js.map +1 -0
- package/dist/HibpPwnedPasswords.d.ts +56 -0
- package/dist/HibpPwnedPasswords.d.ts.map +1 -0
- package/dist/HibpPwnedPasswords.js +232 -0
- package/dist/HibpPwnedPasswords.js.map +1 -0
- package/dist/HttpApi/AdminPermissionDefinition.d.ts +4 -0
- package/dist/HttpApi/AdminPermissionDefinition.d.ts.map +1 -0
- package/dist/HttpApi/AdminPermissionDefinition.js +4 -0
- package/dist/HttpApi/AdminPermissionDefinition.js.map +1 -0
- package/dist/HttpApi/AdminSecurityTimeline.d.ts +4 -0
- package/dist/HttpApi/AdminSecurityTimeline.d.ts.map +1 -0
- package/dist/HttpApi/AdminSecurityTimeline.js +4 -0
- package/dist/HttpApi/AdminSecurityTimeline.js.map +1 -0
- package/dist/HttpApi/AdminSession.d.ts +4 -0
- package/dist/HttpApi/AdminSession.d.ts.map +1 -0
- package/dist/HttpApi/AdminSession.js +4 -0
- package/dist/HttpApi/AdminSession.js.map +1 -0
- package/dist/HttpApi/AdminTrustedDevice.d.ts +4 -0
- package/dist/HttpApi/AdminTrustedDevice.d.ts.map +1 -0
- package/dist/HttpApi/AdminTrustedDevice.js +4 -0
- package/dist/HttpApi/AdminTrustedDevice.js.map +1 -0
- package/dist/HttpApi/Api.d.ts +1172 -1172
- package/dist/HttpApi/Api.d.ts.map +1 -1
- package/dist/HttpApi/Api.js +2160 -896
- package/dist/HttpApi/Api.js.map +1 -1
- package/dist/HttpApi/ApiKey.d.ts +4 -0
- package/dist/HttpApi/ApiKey.d.ts.map +1 -0
- package/dist/HttpApi/ApiKey.js +4 -0
- package/dist/HttpApi/ApiKey.js.map +1 -0
- package/dist/HttpApi/Audit.d.ts +6 -0
- package/dist/HttpApi/Audit.d.ts.map +1 -0
- package/dist/HttpApi/Audit.js +10 -0
- package/dist/HttpApi/Audit.js.map +1 -0
- package/dist/HttpApi/ClientApi.d.ts +917 -0
- package/dist/HttpApi/ClientApi.d.ts.map +1 -0
- package/dist/HttpApi/ClientApi.js +101 -0
- package/dist/HttpApi/ClientApi.js.map +1 -0
- package/dist/HttpApi/EmailAuth.d.ts +6 -0
- package/dist/HttpApi/EmailAuth.d.ts.map +1 -0
- package/dist/HttpApi/EmailAuth.js +6 -0
- package/dist/HttpApi/EmailAuth.js.map +1 -0
- package/dist/HttpApi/EmailGuards.d.ts +115 -0
- package/dist/HttpApi/EmailGuards.d.ts.map +1 -0
- package/dist/HttpApi/EmailGuards.js +191 -0
- package/dist/HttpApi/EmailGuards.js.map +1 -0
- package/dist/HttpApi/EmailOtp.d.ts +6 -0
- package/dist/HttpApi/EmailOtp.d.ts.map +1 -0
- package/dist/HttpApi/EmailOtp.js +6 -0
- package/dist/HttpApi/EmailOtp.js.map +1 -0
- package/dist/HttpApi/EmailVerification.d.ts +6 -0
- package/dist/HttpApi/EmailVerification.d.ts.map +1 -0
- package/dist/HttpApi/EmailVerification.js +6 -0
- package/dist/HttpApi/EmailVerification.js.map +1 -0
- package/dist/HttpApi/Endpoints.d.ts +629 -301
- package/dist/HttpApi/Endpoints.d.ts.map +1 -1
- package/dist/HttpApi/Endpoints.js +178 -120
- package/dist/HttpApi/Endpoints.js.map +1 -1
- package/dist/HttpApi/Errors.d.ts +26 -7
- package/dist/HttpApi/Errors.d.ts.map +1 -1
- package/dist/HttpApi/Errors.js +26 -4
- package/dist/HttpApi/Errors.js.map +1 -1
- package/dist/HttpApi/Identity.d.ts +6 -0
- package/dist/HttpApi/Identity.d.ts.map +1 -0
- package/dist/HttpApi/Identity.js +6 -0
- package/dist/HttpApi/Identity.js.map +1 -0
- package/dist/HttpApi/IdentityGuards.d.ts +31 -0
- package/dist/HttpApi/IdentityGuards.d.ts.map +1 -0
- package/dist/HttpApi/IdentityGuards.js +33 -0
- package/dist/HttpApi/IdentityGuards.js.map +1 -0
- package/dist/HttpApi/Jwt.d.ts +4 -0
- package/dist/HttpApi/Jwt.d.ts.map +1 -0
- package/dist/HttpApi/Jwt.js +4 -0
- package/dist/HttpApi/Jwt.js.map +1 -0
- package/dist/HttpApi/JwtDiscovery.d.ts +4 -0
- package/dist/HttpApi/JwtDiscovery.d.ts.map +1 -0
- package/dist/HttpApi/JwtDiscovery.js +4 -0
- package/dist/HttpApi/JwtDiscovery.js.map +1 -0
- package/dist/HttpApi/LoginApproval.d.ts +5 -0
- package/dist/HttpApi/LoginApproval.d.ts.map +1 -0
- package/dist/HttpApi/LoginApproval.js +5 -0
- package/dist/HttpApi/LoginApproval.js.map +1 -0
- package/dist/HttpApi/LoginNotification.d.ts +5 -0
- package/dist/HttpApi/LoginNotification.d.ts.map +1 -0
- package/dist/HttpApi/LoginNotification.js +5 -0
- package/dist/HttpApi/LoginNotification.js.map +1 -0
- package/dist/HttpApi/MagicLink.d.ts +6 -0
- package/dist/HttpApi/MagicLink.d.ts.map +1 -0
- package/dist/HttpApi/MagicLink.js +6 -0
- package/dist/HttpApi/MagicLink.js.map +1 -0
- package/dist/HttpApi/Mfa.d.ts +5 -0
- package/dist/HttpApi/Mfa.d.ts.map +1 -0
- package/dist/HttpApi/Mfa.js +5 -0
- package/dist/HttpApi/Mfa.js.map +1 -0
- package/dist/HttpApi/Middleware.d.ts +14 -0
- package/dist/HttpApi/Middleware.d.ts.map +1 -0
- package/dist/HttpApi/Middleware.js +5 -0
- package/dist/HttpApi/Middleware.js.map +1 -0
- package/dist/HttpApi/OAuth.d.ts +4 -0
- package/dist/HttpApi/OAuth.d.ts.map +1 -0
- package/dist/HttpApi/OAuth.js +4 -0
- package/dist/HttpApi/OAuth.js.map +1 -0
- package/dist/HttpApi/OAuthProviderAuthorization.d.ts +4 -0
- package/dist/HttpApi/OAuthProviderAuthorization.d.ts.map +1 -0
- package/dist/HttpApi/OAuthProviderAuthorization.js +4 -0
- package/dist/HttpApi/OAuthProviderAuthorization.js.map +1 -0
- package/dist/HttpApi/OAuthToken.d.ts +4 -0
- package/dist/HttpApi/OAuthToken.d.ts.map +1 -0
- package/dist/HttpApi/OAuthToken.js +4 -0
- package/dist/HttpApi/OAuthToken.js.map +1 -0
- package/dist/HttpApi/OidcDiscovery.d.ts +4 -0
- package/dist/HttpApi/OidcDiscovery.d.ts.map +1 -0
- package/dist/HttpApi/OidcDiscovery.js +4 -0
- package/dist/HttpApi/OidcDiscovery.js.map +1 -0
- package/dist/HttpApi/Operations/AdminPermissionDefinition.d.ts +28 -0
- package/dist/HttpApi/Operations/AdminPermissionDefinition.d.ts.map +1 -0
- package/dist/HttpApi/Operations/AdminPermissionDefinition.js +5 -0
- package/dist/HttpApi/Operations/AdminPermissionDefinition.js.map +1 -0
- package/dist/HttpApi/Operations/AdminSession.d.ts +16 -0
- package/dist/HttpApi/Operations/AdminSession.d.ts.map +1 -0
- package/dist/HttpApi/Operations/AdminSession.js +5 -0
- package/dist/HttpApi/Operations/AdminSession.js.map +1 -0
- package/dist/HttpApi/Operations/ApiKey.d.ts +16 -0
- package/dist/HttpApi/Operations/ApiKey.d.ts.map +1 -0
- package/dist/HttpApi/Operations/ApiKey.js +5 -0
- package/dist/HttpApi/Operations/ApiKey.js.map +1 -0
- package/dist/HttpApi/Operations/Discovery.d.ts +19 -0
- package/dist/HttpApi/Operations/Discovery.d.ts.map +1 -0
- package/dist/HttpApi/Operations/Discovery.js +7 -0
- package/dist/HttpApi/Operations/Discovery.js.map +1 -0
- package/dist/HttpApi/Operations/EmailAuth.d.ts +12 -0
- package/dist/HttpApi/Operations/EmailAuth.d.ts.map +1 -0
- package/dist/HttpApi/Operations/EmailAuth.js +5 -0
- package/dist/HttpApi/Operations/EmailAuth.js.map +1 -0
- package/dist/HttpApi/Operations/EmailOtp.d.ts +14 -0
- package/dist/HttpApi/Operations/EmailOtp.d.ts.map +1 -0
- package/dist/HttpApi/Operations/EmailOtp.js +5 -0
- package/dist/HttpApi/Operations/EmailOtp.js.map +1 -0
- package/dist/HttpApi/Operations/EmailVerification.d.ts +14 -0
- package/dist/HttpApi/Operations/EmailVerification.d.ts.map +1 -0
- package/dist/HttpApi/Operations/EmailVerification.js +5 -0
- package/dist/HttpApi/Operations/EmailVerification.js.map +1 -0
- package/dist/HttpApi/Operations/HttpOperation.d.ts +4 -0
- package/dist/HttpApi/Operations/HttpOperation.d.ts.map +1 -0
- package/dist/HttpApi/Operations/HttpOperation.js +2 -0
- package/dist/HttpApi/Operations/HttpOperation.js.map +1 -0
- package/dist/HttpApi/Operations/Identity.d.ts +22 -0
- package/dist/HttpApi/Operations/Identity.d.ts.map +1 -0
- package/dist/HttpApi/Operations/Identity.js +5 -0
- package/dist/HttpApi/Operations/Identity.js.map +1 -0
- package/dist/HttpApi/Operations/Jwt.d.ts +14 -0
- package/dist/HttpApi/Operations/Jwt.d.ts.map +1 -0
- package/dist/HttpApi/Operations/Jwt.js +5 -0
- package/dist/HttpApi/Operations/Jwt.js.map +1 -0
- package/dist/HttpApi/Operations/LoginApproval.d.ts +16 -0
- package/dist/HttpApi/Operations/LoginApproval.d.ts.map +1 -0
- package/dist/HttpApi/Operations/LoginApproval.js +5 -0
- package/dist/HttpApi/Operations/LoginApproval.js.map +1 -0
- package/dist/HttpApi/Operations/MagicLink.d.ts +14 -0
- package/dist/HttpApi/Operations/MagicLink.d.ts.map +1 -0
- package/dist/HttpApi/Operations/MagicLink.js +5 -0
- package/dist/HttpApi/Operations/MagicLink.js.map +1 -0
- package/dist/HttpApi/Operations/Mfa.d.ts +24 -0
- package/dist/HttpApi/Operations/Mfa.d.ts.map +1 -0
- package/dist/HttpApi/Operations/Mfa.js +5 -0
- package/dist/HttpApi/Operations/Mfa.js.map +1 -0
- package/dist/HttpApi/Operations/OAuth.d.ts +20 -0
- package/dist/HttpApi/Operations/OAuth.d.ts.map +1 -0
- package/dist/HttpApi/Operations/OAuth.js +5 -0
- package/dist/HttpApi/Operations/OAuth.js.map +1 -0
- package/dist/HttpApi/Operations/OAuthProviderAuthorization.d.ts +12 -0
- package/dist/HttpApi/Operations/OAuthProviderAuthorization.d.ts.map +1 -0
- package/dist/HttpApi/Operations/OAuthProviderAuthorization.js +5 -0
- package/dist/HttpApi/Operations/OAuthProviderAuthorization.js.map +1 -0
- package/dist/HttpApi/Operations/OAuthToken.d.ts +16 -0
- package/dist/HttpApi/Operations/OAuthToken.d.ts.map +1 -0
- package/dist/HttpApi/Operations/OAuthToken.js +5 -0
- package/dist/HttpApi/Operations/OAuthToken.js.map +1 -0
- package/dist/HttpApi/Operations/Passkey.d.ts +22 -0
- package/dist/HttpApi/Operations/Passkey.d.ts.map +1 -0
- package/dist/HttpApi/Operations/Passkey.js +5 -0
- package/dist/HttpApi/Operations/Passkey.js.map +1 -0
- package/dist/HttpApi/Operations/Password.d.ts +22 -0
- package/dist/HttpApi/Operations/Password.d.ts.map +1 -0
- package/dist/HttpApi/Operations/Password.js +5 -0
- package/dist/HttpApi/Operations/Password.js.map +1 -0
- package/dist/HttpApi/Operations/RecoveryCodes.d.ts +20 -0
- package/dist/HttpApi/Operations/RecoveryCodes.d.ts.map +1 -0
- package/dist/HttpApi/Operations/RecoveryCodes.js +5 -0
- package/dist/HttpApi/Operations/RecoveryCodes.js.map +1 -0
- package/dist/HttpApi/Operations/RefreshToken.d.ts +12 -0
- package/dist/HttpApi/Operations/RefreshToken.d.ts.map +1 -0
- package/dist/HttpApi/Operations/RefreshToken.js +5 -0
- package/dist/HttpApi/Operations/RefreshToken.js.map +1 -0
- package/dist/HttpApi/Operations/Security.d.ts +12 -0
- package/dist/HttpApi/Operations/Security.d.ts.map +1 -0
- package/dist/HttpApi/Operations/Security.js +5 -0
- package/dist/HttpApi/Operations/Security.js.map +1 -0
- package/dist/HttpApi/Operations/SecurityTimeline.d.ts +19 -0
- package/dist/HttpApi/Operations/SecurityTimeline.d.ts.map +1 -0
- package/dist/HttpApi/Operations/SecurityTimeline.js +7 -0
- package/dist/HttpApi/Operations/SecurityTimeline.js.map +1 -0
- package/dist/HttpApi/Operations/Session.d.ts +22 -0
- package/dist/HttpApi/Operations/Session.d.ts.map +1 -0
- package/dist/HttpApi/Operations/Session.js +5 -0
- package/dist/HttpApi/Operations/Session.js.map +1 -0
- package/dist/HttpApi/Operations/StepUp.d.ts +22 -0
- package/dist/HttpApi/Operations/StepUp.d.ts.map +1 -0
- package/dist/HttpApi/Operations/StepUp.js +5 -0
- package/dist/HttpApi/Operations/StepUp.js.map +1 -0
- package/dist/HttpApi/Operations/Totp.d.ts +20 -0
- package/dist/HttpApi/Operations/Totp.d.ts.map +1 -0
- package/dist/HttpApi/Operations/Totp.js +5 -0
- package/dist/HttpApi/Operations/Totp.js.map +1 -0
- package/dist/HttpApi/Operations/TrustedDevice.d.ts +23 -0
- package/dist/HttpApi/Operations/TrustedDevice.d.ts.map +1 -0
- package/dist/HttpApi/Operations/TrustedDevice.js +7 -0
- package/dist/HttpApi/Operations/TrustedDevice.js.map +1 -0
- package/dist/HttpApi/Operations/index.d.ts +27 -0
- package/dist/HttpApi/Operations/index.d.ts.map +1 -0
- package/dist/HttpApi/Operations/index.js +27 -0
- package/dist/HttpApi/Operations/index.js.map +1 -0
- package/dist/HttpApi/Passkey.d.ts +5 -0
- package/dist/HttpApi/Passkey.d.ts.map +1 -0
- package/dist/HttpApi/Passkey.js +5 -0
- package/dist/HttpApi/Passkey.js.map +1 -0
- package/dist/HttpApi/Password.d.ts +220 -0
- package/dist/HttpApi/Password.d.ts.map +1 -0
- package/dist/HttpApi/Password.js +237 -0
- package/dist/HttpApi/Password.js.map +1 -0
- package/dist/HttpApi/PasswordContract.d.ts +307 -0
- package/dist/HttpApi/PasswordContract.d.ts.map +1 -0
- package/dist/HttpApi/PasswordContract.js +63 -0
- package/dist/HttpApi/PasswordContract.js.map +1 -0
- package/dist/HttpApi/PasswordGuards.d.ts +82 -0
- package/dist/HttpApi/PasswordGuards.d.ts.map +1 -0
- package/dist/HttpApi/PasswordGuards.js +179 -0
- package/dist/HttpApi/PasswordGuards.js.map +1 -0
- package/dist/HttpApi/RecoveryCodes.d.ts +5 -0
- package/dist/HttpApi/RecoveryCodes.d.ts.map +1 -0
- package/dist/HttpApi/RecoveryCodes.js +5 -0
- package/dist/HttpApi/RecoveryCodes.js.map +1 -0
- package/dist/HttpApi/RefreshToken.d.ts +4 -0
- package/dist/HttpApi/RefreshToken.d.ts.map +1 -0
- package/dist/HttpApi/RefreshToken.js +4 -0
- package/dist/HttpApi/RefreshToken.js.map +1 -0
- package/dist/HttpApi/RequestGuards.d.ts +42 -0
- package/dist/HttpApi/RequestGuards.d.ts.map +1 -0
- package/dist/HttpApi/RequestGuards.js +194 -0
- package/dist/HttpApi/RequestGuards.js.map +1 -0
- package/dist/HttpApi/Schemas.d.ts +361 -84
- package/dist/HttpApi/Schemas.d.ts.map +1 -1
- package/dist/HttpApi/Schemas.js +190 -27
- package/dist/HttpApi/Schemas.js.map +1 -1
- package/dist/HttpApi/Security.d.ts +12 -93
- package/dist/HttpApi/Security.d.ts.map +1 -1
- package/dist/HttpApi/Security.js +65 -356
- package/dist/HttpApi/Security.js.map +1 -1
- package/dist/HttpApi/SecurityTimeline.d.ts +4 -0
- package/dist/HttpApi/SecurityTimeline.d.ts.map +1 -0
- package/dist/HttpApi/SecurityTimeline.js +4 -0
- package/dist/HttpApi/SecurityTimeline.js.map +1 -0
- package/dist/HttpApi/Session.d.ts +5 -0
- package/dist/HttpApi/Session.d.ts.map +1 -0
- package/dist/HttpApi/Session.js +5 -0
- package/dist/HttpApi/Session.js.map +1 -0
- package/dist/HttpApi/SessionGuards.d.ts +15 -0
- package/dist/HttpApi/SessionGuards.d.ts.map +1 -0
- package/dist/HttpApi/SessionGuards.js +37 -0
- package/dist/HttpApi/SessionGuards.js.map +1 -0
- package/dist/HttpApi/StepUp.d.ts +5 -0
- package/dist/HttpApi/StepUp.d.ts.map +1 -0
- package/dist/HttpApi/StepUp.js +5 -0
- package/dist/HttpApi/StepUp.js.map +1 -0
- package/dist/HttpApi/Totp.d.ts +5 -0
- package/dist/HttpApi/Totp.d.ts.map +1 -0
- package/dist/HttpApi/Totp.js +5 -0
- package/dist/HttpApi/Totp.js.map +1 -0
- package/dist/HttpApi/Transport.d.ts +4 -6
- package/dist/HttpApi/Transport.d.ts.map +1 -1
- package/dist/HttpApi/Transport.js +62 -36
- package/dist/HttpApi/Transport.js.map +1 -1
- package/dist/HttpApi/TrustedDevice.d.ts +4 -0
- package/dist/HttpApi/TrustedDevice.d.ts.map +1 -0
- package/dist/HttpApi/TrustedDevice.js +4 -0
- package/dist/HttpApi/TrustedDevice.js.map +1 -0
- package/dist/HttpApi/index.d.ts +9 -3
- package/dist/HttpApi/index.d.ts.map +1 -1
- package/dist/HttpApi/index.js +8 -2
- package/dist/HttpApi/index.js.map +1 -1
- package/dist/Identity.d.ts +138 -0
- package/dist/Identity.d.ts.map +1 -0
- package/dist/Identity.js +105 -0
- package/dist/Identity.js.map +1 -0
- package/dist/IdentityManagement.d.ts +189 -0
- package/dist/IdentityManagement.d.ts.map +1 -0
- package/dist/IdentityManagement.js +317 -0
- package/dist/IdentityManagement.js.map +1 -0
- package/dist/IncidentAction.d.ts +1 -4
- package/dist/IncidentAction.d.ts.map +1 -1
- package/dist/IncidentAction.js +15 -9
- package/dist/IncidentAction.js.map +1 -1
- package/dist/Internal.d.ts +2 -0
- package/dist/Internal.d.ts.map +1 -1
- package/dist/Internal.js +30 -0
- package/dist/Internal.js.map +1 -1
- package/dist/Invitation.d.ts +362 -0
- package/dist/Invitation.d.ts.map +1 -0
- package/dist/Invitation.js +633 -0
- package/dist/Invitation.js.map +1 -0
- package/dist/IpQualityScore.d.ts +38 -0
- package/dist/IpQualityScore.d.ts.map +1 -0
- package/dist/IpQualityScore.js +215 -0
- package/dist/IpQualityScore.js.map +1 -0
- package/dist/Jwt.d.ts +9 -30
- package/dist/Jwt.d.ts.map +1 -1
- package/dist/Jwt.js +72 -60
- package/dist/Jwt.js.map +1 -1
- package/dist/LoginApproval.d.ts +16 -31
- package/dist/LoginApproval.d.ts.map +1 -1
- package/dist/LoginApproval.js +47 -41
- package/dist/LoginApproval.js.map +1 -1
- package/dist/LoginNotification.d.ts +8 -12
- package/dist/LoginNotification.d.ts.map +1 -1
- package/dist/LoginNotification.js +30 -17
- package/dist/LoginNotification.js.map +1 -1
- package/dist/LoginRisk.d.ts +11 -13
- package/dist/LoginRisk.d.ts.map +1 -1
- package/dist/LoginRisk.js +66 -26
- package/dist/LoginRisk.js.map +1 -1
- package/dist/LoginRiskEnrichment.d.ts +145 -0
- package/dist/LoginRiskEnrichment.d.ts.map +1 -0
- package/dist/LoginRiskEnrichment.js +220 -0
- package/dist/LoginRiskEnrichment.js.map +1 -0
- package/dist/MachineAuth.d.ts.map +1 -1
- package/dist/MachineAuth.js.map +1 -1
- package/dist/MagicLink.d.ts +9 -8
- package/dist/MagicLink.d.ts.map +1 -1
- package/dist/MagicLink.js +40 -73
- package/dist/MagicLink.js.map +1 -1
- package/dist/Mailer.d.ts +20 -13
- package/dist/Mailer.d.ts.map +1 -1
- package/dist/Mailer.js +10 -12
- package/dist/Mailer.js.map +1 -1
- package/dist/OAuth.d.ts +100 -103
- package/dist/OAuth.d.ts.map +1 -1
- package/dist/OAuth.js +404 -217
- package/dist/OAuth.js.map +1 -1
- package/dist/Passkey.d.ts +17 -19
- package/dist/Passkey.d.ts.map +1 -1
- package/dist/Passkey.js +86 -39
- package/dist/Passkey.js.map +1 -1
- package/dist/PasskeyBrowser.d.ts +39 -0
- package/dist/PasskeyBrowser.d.ts.map +1 -0
- package/dist/PasskeyBrowser.js +206 -0
- package/dist/PasskeyBrowser.js.map +1 -0
- package/dist/PasskeySimpleWebAuthn.d.ts.map +1 -1
- package/dist/PasskeySimpleWebAuthn.js +19 -7
- package/dist/PasskeySimpleWebAuthn.js.map +1 -1
- package/dist/Password.d.ts +71 -37
- package/dist/Password.d.ts.map +1 -1
- package/dist/Password.js +296 -82
- package/dist/Password.js.map +1 -1
- package/dist/PasswordRisk.d.ts +63 -0
- package/dist/PasswordRisk.d.ts.map +1 -0
- package/dist/PasswordRisk.js +37 -0
- package/dist/PasswordRisk.js.map +1 -0
- package/dist/Permission.d.ts +308 -0
- package/dist/Permission.d.ts.map +1 -0
- package/dist/Permission.js +827 -0
- package/dist/Permission.js.map +1 -0
- package/dist/Policy.d.ts +31 -18
- package/dist/Policy.d.ts.map +1 -1
- package/dist/Policy.js +58 -14
- package/dist/Policy.js.map +1 -1
- package/dist/PostgresDelegatedAccessStorageMigrations.d.ts +7 -0
- package/dist/PostgresDelegatedAccessStorageMigrations.d.ts.map +1 -0
- package/dist/PostgresDelegatedAccessStorageMigrations.js +119 -0
- package/dist/PostgresDelegatedAccessStorageMigrations.js.map +1 -0
- package/dist/PostgresStorageMigrations.d.ts +15 -0
- package/dist/PostgresStorageMigrations.d.ts.map +1 -0
- package/dist/PostgresStorageMigrations.js +620 -0
- package/dist/PostgresStorageMigrations.js.map +1 -0
- package/dist/Privacy.d.ts +0 -3
- package/dist/Privacy.d.ts.map +1 -1
- package/dist/Privacy.js +2 -5
- package/dist/Privacy.js.map +1 -1
- package/dist/RateLimiter.d.ts +0 -3
- package/dist/RateLimiter.d.ts.map +1 -1
- package/dist/RateLimiter.js +1 -4
- package/dist/RateLimiter.js.map +1 -1
- package/dist/RecoveryCode.d.ts +84 -12
- package/dist/RecoveryCode.d.ts.map +1 -1
- package/dist/RecoveryCode.js +273 -75
- package/dist/RecoveryCode.js.map +1 -1
- package/dist/RecoveryPolicy.d.ts +81 -0
- package/dist/RecoveryPolicy.d.ts.map +1 -0
- package/dist/RecoveryPolicy.js +119 -0
- package/dist/RecoveryPolicy.js.map +1 -0
- package/dist/RefreshToken.d.ts +1 -10
- package/dist/RefreshToken.d.ts.map +1 -1
- package/dist/RefreshToken.js +31 -22
- package/dist/RefreshToken.js.map +1 -1
- package/dist/Retention.d.ts.map +1 -1
- package/dist/Retention.js.map +1 -1
- package/dist/SecurityTimeline.d.ts +1 -4
- package/dist/SecurityTimeline.d.ts.map +1 -1
- package/dist/SecurityTimeline.js +110 -17
- package/dist/SecurityTimeline.js.map +1 -1
- package/dist/Sessions.d.ts +124 -29
- package/dist/Sessions.d.ts.map +1 -1
- package/dist/Sessions.js +626 -94
- package/dist/Sessions.js.map +1 -1
- package/dist/StepUp.d.ts +132 -11
- package/dist/StepUp.d.ts.map +1 -1
- package/dist/StepUp.js +387 -19
- package/dist/StepUp.js.map +1 -1
- package/dist/Storage.d.ts +89 -23
- package/dist/Storage.d.ts.map +1 -1
- package/dist/Storage.js +10 -12
- package/dist/Storage.js.map +1 -1
- package/dist/StorageMigrations.d.ts +6 -1
- package/dist/StorageMigrations.d.ts.map +1 -1
- package/dist/StorageMigrations.js +224 -0
- package/dist/StorageMigrations.js.map +1 -1
- package/dist/StorageSchemaGenerator.d.ts +486 -0
- package/dist/StorageSchemaGenerator.d.ts.map +1 -0
- package/dist/StorageSchemaGenerator.js +1022 -0
- package/dist/StorageSchemaGenerator.js.map +1 -0
- package/dist/StrongFactor.d.ts +64 -0
- package/dist/StrongFactor.d.ts.map +1 -0
- package/dist/StrongFactor.js +100 -0
- package/dist/StrongFactor.js.map +1 -0
- package/dist/Testing.d.ts +1 -1
- package/dist/Testing.js +2 -2
- package/dist/Testing.js.map +1 -1
- package/dist/Totp.d.ts +88 -13
- package/dist/Totp.d.ts.map +1 -1
- package/dist/Totp.js +194 -36
- package/dist/Totp.js.map +1 -1
- package/dist/TrustedDevice.d.ts +0 -9
- package/dist/TrustedDevice.d.ts.map +1 -1
- package/dist/TrustedDevice.js +15 -17
- package/dist/TrustedDevice.js.map +1 -1
- package/dist/WaitUntil.d.ts +0 -3
- package/dist/WaitUntil.d.ts.map +1 -1
- package/dist/WaitUntil.js +1 -4
- package/dist/WaitUntil.js.map +1 -1
- package/dist/Webhook.d.ts +42 -12
- package/dist/Webhook.d.ts.map +1 -1
- package/dist/Webhook.js +165 -26
- package/dist/Webhook.js.map +1 -1
- package/dist/alchemy/cloudflare/Email.d.ts +4 -4
- package/dist/alchemy/cloudflare/Email.d.ts.map +1 -1
- package/dist/alchemy/cloudflare/Email.js +10 -5
- package/dist/alchemy/cloudflare/Email.js.map +1 -1
- package/dist/alchemy/cloudflare/RateLimitDurableObject.d.ts +4 -4
- package/dist/alchemy/cloudflare/RateLimitDurableObject.d.ts.map +1 -1
- package/dist/alchemy/cloudflare/RateLimitDurableObject.js +5 -4
- package/dist/alchemy/cloudflare/RateLimitDurableObject.js.map +1 -1
- package/dist/cloudflare/Email.d.ts.map +1 -1
- package/dist/cloudflare/Email.js +1 -1
- package/dist/cloudflare/Email.js.map +1 -1
- package/dist/cloudflare/RateLimitDurableObject.d.ts +6 -5
- package/dist/cloudflare/RateLimitDurableObject.d.ts.map +1 -1
- package/dist/cloudflare/RateLimitDurableObject.js.map +1 -1
- package/dist/cloudflare/RequestMetadata.d.ts +49 -0
- package/dist/cloudflare/RequestMetadata.d.ts.map +1 -0
- package/dist/cloudflare/RequestMetadata.js +71 -0
- package/dist/cloudflare/RequestMetadata.js.map +1 -0
- package/dist/index.d.ts +0 -35
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +0 -35
- package/dist/index.js.map +1 -1
- package/dist/internal/AuthFlowFinalizer.d.ts +31 -0
- package/dist/internal/AuthFlowFinalizer.d.ts.map +1 -0
- package/dist/internal/AuthFlowFinalizer.js +182 -0
- package/dist/internal/AuthFlowFinalizer.js.map +1 -0
- package/dist/internal/RateLimitDurableObject.d.ts.map +1 -1
- package/dist/internal/RateLimitDurableObject.js +3 -0
- package/dist/internal/RateLimitDurableObject.js.map +1 -1
- package/migrations/0001_auth_storage.sql +1 -0
- package/migrations/0006_auth_totp_factor.sql +1 -0
- package/migrations/0024_auth_permission.sql +39 -0
- package/migrations/0025_auth_permission_definition.sql +19 -0
- package/migrations/0026_auth_user_identity.sql +59 -0
- package/migrations/0027_auth_audit_log_storage_order.sql +46 -0
- package/migrations/0028_auth_oauth_client_secret_key.sql +39 -0
- package/migrations/delegated-access/0001_auth_delegated_access.sql +152 -0
- package/migrations/postgres/0001_auth_core.sql +77 -0
- package/migrations/postgres/0002_auth_security_oauth.sql +65 -0
- package/migrations/postgres/0003_auth_credentials_tokens.sql +43 -0
- package/migrations/postgres/0004_auth_security_history.sql +103 -0
- package/migrations/postgres/0005_auth_webhooks.sql +29 -0
- package/migrations/postgres/0006_auth_domain_timeline.sql +50 -0
- package/migrations/postgres/0007_auth_oauth_clients.sql +85 -0
- package/migrations/postgres/0008_auth_oauth_tokens.sql +63 -0
- package/migrations/postgres/0009_auth_permissions.sql +66 -0
- package/migrations/postgres/delegated-access/0001_auth_delegated_access.sql +112 -0
- package/package.json +309 -2
|
@@ -1,17 +1,16 @@
|
|
|
1
|
-
import { Context,
|
|
1
|
+
import { Context, Effect, Layer } from "effect";
|
|
2
2
|
import { HttpServerRequest } from "effect/unstable/http";
|
|
3
3
|
import { HttpApiMiddleware } from "effect/unstable/httpapi";
|
|
4
|
-
import
|
|
5
|
-
import type { EmailVerificationIssueInput } from "../EmailVerification.js";
|
|
6
|
-
import type { EmailOtpStartInput } from "../EmailOtp.js";
|
|
7
|
-
import type { MagicLinkStartInput } from "../MagicLink.js";
|
|
4
|
+
import { CustomEvidencePolicyError } from "../Assurance.js";
|
|
8
5
|
import type { IpAddress } from "../Identifiers.js";
|
|
9
|
-
import type {
|
|
10
|
-
import {
|
|
6
|
+
import type { PermissionCheckError } from "../Permission.js";
|
|
7
|
+
import type { AuthorizationError } from "../Policy.js";
|
|
11
8
|
import type { PrivacyError } from "../Privacy.js";
|
|
12
|
-
import {
|
|
13
|
-
import type {
|
|
14
|
-
import { AuthInternalError, AuthRateLimitedError, AuthRequestRejectedError } from "./Errors.js";
|
|
9
|
+
import type { RateLimitExceededError, RateLimitStoreError } from "../RateLimiter.js";
|
|
10
|
+
import type { StepUpCapabilityError, StepUpDenied, StepUpRequired } from "../StepUp.js";
|
|
11
|
+
import { AuthPolicyDeniedError, AuthInternalError, AuthRateLimitedError, AuthRequestRejectedError, AuthStepUpRequiredError } from "./Errors.js";
|
|
12
|
+
import { AuthOriginCheckMiddleware } from "./Middleware.js";
|
|
13
|
+
export { AuthOriginCheckMiddleware } from "./Middleware.js";
|
|
15
14
|
export interface AuthOriginCheckOptions {
|
|
16
15
|
readonly allowedOrigins?: string | readonly string[];
|
|
17
16
|
readonly allowMissingOrigin?: boolean;
|
|
@@ -31,64 +30,10 @@ export interface AuthRequestMetadataShape {
|
|
|
31
30
|
readonly origin?: string;
|
|
32
31
|
readonly referer?: string;
|
|
33
32
|
}
|
|
34
|
-
export interface AuthRateLimitPolicyInput {
|
|
35
|
-
readonly metadata: AuthRequestMetadataShape;
|
|
36
|
-
readonly endpoint: HttpApiEndpoint.Any;
|
|
37
|
-
readonly group: HttpApiGroup.Any;
|
|
38
|
-
}
|
|
39
|
-
export type AuthRateLimitPolicy = (input: AuthRateLimitPolicyInput) => Effect.Effect<RateLimitPolicyShape | undefined, PrivacyError, Privacy>;
|
|
40
|
-
export interface AuthRateLimitByIpOptions {
|
|
41
|
-
readonly id: string;
|
|
42
|
-
readonly window: Duration.Duration;
|
|
43
|
-
readonly limit: number;
|
|
44
|
-
readonly tokens?: number;
|
|
45
|
-
}
|
|
46
|
-
export interface AuthApiRateLimitRuleOptions {
|
|
47
|
-
readonly window?: Duration.Duration;
|
|
48
|
-
readonly limit?: number;
|
|
49
|
-
readonly tokens?: number;
|
|
50
|
-
}
|
|
51
|
-
export type AuthApiRateLimitRuleConfig = AuthApiRateLimitRuleOptions | boolean;
|
|
52
|
-
export interface AuthApiEndpointRateLimitOptions {
|
|
53
|
-
readonly byIp?: AuthApiRateLimitRuleConfig;
|
|
54
|
-
readonly byEmail?: AuthApiRateLimitRuleConfig;
|
|
55
|
-
}
|
|
56
|
-
export type AuthApiEndpointRateLimitConfig = AuthApiEndpointRateLimitOptions | boolean;
|
|
57
|
-
export interface AuthApiRateLimitOptions {
|
|
58
|
-
readonly trustProxyHeaders?: boolean;
|
|
59
|
-
readonly passwordSignIn?: AuthApiEndpointRateLimitConfig;
|
|
60
|
-
readonly passwordSignUp?: AuthApiEndpointRateLimitConfig;
|
|
61
|
-
readonly passwordResetStart?: AuthApiEndpointRateLimitConfig;
|
|
62
|
-
readonly passwordResetVerify?: AuthApiEndpointRateLimitConfig;
|
|
63
|
-
readonly emailOtpStart?: AuthApiEndpointRateLimitConfig;
|
|
64
|
-
readonly emailOtpVerify?: AuthApiEndpointRateLimitConfig;
|
|
65
|
-
readonly magicLinkStart?: AuthApiEndpointRateLimitConfig;
|
|
66
|
-
readonly magicLinkVerify?: AuthApiEndpointRateLimitConfig;
|
|
67
|
-
readonly emailVerificationStart?: AuthApiEndpointRateLimitConfig;
|
|
68
|
-
}
|
|
69
|
-
export type AuthApiRateLimitConfigValue = AuthApiRateLimitOptions | boolean;
|
|
70
33
|
export interface AuthHttpApiConfigValue {
|
|
71
|
-
readonly rateLimit?: AuthApiRateLimitConfigValue;
|
|
72
34
|
readonly originCheck?: AuthOriginCheckOptions;
|
|
73
35
|
readonly requestMetadata?: AuthRequestMetadataOptions;
|
|
74
36
|
}
|
|
75
|
-
export type AuthRateLimitEndpointKey = `${string}.${string}`;
|
|
76
|
-
export type AuthRateLimitEndpointPolicyMap = Readonly<Record<AuthRateLimitEndpointKey, AuthRateLimitPolicy | undefined>>;
|
|
77
|
-
export interface AuthApiRateLimitService {
|
|
78
|
-
readonly request: (input: AuthRateLimitPolicyInput) => Effect.Effect<void, RateLimitError | PrivacyError>;
|
|
79
|
-
readonly passwordSignIn: (input: PasswordSignInInput) => Effect.Effect<void, RateLimitError | PrivacyError>;
|
|
80
|
-
readonly passwordSignUp: (input: PasswordSignUpInput) => Effect.Effect<void, RateLimitError | PrivacyError>;
|
|
81
|
-
readonly passwordResetStart: (input: PasswordResetStartInput) => Effect.Effect<void, RateLimitError | PrivacyError>;
|
|
82
|
-
readonly emailOtpStart: (input: EmailOtpStartInput) => Effect.Effect<void, RateLimitError | PrivacyError>;
|
|
83
|
-
readonly magicLinkStart: (input: MagicLinkStartInput) => Effect.Effect<void, RateLimitError | PrivacyError>;
|
|
84
|
-
readonly emailVerificationStart: (input: EmailVerificationIssueInput) => Effect.Effect<void, RateLimitError | PrivacyError>;
|
|
85
|
-
}
|
|
86
|
-
declare const AuthApiRateLimit_base: Context.ServiceClass<AuthApiRateLimit, "auth/AuthApiRateLimit", AuthApiRateLimitService>;
|
|
87
|
-
export declare class AuthApiRateLimit extends AuthApiRateLimit_base {
|
|
88
|
-
}
|
|
89
|
-
export declare namespace AuthApiRateLimit {
|
|
90
|
-
const make: (service: AuthApiRateLimitService) => AuthApiRateLimitService;
|
|
91
|
-
}
|
|
92
37
|
declare const AuthHttpApiConfig_base: Context.ServiceClass<AuthHttpApiConfig, "auth/AuthHttpApiConfig", AuthHttpApiConfigValue>;
|
|
93
38
|
export declare class AuthHttpApiConfig extends AuthHttpApiConfig_base {
|
|
94
39
|
}
|
|
@@ -101,16 +46,6 @@ export declare class AuthRequestMetadata extends AuthRequestMetadata_base {
|
|
|
101
46
|
export declare namespace AuthRequestMetadata {
|
|
102
47
|
const make: (metadata: AuthRequestMetadataShape) => AuthRequestMetadataShape;
|
|
103
48
|
}
|
|
104
|
-
declare const AuthOriginCheckMiddleware_base: HttpApiMiddleware.ServiceClass<AuthOriginCheckMiddleware, "auth/AuthOriginCheckMiddleware", {
|
|
105
|
-
requires: never;
|
|
106
|
-
provides: never;
|
|
107
|
-
error: typeof AuthRequestRejectedError;
|
|
108
|
-
clientError: never;
|
|
109
|
-
requiredForClient: false;
|
|
110
|
-
security: never;
|
|
111
|
-
}, HttpApiMiddleware.HttpApiMiddleware<never, typeof AuthRequestRejectedError, never>>;
|
|
112
|
-
export declare class AuthOriginCheckMiddleware extends AuthOriginCheckMiddleware_base {
|
|
113
|
-
}
|
|
114
49
|
declare const AuthRequestMetadataMiddleware_base: HttpApiMiddleware.ServiceClass<AuthRequestMetadataMiddleware, "auth/AuthRequestMetadataMiddleware", {
|
|
115
50
|
requires: never;
|
|
116
51
|
provides: AuthRequestMetadata;
|
|
@@ -121,16 +56,6 @@ declare const AuthRequestMetadataMiddleware_base: HttpApiMiddleware.ServiceClass
|
|
|
121
56
|
}, HttpApiMiddleware.HttpApiMiddleware<AuthRequestMetadata, never, never>>;
|
|
122
57
|
export declare class AuthRequestMetadataMiddleware extends AuthRequestMetadataMiddleware_base {
|
|
123
58
|
}
|
|
124
|
-
declare const AuthRateLimitMiddleware_base: HttpApiMiddleware.ServiceClass<AuthRateLimitMiddleware, "auth/AuthRateLimitMiddleware", {
|
|
125
|
-
requires: never;
|
|
126
|
-
provides: never;
|
|
127
|
-
error: readonly [typeof AuthRateLimitedError, typeof AuthInternalError];
|
|
128
|
-
clientError: never;
|
|
129
|
-
requiredForClient: false;
|
|
130
|
-
security: never;
|
|
131
|
-
}, HttpApiMiddleware.HttpApiMiddleware<never, readonly [typeof AuthRateLimitedError, typeof AuthInternalError], never>>;
|
|
132
|
-
export declare class AuthRateLimitMiddleware extends AuthRateLimitMiddleware_base {
|
|
133
|
-
}
|
|
134
59
|
declare const AuthCsrfMiddleware_base: HttpApiMiddleware.ServiceClass<AuthCsrfMiddleware, "auth/AuthCsrfMiddleware", {
|
|
135
60
|
requires: never;
|
|
136
61
|
provides: never;
|
|
@@ -142,18 +67,12 @@ declare const AuthCsrfMiddleware_base: HttpApiMiddleware.ServiceClass<AuthCsrfMi
|
|
|
142
67
|
export declare class AuthCsrfMiddleware extends AuthCsrfMiddleware_base {
|
|
143
68
|
}
|
|
144
69
|
export declare const makeAuthRequestMetadata: (request: HttpServerRequest.HttpServerRequest, options?: AuthRequestMetadataOptions) => AuthRequestMetadataShape;
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
};
|
|
70
|
+
type MapAuthGuardError<E> = E extends RateLimitExceededError ? AuthRateLimitedError : E extends CustomEvidencePolicyError | RateLimitStoreError | PrivacyError | StepUpCapabilityError | PermissionCheckError ? AuthInternalError : E extends StepUpRequired ? AuthStepUpRequiredError : E extends StepUpDenied | AuthorizationError ? AuthPolicyDeniedError : E;
|
|
71
|
+
export declare const customEvidencePolicyHttpFailure: (error: unknown, message?: string) => Effect.Effect<never, AuthInternalError> | undefined;
|
|
72
|
+
export declare const mapAuthGuardErrors: <A, E, R>(effect: Effect.Effect<A, E, R>) => Effect.Effect<A, MapAuthGuardError<E>, R>;
|
|
149
73
|
export declare const AuthHttpApiConfigLive: (config: AuthHttpApiConfigValue) => Layer.Layer<AuthHttpApiConfig, never, never>;
|
|
150
|
-
export declare const AuthApiRateLimitMiddlewareLive: Layer.Layer<AuthRateLimitMiddleware, never, AuthApiRateLimit>;
|
|
151
|
-
export declare const AuthApiRateLimitLive: Layer.Layer<AuthApiRateLimit | AuthRateLimitMiddleware, never, Privacy | RateLimiter>;
|
|
152
|
-
export declare const AuthApiRateLimitNoopLive: Layer.Layer<AuthApiRateLimit | AuthRateLimitMiddleware>;
|
|
153
74
|
export declare const AuthOriginCheckMiddlewareLive: (options?: AuthOriginCheckOptions) => Layer.Layer<AuthOriginCheckMiddleware, never, never>;
|
|
154
75
|
export declare const AuthOriginCheckMiddlewareConfigLive: Layer.Layer<AuthOriginCheckMiddleware, never, never>;
|
|
155
76
|
export declare const AuthRequestMetadataMiddlewareLive: (options?: AuthRequestMetadataOptions) => Layer.Layer<AuthRequestMetadataMiddleware, never, never>;
|
|
156
|
-
export declare const AuthRateLimitMiddlewareLive: (policy: AuthRateLimitPolicy, metadataOptions?: AuthRequestMetadataOptions) => Layer.Layer<AuthRateLimitMiddleware, never, Privacy | RateLimiter>;
|
|
157
77
|
export declare const AuthCsrfMiddlewareLive: (options?: AuthCsrfOptions) => Layer.Layer<AuthCsrfMiddleware, never, never>;
|
|
158
|
-
export {};
|
|
159
78
|
//# sourceMappingURL=Security.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Security.d.ts","sourceRoot":"","sources":["../../src/HttpApi/Security.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"Security.d.ts","sourceRoot":"","sources":["../../src/HttpApi/Security.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAU,MAAM,QAAQ,CAAC;AACxD,OAAO,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AACzD,OAAO,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAE5D,OAAO,EAAE,yBAAyB,EAAE,MAAM,iBAAiB,CAAC;AAC5D,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAEnD,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,kBAAkB,CAAC;AAC7D,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAC;AACvD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAClD,OAAO,KAAK,EACV,sBAAsB,EACtB,mBAAmB,EACpB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,KAAK,EACV,qBAAqB,EACrB,YAAY,EACZ,cAAc,EACf,MAAM,cAAc,CAAC;AACtB,OAAO,EACL,qBAAqB,EACrB,iBAAiB,EACjB,oBAAoB,EACpB,wBAAwB,EACxB,uBAAuB,EACxB,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,yBAAyB,EAAE,MAAM,iBAAiB,CAAC;AAE5D,OAAO,EAAE,yBAAyB,EAAE,MAAM,iBAAiB,CAAC;AAE5D,MAAM,WAAW,sBAAsB;IACrC,QAAQ,CAAC,cAAc,CAAC,EAAE,MAAM,GAAG,SAAS,MAAM,EAAE,CAAC;IACrD,QAAQ,CAAC,kBAAkB,CAAC,EAAE,OAAO,CAAC;CACvC;AAED,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;CAC9B;AAED,MAAM,WAAW,0BAA0B;IACzC,QAAQ,CAAC,iBAAiB,CAAC,EAAE,OAAO,CAAC;CACtC;AAED,MAAM,WAAW,wBAAwB;IACvC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,SAAS,CAAC,EAAE,SAAS,CAAC;IAC/B,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;CAC3B;AAED,MAAM,WAAW,sBAAsB;IACrC,QAAQ,CAAC,WAAW,CAAC,EAAE,sBAAsB,CAAC;IAC9C,QAAQ,CAAC,eAAe,CAAC,EAAE,0BAA0B,CAAC;CACvD;;AAED,qBAAa,iBAAkB,SAAQ,sBAGV;CAAG;AAEhC,yBAAiB,iBAAiB,CAAC;IAC1B,MAAM,IAAI,WACP,sBAAsB,KAC7B,sBAAsD,CAAC;CAC3D;;AAED,qBAAa,mBAAoB,SAAQ,wBAGV;CAAG;AAElC,yBAAiB,mBAAmB,CAAC;IAC5B,MAAM,IAAI,aACL,wBAAwB,KACjC,wBAA4D,CAAC;CACjE;;;;;;;;;AAED,qBAAa,6BAA8B,SAAQ,kCAGV;CAAG;;;;;;;;;AAE5C,qBAAa,kBAAmB,SAAQ,uBAGvC;CAAG;AA4EJ,eAAO,MAAM,uBAAuB,YACzB,iBAAiB,CAAC,iBAAiB,YACnC,0BAA0B,KAClC,wBAaF,CAAC;AAaF,KAAK,iBAAiB,CAAC,CAAC,IAAI,CAAC,SAAS,sBAAsB,GACxD,oBAAoB,GACpB,CAAC,SACK,yBAAyB,GACzB,mBAAmB,GACnB,YAAY,GACZ,qBAAqB,GACrB,oBAAoB,GACxB,iBAAiB,GACjB,CAAC,SAAS,cAAc,GACtB,uBAAuB,GACvB,CAAC,SAAS,YAAY,GAAG,kBAAkB,GACzC,qBAAqB,GACrB,CAAC,CAAC;AAkBZ,eAAO,MAAM,+BAA+B,UACnC,OAAO,uBAEb,MAAM,CAAC,MAAM,CAAC,KAAK,EAAE,iBAAiB,CAAC,GAAG,SAmB5C,CAAC;AAEF,eAAO,MAAM,kBAAkB,GAAI,CAAC,EAAE,CAAC,EAAE,CAAC,UAChC,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,KAC7B,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,iBAAiB,CAAC,CAAC,CAAC,EAAE,CAAC,CA6E1C,CAAC;AAoFF,eAAO,MAAM,qBAAqB,WAAY,sBAAsB,iDACF,CAAC;AAEnE,eAAO,MAAM,6BAA6B,aAC/B,sBAAsB,yDAwBhC,CAAC;AAEF,eAAO,MAAM,mCAAmC,sDAS/C,CAAC;AAEF,eAAO,MAAM,iCAAiC,aACnC,0BAA0B,6DAalC,CAAC;AAEJ,eAAO,MAAM,sBAAsB,aAAa,eAAe,kDAoB9D,CAAC"}
|
package/dist/HttpApi/Security.js
CHANGED
|
@@ -1,15 +1,11 @@
|
|
|
1
|
-
import { Context,
|
|
1
|
+
import { Context, Effect, Layer, Option } from "effect";
|
|
2
2
|
import { HttpServerRequest } from "effect/unstable/http";
|
|
3
3
|
import { HttpApiMiddleware } from "effect/unstable/httpapi";
|
|
4
|
+
import { CustomEvidencePolicyError } from "../Assurance.js";
|
|
4
5
|
import { IpAddress as makeIpAddress } from "../Identifiers.js";
|
|
5
|
-
import {
|
|
6
|
-
import {
|
|
7
|
-
|
|
8
|
-
export class AuthApiRateLimit extends Context.Service()("auth/AuthApiRateLimit") {
|
|
9
|
-
}
|
|
10
|
-
(function (AuthApiRateLimit) {
|
|
11
|
-
AuthApiRateLimit.make = (service) => AuthApiRateLimit.of(service);
|
|
12
|
-
})(AuthApiRateLimit || (AuthApiRateLimit = {}));
|
|
6
|
+
import { AuthPolicyDeniedError, AuthInternalError, AuthRateLimitedError, AuthRequestRejectedError, AuthStepUpRequiredError, } from "./Errors.js";
|
|
7
|
+
import { AuthOriginCheckMiddleware } from "./Middleware.js";
|
|
8
|
+
export { AuthOriginCheckMiddleware } from "./Middleware.js";
|
|
13
9
|
export class AuthHttpApiConfig extends Context.Service()("auth/AuthHttpApiConfig") {
|
|
14
10
|
}
|
|
15
11
|
(function (AuthHttpApiConfig) {
|
|
@@ -20,12 +16,8 @@ export class AuthRequestMetadata extends Context.Service()("auth/AuthRequestMeta
|
|
|
20
16
|
(function (AuthRequestMetadata) {
|
|
21
17
|
AuthRequestMetadata.make = (metadata) => AuthRequestMetadata.of(metadata);
|
|
22
18
|
})(AuthRequestMetadata || (AuthRequestMetadata = {}));
|
|
23
|
-
export class AuthOriginCheckMiddleware extends HttpApiMiddleware.Service()("auth/AuthOriginCheckMiddleware", { error: AuthRequestRejectedError }) {
|
|
24
|
-
}
|
|
25
19
|
export class AuthRequestMetadataMiddleware extends HttpApiMiddleware.Service()("auth/AuthRequestMetadataMiddleware") {
|
|
26
20
|
}
|
|
27
|
-
export class AuthRateLimitMiddleware extends HttpApiMiddleware.Service()("auth/AuthRateLimitMiddleware", { error: [AuthRateLimitedError, AuthInternalError] }) {
|
|
28
|
-
}
|
|
29
21
|
export class AuthCsrfMiddleware extends HttpApiMiddleware.Service()("auth/AuthCsrfMiddleware", { error: AuthRequestRejectedError }) {
|
|
30
22
|
}
|
|
31
23
|
const unsafeMethods = new Set(["POST", "PUT", "PATCH", "DELETE"]);
|
|
@@ -93,6 +85,66 @@ export const makeAuthRequestMetadata = (request, options = {}) => {
|
|
|
93
85
|
referer: firstHeaderValue(request.headers.referer),
|
|
94
86
|
});
|
|
95
87
|
};
|
|
88
|
+
const findCustomEvidencePolicyError = (error) => {
|
|
89
|
+
if (error instanceof CustomEvidencePolicyError) {
|
|
90
|
+
return error;
|
|
91
|
+
}
|
|
92
|
+
if (typeof error !== "object" || error === null || !("cause" in error)) {
|
|
93
|
+
return undefined;
|
|
94
|
+
}
|
|
95
|
+
return error.cause instanceof CustomEvidencePolicyError
|
|
96
|
+
? error.cause
|
|
97
|
+
: undefined;
|
|
98
|
+
};
|
|
99
|
+
export const customEvidencePolicyHttpFailure = (error, message = "Failed to evaluate authentication evidence policy") => {
|
|
100
|
+
const policyError = findCustomEvidencePolicyError(error);
|
|
101
|
+
if (policyError === undefined) {
|
|
102
|
+
return undefined;
|
|
103
|
+
}
|
|
104
|
+
return Effect.gen(function* () {
|
|
105
|
+
yield* Effect.annotateCurrentSpan({
|
|
106
|
+
"auth.custom_evidence_policy.reason": policyError.reason,
|
|
107
|
+
"auth.custom_evidence_policy.id": policyError.policyId,
|
|
108
|
+
"auth.custom_evidence_policy.version": policyError.policyVersion,
|
|
109
|
+
});
|
|
110
|
+
return yield* new AuthInternalError({
|
|
111
|
+
code: "internal_error",
|
|
112
|
+
message,
|
|
113
|
+
});
|
|
114
|
+
});
|
|
115
|
+
};
|
|
116
|
+
export const mapAuthGuardErrors = (effect) => {
|
|
117
|
+
const source = effect;
|
|
118
|
+
return source.pipe(Effect.catchTag("CustomEvidencePolicyError", (error) => customEvidencePolicyHttpFailure(error)), Effect.catchTag("RateLimitExceededError", (error) => Effect.fail(new AuthRateLimitedError({
|
|
119
|
+
code: "rate_limited",
|
|
120
|
+
message: "Too many requests",
|
|
121
|
+
retryAfter: error.retryAfter,
|
|
122
|
+
}))), Effect.catchTag("RateLimitStoreError", () => Effect.fail(new AuthInternalError({
|
|
123
|
+
code: "internal_error",
|
|
124
|
+
message: "Failed to consume rate limit",
|
|
125
|
+
}))), Effect.catchTag("PrivacyError", () => Effect.fail(new AuthInternalError({
|
|
126
|
+
code: "internal_error",
|
|
127
|
+
message: "Failed to build rate limit key",
|
|
128
|
+
}))), Effect.catchTag("StepUpRequired", (error) => Effect.fail(new AuthStepUpRequiredError({
|
|
129
|
+
code: "step_up_required",
|
|
130
|
+
message: "Step-up authentication required",
|
|
131
|
+
...(error.capabilities === undefined
|
|
132
|
+
? {}
|
|
133
|
+
: { capabilities: [...error.capabilities] }),
|
|
134
|
+
}))), Effect.catchTag("StepUpDenied", () => Effect.fail(new AuthPolicyDeniedError({
|
|
135
|
+
code: "policy_denied",
|
|
136
|
+
message: "Access denied",
|
|
137
|
+
}))), Effect.catchTag("StepUpCapabilityError", () => Effect.fail(new AuthInternalError({
|
|
138
|
+
code: "internal_error",
|
|
139
|
+
message: "Failed to evaluate step-up capabilities",
|
|
140
|
+
}))), Effect.catchTag("AuthorizationError", () => Effect.fail(new AuthPolicyDeniedError({
|
|
141
|
+
code: "policy_denied",
|
|
142
|
+
message: "Access denied",
|
|
143
|
+
}))), Effect.catchTag("PermissionCheckError", () => Effect.fail(new AuthInternalError({
|
|
144
|
+
code: "internal_error",
|
|
145
|
+
message: "Failed to check permission policy",
|
|
146
|
+
}))));
|
|
147
|
+
};
|
|
96
148
|
const originFromReferer = (referer) => referer === undefined ? undefined : normalizeOrigin(referer);
|
|
97
149
|
const requestOriginCandidates = (request) => {
|
|
98
150
|
const originalOrigin = normalizeOrigin(request.originalUrl);
|
|
@@ -138,320 +190,7 @@ const csrfAllowed = (request, options) => {
|
|
|
138
190
|
fromCookie.length > 0 &&
|
|
139
191
|
fromCookie === fromHeader);
|
|
140
192
|
};
|
|
141
|
-
export const AuthRateLimitPolicy = {
|
|
142
|
-
fixedWindowByIp: (options) => (input) => Effect.gen(function* () {
|
|
143
|
-
const privacy = yield* Privacy;
|
|
144
|
-
const key = input.metadata.ipAddress === undefined
|
|
145
|
-
? RateLimitKey.customHash("ip", "missing")
|
|
146
|
-
: RateLimitKey.ipHash(yield* privacy.ipHash(input.metadata.ipAddress));
|
|
147
|
-
return RateLimitPolicy.fixedWindow({
|
|
148
|
-
id: options.id,
|
|
149
|
-
key,
|
|
150
|
-
limit: options.limit,
|
|
151
|
-
tokens: options.tokens,
|
|
152
|
-
window: options.window,
|
|
153
|
-
});
|
|
154
|
-
}),
|
|
155
|
-
byEndpoint: (policies) => (input) => policies[`${input.group.identifier}.${input.endpoint.name}`]?.(input) ??
|
|
156
|
-
Effect.succeed(undefined),
|
|
157
|
-
};
|
|
158
|
-
const authApiRateLimitDefaults = {
|
|
159
|
-
trustProxyHeaders: false,
|
|
160
|
-
passwordSignIn: {
|
|
161
|
-
byIp: {
|
|
162
|
-
id: "auth.password.sign_in.ip",
|
|
163
|
-
limit: 20,
|
|
164
|
-
window: Duration.minutes(10),
|
|
165
|
-
},
|
|
166
|
-
byEmail: {
|
|
167
|
-
id: "auth.password.sign_in.email",
|
|
168
|
-
limit: 5,
|
|
169
|
-
window: Duration.minutes(10),
|
|
170
|
-
},
|
|
171
|
-
},
|
|
172
|
-
passwordSignUp: {
|
|
173
|
-
byIp: {
|
|
174
|
-
id: "auth.password.sign_up.ip",
|
|
175
|
-
limit: 10,
|
|
176
|
-
window: Duration.hours(1),
|
|
177
|
-
},
|
|
178
|
-
byEmail: {
|
|
179
|
-
id: "auth.password.sign_up.email",
|
|
180
|
-
limit: 3,
|
|
181
|
-
window: Duration.hours(1),
|
|
182
|
-
},
|
|
183
|
-
},
|
|
184
|
-
passwordResetStart: {
|
|
185
|
-
byIp: {
|
|
186
|
-
id: "auth.password.reset_start.ip",
|
|
187
|
-
limit: 10,
|
|
188
|
-
window: Duration.minutes(10),
|
|
189
|
-
},
|
|
190
|
-
byEmail: {
|
|
191
|
-
id: "auth.password.reset_start.email",
|
|
192
|
-
limit: 3,
|
|
193
|
-
window: Duration.minutes(10),
|
|
194
|
-
},
|
|
195
|
-
},
|
|
196
|
-
passwordResetVerify: {
|
|
197
|
-
byIp: {
|
|
198
|
-
id: "auth.password.reset_verify.ip",
|
|
199
|
-
limit: 20,
|
|
200
|
-
window: Duration.minutes(10),
|
|
201
|
-
},
|
|
202
|
-
},
|
|
203
|
-
emailOtpStart: {
|
|
204
|
-
byIp: {
|
|
205
|
-
id: "auth.email_otp.start.ip",
|
|
206
|
-
limit: 10,
|
|
207
|
-
window: Duration.minutes(10),
|
|
208
|
-
},
|
|
209
|
-
byEmail: {
|
|
210
|
-
id: "auth.email_otp.start.email",
|
|
211
|
-
limit: 5,
|
|
212
|
-
window: Duration.minutes(10),
|
|
213
|
-
},
|
|
214
|
-
},
|
|
215
|
-
emailOtpVerify: {
|
|
216
|
-
byIp: {
|
|
217
|
-
id: "auth.email_otp.verify.ip",
|
|
218
|
-
limit: 20,
|
|
219
|
-
window: Duration.minutes(10),
|
|
220
|
-
},
|
|
221
|
-
},
|
|
222
|
-
magicLinkStart: {
|
|
223
|
-
byIp: {
|
|
224
|
-
id: "auth.magic_link.start.ip",
|
|
225
|
-
limit: 10,
|
|
226
|
-
window: Duration.minutes(10),
|
|
227
|
-
},
|
|
228
|
-
byEmail: {
|
|
229
|
-
id: "auth.magic_link.start.email",
|
|
230
|
-
limit: 5,
|
|
231
|
-
window: Duration.minutes(10),
|
|
232
|
-
},
|
|
233
|
-
},
|
|
234
|
-
magicLinkVerify: {
|
|
235
|
-
byIp: {
|
|
236
|
-
id: "auth.magic_link.verify.ip",
|
|
237
|
-
limit: 20,
|
|
238
|
-
window: Duration.minutes(10),
|
|
239
|
-
},
|
|
240
|
-
},
|
|
241
|
-
emailVerificationStart: {
|
|
242
|
-
byIp: {
|
|
243
|
-
id: "auth.email_verification.start.ip",
|
|
244
|
-
limit: 10,
|
|
245
|
-
window: Duration.minutes(10),
|
|
246
|
-
},
|
|
247
|
-
byEmail: {
|
|
248
|
-
id: "auth.email_verification.start.email",
|
|
249
|
-
limit: 3,
|
|
250
|
-
window: Duration.minutes(10),
|
|
251
|
-
},
|
|
252
|
-
},
|
|
253
|
-
};
|
|
254
|
-
const resolveAuthApiRateLimitRule = (defaults, config) => {
|
|
255
|
-
if (config === false) {
|
|
256
|
-
return undefined;
|
|
257
|
-
}
|
|
258
|
-
if (config === undefined || config === true) {
|
|
259
|
-
return defaults;
|
|
260
|
-
}
|
|
261
|
-
return {
|
|
262
|
-
id: defaults.id,
|
|
263
|
-
limit: config.limit ?? defaults.limit,
|
|
264
|
-
tokens: config.tokens ?? defaults.tokens,
|
|
265
|
-
window: config.window ?? defaults.window,
|
|
266
|
-
};
|
|
267
|
-
};
|
|
268
|
-
const resolveAuthApiEndpointRateLimit = (defaults, config) => {
|
|
269
|
-
if (config === false) {
|
|
270
|
-
return undefined;
|
|
271
|
-
}
|
|
272
|
-
if (config === undefined || config === true) {
|
|
273
|
-
return defaults;
|
|
274
|
-
}
|
|
275
|
-
const byIp = defaults.byIp === undefined
|
|
276
|
-
? undefined
|
|
277
|
-
: resolveAuthApiRateLimitRule(defaults.byIp, config.byIp);
|
|
278
|
-
const byEmail = defaults.byEmail === undefined
|
|
279
|
-
? undefined
|
|
280
|
-
: resolveAuthApiRateLimitRule(defaults.byEmail, config.byEmail);
|
|
281
|
-
return byIp === undefined && byEmail === undefined
|
|
282
|
-
? undefined
|
|
283
|
-
: { byIp, byEmail };
|
|
284
|
-
};
|
|
285
|
-
const resolveAuthApiRateLimitConfig = (config) => {
|
|
286
|
-
if (config === false) {
|
|
287
|
-
return undefined;
|
|
288
|
-
}
|
|
289
|
-
if (config === true) {
|
|
290
|
-
return authApiRateLimitDefaults;
|
|
291
|
-
}
|
|
292
|
-
return {
|
|
293
|
-
trustProxyHeaders: config.trustProxyHeaders ?? authApiRateLimitDefaults.trustProxyHeaders,
|
|
294
|
-
passwordSignIn: resolveAuthApiEndpointRateLimit(authApiRateLimitDefaults.passwordSignIn, config.passwordSignIn),
|
|
295
|
-
passwordSignUp: resolveAuthApiEndpointRateLimit(authApiRateLimitDefaults.passwordSignUp, config.passwordSignUp),
|
|
296
|
-
passwordResetStart: resolveAuthApiEndpointRateLimit(authApiRateLimitDefaults.passwordResetStart, config.passwordResetStart),
|
|
297
|
-
passwordResetVerify: resolveAuthApiEndpointRateLimit(authApiRateLimitDefaults.passwordResetVerify, config.passwordResetVerify),
|
|
298
|
-
emailOtpStart: resolveAuthApiEndpointRateLimit(authApiRateLimitDefaults.emailOtpStart, config.emailOtpStart),
|
|
299
|
-
emailOtpVerify: resolveAuthApiEndpointRateLimit(authApiRateLimitDefaults.emailOtpVerify, config.emailOtpVerify),
|
|
300
|
-
magicLinkStart: resolveAuthApiEndpointRateLimit(authApiRateLimitDefaults.magicLinkStart, config.magicLinkStart),
|
|
301
|
-
magicLinkVerify: resolveAuthApiEndpointRateLimit(authApiRateLimitDefaults.magicLinkVerify, config.magicLinkVerify),
|
|
302
|
-
emailVerificationStart: resolveAuthApiEndpointRateLimit(authApiRateLimitDefaults.emailVerificationStart, config.emailVerificationStart),
|
|
303
|
-
};
|
|
304
|
-
};
|
|
305
|
-
const makeRateLimitPolicy = (rule, key) => RateLimitPolicy.fixedWindow({
|
|
306
|
-
id: rule.id,
|
|
307
|
-
key,
|
|
308
|
-
limit: rule.limit,
|
|
309
|
-
tokens: rule.tokens,
|
|
310
|
-
window: rule.window,
|
|
311
|
-
});
|
|
312
|
-
const endpointKey = (input) => `${input.group.identifier}.${input.endpoint.name}`;
|
|
313
|
-
const requestIpRuleByEndpoint = new Map([
|
|
314
|
-
["password.signIn", (config) => config.passwordSignIn?.byIp],
|
|
315
|
-
["password.signUp", (config) => config.passwordSignUp?.byIp],
|
|
316
|
-
["password.resetStart", (config) => config.passwordResetStart?.byIp],
|
|
317
|
-
["password.resetVerify", (config) => config.passwordResetVerify?.byIp],
|
|
318
|
-
["emailOtp.start", (config) => config.emailOtpStart?.byIp],
|
|
319
|
-
["emailOtp.verify", (config) => config.emailOtpVerify?.byIp],
|
|
320
|
-
["magicLink.start", (config) => config.magicLinkStart?.byIp],
|
|
321
|
-
["magicLink.verify", (config) => config.magicLinkVerify?.byIp],
|
|
322
|
-
[
|
|
323
|
-
"emailVerification.start",
|
|
324
|
-
(config) => config.emailVerificationStart?.byIp,
|
|
325
|
-
],
|
|
326
|
-
]);
|
|
327
|
-
const requestIpRule = (config, input) => config === undefined
|
|
328
|
-
? undefined
|
|
329
|
-
: requestIpRuleByEndpoint.get(endpointKey(input))?.(config);
|
|
330
|
-
const ipRateLimitKey = (privacy, metadata) => metadata.ipAddress === undefined
|
|
331
|
-
? Effect.succeed(RateLimitKey.customHash("ip", "missing"))
|
|
332
|
-
: Effect.map(privacy.ipHash(metadata.ipAddress), RateLimitKey.ipHash);
|
|
333
|
-
const consumeRule = (rateLimiter, rule, key) => rateLimiter.require(makeRateLimitPolicy(rule, key));
|
|
334
|
-
const authApiRateLimitConfig = Effect.gen(function* () {
|
|
335
|
-
const configOption = yield* Effect.serviceOption(AuthHttpApiConfig);
|
|
336
|
-
const config = Option.isSome(configOption)
|
|
337
|
-
? (configOption.value.rateLimit ?? true)
|
|
338
|
-
: true;
|
|
339
|
-
return resolveAuthApiRateLimitConfig(config);
|
|
340
|
-
});
|
|
341
|
-
const noopAuthApiRateLimit = AuthApiRateLimit.make({
|
|
342
|
-
request: () => Effect.void,
|
|
343
|
-
passwordSignIn: () => Effect.void,
|
|
344
|
-
passwordSignUp: () => Effect.void,
|
|
345
|
-
passwordResetStart: () => Effect.void,
|
|
346
|
-
emailOtpStart: () => Effect.void,
|
|
347
|
-
magicLinkStart: () => Effect.void,
|
|
348
|
-
emailVerificationStart: () => Effect.void,
|
|
349
|
-
});
|
|
350
|
-
const makeAuthApiRateLimit = (config, dependencies) => {
|
|
351
|
-
if (config === undefined) {
|
|
352
|
-
return noopAuthApiRateLimit;
|
|
353
|
-
}
|
|
354
|
-
return AuthApiRateLimit.make({
|
|
355
|
-
request: (input) => Effect.gen(function* () {
|
|
356
|
-
const rule = requestIpRule(config, input);
|
|
357
|
-
if (rule === undefined) {
|
|
358
|
-
return;
|
|
359
|
-
}
|
|
360
|
-
const key = yield* ipRateLimitKey(dependencies.privacy, input.metadata);
|
|
361
|
-
yield* consumeRule(dependencies.rateLimiter, rule, key);
|
|
362
|
-
}),
|
|
363
|
-
passwordSignIn: (input) => Effect.gen(function* () {
|
|
364
|
-
const rule = config.passwordSignIn?.byEmail;
|
|
365
|
-
if (rule === undefined) {
|
|
366
|
-
return;
|
|
367
|
-
}
|
|
368
|
-
const emailHash = yield* dependencies.privacy.emailHash(input.email);
|
|
369
|
-
yield* consumeRule(dependencies.rateLimiter, rule, RateLimitKey.emailHash(emailHash));
|
|
370
|
-
}),
|
|
371
|
-
passwordSignUp: (input) => Effect.gen(function* () {
|
|
372
|
-
const rule = config.passwordSignUp?.byEmail;
|
|
373
|
-
if (rule === undefined) {
|
|
374
|
-
return;
|
|
375
|
-
}
|
|
376
|
-
const emailHash = yield* dependencies.privacy.emailHash(input.email);
|
|
377
|
-
yield* consumeRule(dependencies.rateLimiter, rule, RateLimitKey.emailHash(emailHash));
|
|
378
|
-
}),
|
|
379
|
-
passwordResetStart: (input) => Effect.gen(function* () {
|
|
380
|
-
const rule = config.passwordResetStart?.byEmail;
|
|
381
|
-
if (rule === undefined) {
|
|
382
|
-
return;
|
|
383
|
-
}
|
|
384
|
-
const emailHash = yield* dependencies.privacy.emailHash(input.email);
|
|
385
|
-
yield* consumeRule(dependencies.rateLimiter, rule, RateLimitKey.emailHash(emailHash));
|
|
386
|
-
}),
|
|
387
|
-
emailOtpStart: (input) => Effect.gen(function* () {
|
|
388
|
-
const rule = config.emailOtpStart?.byEmail;
|
|
389
|
-
if (rule === undefined) {
|
|
390
|
-
return;
|
|
391
|
-
}
|
|
392
|
-
const emailHash = yield* dependencies.privacy.emailHash(input.email);
|
|
393
|
-
yield* consumeRule(dependencies.rateLimiter, rule, RateLimitKey.emailHash(emailHash));
|
|
394
|
-
}),
|
|
395
|
-
magicLinkStart: (input) => Effect.gen(function* () {
|
|
396
|
-
const rule = config.magicLinkStart?.byEmail;
|
|
397
|
-
if (rule === undefined) {
|
|
398
|
-
return;
|
|
399
|
-
}
|
|
400
|
-
const emailHash = yield* dependencies.privacy.emailHash(input.email);
|
|
401
|
-
yield* consumeRule(dependencies.rateLimiter, rule, RateLimitKey.emailHash(emailHash));
|
|
402
|
-
}),
|
|
403
|
-
emailVerificationStart: (input) => Effect.gen(function* () {
|
|
404
|
-
const rule = config.emailVerificationStart?.byEmail;
|
|
405
|
-
if (rule === undefined) {
|
|
406
|
-
return;
|
|
407
|
-
}
|
|
408
|
-
const emailHash = yield* dependencies.privacy.emailHash(input.email);
|
|
409
|
-
yield* consumeRule(dependencies.rateLimiter, rule, RateLimitKey.emailHash(emailHash));
|
|
410
|
-
}),
|
|
411
|
-
});
|
|
412
|
-
};
|
|
413
|
-
const rateLimitMiddlewareError = (effect) => effect.pipe(Effect.catchTag("RateLimitExceededError", (error) => Effect.fail(new AuthRateLimitedError({
|
|
414
|
-
code: "rate_limited",
|
|
415
|
-
message: "Too many requests",
|
|
416
|
-
retryAfter: error.retryAfter,
|
|
417
|
-
}))), Effect.catchTag("RateLimitStoreError", () => Effect.fail(new AuthInternalError({
|
|
418
|
-
code: "internal_error",
|
|
419
|
-
message: "Failed to consume rate limit",
|
|
420
|
-
}))), Effect.catchTag("PrivacyError", () => Effect.fail(new AuthInternalError({
|
|
421
|
-
code: "internal_error",
|
|
422
|
-
message: "Failed to build rate limit key",
|
|
423
|
-
}))));
|
|
424
193
|
export const AuthHttpApiConfigLive = (config) => Layer.succeed(AuthHttpApiConfig, AuthHttpApiConfig.make(config));
|
|
425
|
-
const AuthApiRateLimitServiceLive = Layer.effect(AuthApiRateLimit)(Effect.gen(function* () {
|
|
426
|
-
const config = yield* authApiRateLimitConfig;
|
|
427
|
-
if (config === undefined) {
|
|
428
|
-
return noopAuthApiRateLimit;
|
|
429
|
-
}
|
|
430
|
-
const privacy = yield* Privacy;
|
|
431
|
-
const rateLimiter = yield* RateLimiter;
|
|
432
|
-
return makeAuthApiRateLimit(config, { privacy, rateLimiter });
|
|
433
|
-
}));
|
|
434
|
-
export const AuthApiRateLimitMiddlewareLive = Layer.effect(AuthRateLimitMiddleware)(Effect.gen(function* () {
|
|
435
|
-
const config = yield* authApiRateLimitConfig;
|
|
436
|
-
const authApiRateLimit = yield* AuthApiRateLimit;
|
|
437
|
-
if (config === undefined) {
|
|
438
|
-
return (httpEffect) => httpEffect;
|
|
439
|
-
}
|
|
440
|
-
return (httpEffect, options) => Effect.gen(function* () {
|
|
441
|
-
const request = yield* HttpServerRequest.HttpServerRequest;
|
|
442
|
-
const metadata = makeAuthRequestMetadata(request, {
|
|
443
|
-
trustProxyHeaders: config.trustProxyHeaders,
|
|
444
|
-
});
|
|
445
|
-
yield* rateLimitMiddlewareError(authApiRateLimit.request({
|
|
446
|
-
metadata,
|
|
447
|
-
endpoint: options.endpoint,
|
|
448
|
-
group: options.group,
|
|
449
|
-
}));
|
|
450
|
-
return yield* httpEffect;
|
|
451
|
-
});
|
|
452
|
-
}));
|
|
453
|
-
export const AuthApiRateLimitLive = Layer.merge(AuthApiRateLimitServiceLive, AuthApiRateLimitMiddlewareLive.pipe(Layer.provide(AuthApiRateLimitServiceLive)));
|
|
454
|
-
export const AuthApiRateLimitNoopLive = Layer.merge(Layer.succeed(AuthApiRateLimit, noopAuthApiRateLimit), Layer.succeed(AuthRateLimitMiddleware, (httpEffect) => httpEffect));
|
|
455
194
|
export const AuthOriginCheckMiddlewareLive = (options = {}) => {
|
|
456
195
|
const allowedOrigins = new Set(allowedOriginValues(options.allowedOrigins).flatMap((origin) => {
|
|
457
196
|
const normalized = normalizeOrigin(origin);
|
|
@@ -481,36 +220,6 @@ export const AuthRequestMetadataMiddlewareLive = (options = {}) => Layer.succeed
|
|
|
481
220
|
const metadata = makeAuthRequestMetadata(request, options);
|
|
482
221
|
return yield* Effect.provideService(httpEffect, AuthRequestMetadata, metadata);
|
|
483
222
|
}));
|
|
484
|
-
export const AuthRateLimitMiddlewareLive = (policy, metadataOptions = {}) => Layer.effect(AuthRateLimitMiddleware, Effect.gen(function* () {
|
|
485
|
-
const rateLimiter = yield* RateLimiter;
|
|
486
|
-
const privacy = yield* Privacy;
|
|
487
|
-
return (httpEffect, options) => Effect.gen(function* () {
|
|
488
|
-
const request = yield* HttpServerRequest.HttpServerRequest;
|
|
489
|
-
const metadata = makeAuthRequestMetadata(request, metadataOptions);
|
|
490
|
-
const rateLimitPolicy = yield* policy({
|
|
491
|
-
metadata,
|
|
492
|
-
endpoint: options.endpoint,
|
|
493
|
-
group: options.group,
|
|
494
|
-
}).pipe(Effect.provideService(Privacy, privacy), Effect.mapError(() => new AuthInternalError({
|
|
495
|
-
code: "internal_error",
|
|
496
|
-
message: "Failed to build rate limit policy",
|
|
497
|
-
})));
|
|
498
|
-
if (rateLimitPolicy !== undefined) {
|
|
499
|
-
const decision = yield* rateLimiter.consume(rateLimitPolicy).pipe(Effect.mapError(() => new AuthInternalError({
|
|
500
|
-
code: "internal_error",
|
|
501
|
-
message: "Failed to consume rate limit",
|
|
502
|
-
})));
|
|
503
|
-
if (decision.type === "denied") {
|
|
504
|
-
return yield* new AuthRateLimitedError({
|
|
505
|
-
code: "rate_limited",
|
|
506
|
-
message: "Too many requests",
|
|
507
|
-
retryAfter: decision.retryAfter,
|
|
508
|
-
});
|
|
509
|
-
}
|
|
510
|
-
}
|
|
511
|
-
return yield* httpEffect;
|
|
512
|
-
});
|
|
513
|
-
}));
|
|
514
223
|
export const AuthCsrfMiddlewareLive = (options = {}) => {
|
|
515
224
|
const resolved = {
|
|
516
225
|
cookieName: options.cookieName ?? "__Host-csrf",
|