@absolutejs/auth 0.65.1 → 0.65.3

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.
Files changed (265) hide show
  1. package/dist/abuse/captcha.d.ts +11 -0
  2. package/dist/abuse/config.d.ts +29 -0
  3. package/dist/actions.d.ts +27 -0
  4. package/dist/adaptive/config.d.ts +34 -0
  5. package/dist/adaptive/fingerprint.d.ts +2 -0
  6. package/dist/adaptive/inMemoryStores.d.ts +3 -0
  7. package/dist/adaptive/postgresStores.d.ts +245 -0
  8. package/dist/adaptive/types.d.ts +62 -0
  9. package/dist/agents/config.d.ts +49 -0
  10. package/dist/agents/context.d.ts +46 -0
  11. package/dist/agents/idJag.d.ts +49 -0
  12. package/dist/agents/inMemoryStores.d.ts +4 -0
  13. package/dist/agents/index.d.ts +13 -0
  14. package/dist/agents/oauthGuide.d.ts +18 -0
  15. package/dist/agents/oidcAdapter.d.ts +20 -0
  16. package/dist/agents/postgresStores.d.ts +1176 -0
  17. package/dist/agents/principal.d.ts +4 -0
  18. package/dist/agents/registration.d.ts +162 -0
  19. package/dist/agents/registrationClient.d.ts +50 -0
  20. package/dist/agents/routes.d.ts +256 -0
  21. package/dist/agents/types.d.ts +129 -0
  22. package/dist/apikeys/config.d.ts +64 -0
  23. package/dist/apikeys/inMemoryStores.d.ts +4 -0
  24. package/dist/apikeys/postgresStores.d.ts +359 -0
  25. package/dist/apikeys/routes.d.ts +83 -0
  26. package/dist/apikeys/types.d.ts +53 -0
  27. package/dist/audit/config.d.ts +9 -0
  28. package/dist/audit/export.d.ts +2 -0
  29. package/dist/audit/inMemoryAuditStore.d.ts +2 -0
  30. package/dist/audit/integrity.d.ts +19 -0
  31. package/dist/audit/postgresAuditStore.d.ts +116 -0
  32. package/dist/audit/siem.d.ts +11 -0
  33. package/dist/audit/types.d.ts +21 -0
  34. package/dist/audit/wrap.d.ts +11 -0
  35. package/dist/authContext.d.ts +193 -0
  36. package/dist/authorization/config.d.ts +19 -0
  37. package/dist/authorization/protectPermission.d.ts +52 -0
  38. package/dist/cli/import/auth0.d.ts +2 -0
  39. package/dist/cli/import/clerk.d.ts +2 -0
  40. package/dist/cli/import/index.d.ts +10 -0
  41. package/dist/cli/import/lucia.d.ts +2 -0
  42. package/dist/cli/import/nextauth.d.ts +2 -0
  43. package/dist/cli/import/supabase.d.ts +2 -0
  44. package/dist/cli/import/types.d.ts +27 -0
  45. package/dist/cli/migrate.d.ts +2 -0
  46. package/dist/cli/migrate.js.map +2 -2
  47. package/dist/client/components/react/SignIn.d.ts +32 -0
  48. package/dist/client/components/react/SignUp.d.ts +29 -0
  49. package/dist/client/components/react/UserButton.d.ts +36 -0
  50. package/dist/client/createAuthClient.d.ts +285 -0
  51. package/dist/client/index.d.ts +4 -0
  52. package/dist/client/passkeyHelpers.d.ts +19 -0
  53. package/dist/client/react.d.ts +87 -0
  54. package/dist/client/sessionExpiry.d.ts +37 -0
  55. package/dist/client/solid.d.ts +86 -0
  56. package/dist/client/svelte.d.ts +86 -0
  57. package/dist/client/vue.d.ts +88 -0
  58. package/dist/compliance/cipher.d.ts +11 -0
  59. package/dist/compliance/config.d.ts +18 -0
  60. package/dist/compliance/redaction.d.ts +8 -0
  61. package/dist/compliance/routes.d.ts +89 -0
  62. package/dist/constants.d.ts +10 -0
  63. package/dist/credentials/backgroundOps.d.ts +45 -0
  64. package/dist/credentials/config.d.ts +94 -0
  65. package/dist/credentials/emailValidation.d.ts +9 -0
  66. package/dist/credentials/emailVerification.d.ts +83 -0
  67. package/dist/credentials/import.d.ts +49 -0
  68. package/dist/credentials/inMemoryCredentialStore.d.ts +2 -0
  69. package/dist/credentials/legacyHashers.d.ts +3 -0
  70. package/dist/credentials/login.d.ts +76 -0
  71. package/dist/credentials/passwordPolicy.d.ts +15 -0
  72. package/dist/credentials/passwordReset.d.ts +87 -0
  73. package/dist/credentials/postgresCredentialStore.d.ts +235 -0
  74. package/dist/credentials/register.d.ts +54 -0
  75. package/dist/credentials/routes.d.ts +201 -0
  76. package/dist/credentials/types.d.ts +26 -0
  77. package/dist/crypto.d.ts +32 -0
  78. package/dist/csrf.d.ts +10 -0
  79. package/dist/errors.d.ts +12 -0
  80. package/dist/federation/tokenStore.d.ts +29 -0
  81. package/dist/fga/config.d.ts +53 -0
  82. package/dist/fga/inMemoryStores.d.ts +3 -0
  83. package/dist/fga/postgresStores.d.ts +116 -0
  84. package/dist/fga/redisCheckCache.d.ts +11 -0
  85. package/dist/fga/schema.d.ts +2 -0
  86. package/dist/fga/types.d.ts +28 -0
  87. package/dist/fingerprint-client/index.d.ts +26 -0
  88. package/dist/htmx/configuredRoutes.d.ts +542 -0
  89. package/dist/htmx/index.d.ts +2 -0
  90. package/dist/htmx/renderers.d.ts +8 -0
  91. package/dist/htmx/routes.d.ts +514 -0
  92. package/dist/htmx/types.d.ts +129 -0
  93. package/dist/index.d.ts +3647 -0
  94. package/dist/index.js +34 -4
  95. package/dist/index.js.map +7 -6
  96. package/dist/linkedProviders/inMemoryStores.d.ts +9 -0
  97. package/dist/linkedProviders/index.d.ts +3 -0
  98. package/dist/linkedProviders/neonStores.d.ts +484 -0
  99. package/dist/linkedProviders/oauthAccountResolver.d.ts +28 -0
  100. package/dist/linkedProviders/oauthResolver.d.ts +9 -0
  101. package/dist/linkedProviders/resolver.d.ts +22 -0
  102. package/dist/lockout/config.d.ts +17 -0
  103. package/dist/lockout/inMemoryLockoutStore.d.ts +2 -0
  104. package/dist/lockout/postgresLockoutStore.d.ts +71 -0
  105. package/dist/lockout/redisLockoutStore.d.ts +3 -0
  106. package/dist/lockout/types.d.ts +12 -0
  107. package/dist/manifest.d.ts +18 -0
  108. package/dist/manifest.json +373 -0
  109. package/dist/mfa/backupCodes.d.ts +5 -0
  110. package/dist/mfa/challenge.d.ts +72 -0
  111. package/dist/mfa/config.d.ts +59 -0
  112. package/dist/mfa/gate.d.ts +2 -0
  113. package/dist/mfa/inMemoryMfaStore.d.ts +2 -0
  114. package/dist/mfa/management.d.ts +106 -0
  115. package/dist/mfa/postgresMfaStore.d.ts +266 -0
  116. package/dist/mfa/recentAuth.d.ts +2 -0
  117. package/dist/mfa/rotation.d.ts +17 -0
  118. package/dist/mfa/routes.d.ts +239 -0
  119. package/dist/mfa/secret.d.ts +2 -0
  120. package/dist/mfa/sms.d.ts +143 -0
  121. package/dist/mfa/totp.d.ts +91 -0
  122. package/dist/mfa/types.d.ts +58 -0
  123. package/dist/migrations/generate.d.ts +2 -0
  124. package/dist/migrations/index.d.ts +6 -0
  125. package/dist/migrations/runner.d.ts +22 -0
  126. package/dist/migrations/types.d.ts +14 -0
  127. package/dist/oidc/clientAuth.d.ts +19 -0
  128. package/dist/oidc/clientIdMetadata.d.ts +28 -0
  129. package/dist/oidc/config.d.ts +307 -0
  130. package/dist/oidc/dpop.d.ts +23 -0
  131. package/dist/oidc/inMemoryStores.d.ts +11 -0
  132. package/dist/oidc/inMemoryVciStores.d.ts +3 -0
  133. package/dist/oidc/index.d.ts +12 -0
  134. package/dist/oidc/jar.d.ts +14 -0
  135. package/dist/oidc/keys.d.ts +50 -0
  136. package/dist/oidc/logout.d.ts +38 -0
  137. package/dist/oidc/mtls.d.ts +11 -0
  138. package/dist/oidc/operator.d.ts +14 -0
  139. package/dist/oidc/par.d.ts +28 -0
  140. package/dist/oidc/postgresStores.d.ts +1217 -0
  141. package/dist/oidc/registration.d.ts +138 -0
  142. package/dist/oidc/routes.d.ts +569 -0
  143. package/dist/oidc/types.d.ts +157 -0
  144. package/dist/oidc/userinfo.d.ts +21 -0
  145. package/dist/oidc/vci.d.ts +159 -0
  146. package/dist/oidc/vciRoutes.d.ts +92 -0
  147. package/dist/organizations/config.d.ts +46 -0
  148. package/dist/organizations/inMemoryOrganizationStore.d.ts +2 -0
  149. package/dist/organizations/operations.d.ts +39 -0
  150. package/dist/organizations/postgresOrganizationStore.d.ts +340 -0
  151. package/dist/organizations/routes.d.ts +299 -0
  152. package/dist/organizations/types.d.ts +45 -0
  153. package/dist/passwordless/config.d.ts +43 -0
  154. package/dist/passwordless/inMemoryPasswordlessTokenStore.d.ts +2 -0
  155. package/dist/passwordless/postgresPasswordlessTokenStore.d.ts +56 -0
  156. package/dist/passwordless/routes.d.ts +163 -0
  157. package/dist/passwordless/types.d.ts +9 -0
  158. package/dist/pluginIdentity.d.ts +2 -0
  159. package/dist/plugins/denyDisposableEmail.d.ts +7 -0
  160. package/dist/plugins/discordAlert.d.ts +7 -0
  161. package/dist/plugins/geoBlock.d.ts +8 -0
  162. package/dist/plugins/index.d.ts +12 -0
  163. package/dist/plugins/pagerdutyAlert.d.ts +9 -0
  164. package/dist/plugins/posthogIdentify.d.ts +7 -0
  165. package/dist/plugins/slackAlert.d.ts +7 -0
  166. package/dist/portal/config.d.ts +34 -0
  167. package/dist/portal/inMemorySetupSessionStore.d.ts +2 -0
  168. package/dist/portal/operations.d.ts +10 -0
  169. package/dist/portal/postgresSetupSessionStore.d.ts +116 -0
  170. package/dist/portal/routes.d.ts +160 -0
  171. package/dist/portal/types.d.ts +16 -0
  172. package/dist/providers/clients.d.ts +1831 -0
  173. package/dist/providers/index.d.ts +2 -0
  174. package/dist/providersFromEnv.d.ts +19 -0
  175. package/dist/redirect.d.ts +2 -0
  176. package/dist/roles/config.d.ts +27 -0
  177. package/dist/roles/inMemoryRoleStore.d.ts +2 -0
  178. package/dist/roles/operations.d.ts +8 -0
  179. package/dist/roles/postgresRoleStore.d.ts +86 -0
  180. package/dist/roles/resolver.d.ts +17 -0
  181. package/dist/roles/routes.d.ts +106 -0
  182. package/dist/roles/types.d.ts +14 -0
  183. package/dist/routes/authorize.d.ts +102 -0
  184. package/dist/routes/callback.d.ts +64 -0
  185. package/dist/routes/profile.d.ts +73 -0
  186. package/dist/routes/protectRoute.d.ts +51 -0
  187. package/dist/routes/refresh.d.ts +74 -0
  188. package/dist/routes/requireAuth.d.ts +43 -0
  189. package/dist/routes/revoke.d.ts +73 -0
  190. package/dist/routes/sessions.d.ts +103 -0
  191. package/dist/routes/signout.d.ts +70 -0
  192. package/dist/routes/stepUp.d.ts +48 -0
  193. package/dist/routes/userStatus.d.ts +72 -0
  194. package/dist/saml.d.ts +1 -0
  195. package/dist/scim/config.d.ts +57 -0
  196. package/dist/scim/extensions.d.ts +30 -0
  197. package/dist/scim/inMemoryScimTokenStore.d.ts +2 -0
  198. package/dist/scim/postgresScimTokenStore.d.ts +86 -0
  199. package/dist/scim/routes.d.ts +366 -0
  200. package/dist/scim/serialize.d.ts +83 -0
  201. package/dist/scim/types.d.ts +54 -0
  202. package/dist/server.d.ts +34 -0
  203. package/dist/server.js +32 -4
  204. package/dist/server.js.map +7 -6
  205. package/dist/session/access.d.ts +33 -0
  206. package/dist/session/anonymous.d.ts +12 -0
  207. package/dist/session/cleanup.d.ts +45 -0
  208. package/dist/session/cookieReader.d.ts +10 -0
  209. package/dist/session/impersonation.d.ts +34 -0
  210. package/dist/session/inMemoryStore.d.ts +7 -0
  211. package/dist/session/multiSession.d.ts +27 -0
  212. package/dist/session/neonStore.d.ts +574 -0
  213. package/dist/session/promote.d.ts +23 -0
  214. package/dist/session/redisStore.d.ts +6 -0
  215. package/dist/session/sessionsConfig.d.ts +9 -0
  216. package/dist/session/state.d.ts +33 -0
  217. package/dist/session/types.d.ts +23 -0
  218. package/dist/session/userSessions.d.ts +19 -0
  219. package/dist/sso/config.d.ts +149 -0
  220. package/dist/sso/discoveryRoute.d.ts +63 -0
  221. package/dist/sso/inMemorySamlServiceProviderStore.d.ts +2 -0
  222. package/dist/sso/inMemorySsoConnectionStore.d.ts +2 -0
  223. package/dist/sso/nodeSamlAdapter.d.ts +8 -0
  224. package/dist/sso/oidcRoutes.d.ts +98 -0
  225. package/dist/sso/postgresSamlServiceProviderStore.d.ts +101 -0
  226. package/dist/sso/postgresSsoConnectionStore.d.ts +117 -0
  227. package/dist/sso/samlIdpRoutes.d.ts +139 -0
  228. package/dist/sso/samlRoutes.d.ts +179 -0
  229. package/dist/sso/types.d.ts +53 -0
  230. package/dist/stores/postgres.d.ts +5 -0
  231. package/dist/stores/redis.d.ts +5 -0
  232. package/dist/telemetry/tracing.d.ts +15 -0
  233. package/dist/tenancy.d.ts +9 -0
  234. package/dist/typeGuards.d.ts +6 -0
  235. package/dist/typebox.d.ts +4 -0
  236. package/dist/types.d.ts +438 -0
  237. package/dist/utils.d.ts +45 -0
  238. package/dist/vault/config.d.ts +20 -0
  239. package/dist/vault/inMemoryVaultStore.d.ts +2 -0
  240. package/dist/vault/index.d.ts +5 -0
  241. package/dist/vault/postgresVaultStore.d.ts +86 -0
  242. package/dist/vault/types.d.ts +14 -0
  243. package/dist/vc/inMemoryVpStores.d.ts +2 -0
  244. package/dist/vc/openid4vp.d.ts +82 -0
  245. package/dist/vc/postgresVcStores.d.ts +300 -0
  246. package/dist/vc/sdJwt.d.ts +37 -0
  247. package/dist/vc/statusList.d.ts +29 -0
  248. package/dist/vc/statusListRoutes.d.ts +63 -0
  249. package/dist/vc/vpRoutes.d.ts +120 -0
  250. package/dist/verification/types.d.ts +58 -0
  251. package/dist/webauthn/adapter.d.ts +59 -0
  252. package/dist/webauthn/config.d.ts +36 -0
  253. package/dist/webauthn/inMemoryWebAuthnCredentialStore.d.ts +2 -0
  254. package/dist/webauthn/postgresWebAuthnCredentialStore.d.ts +146 -0
  255. package/dist/webauthn/routes.d.ts +155 -0
  256. package/dist/webauthn/simpleWebAuthnAdapter.d.ts +3 -0
  257. package/dist/webauthn/types.d.ts +17 -0
  258. package/dist/webauthn.d.ts +1 -0
  259. package/dist/webhooks/config.d.ts +34 -0
  260. package/dist/webhooks/dispatcher.d.ts +3 -0
  261. package/dist/webhooks/inMemoryStore.d.ts +2 -0
  262. package/dist/webhooks/postgresStore.d.ts +116 -0
  263. package/dist/webhooks/sign.d.ts +11 -0
  264. package/dist/webhooks/types.d.ts +25 -0
  265. package/package.json +1 -1
@@ -0,0 +1,12 @@
1
+ export type LockoutRecord = {
2
+ failedAttempts: number;
3
+ key: string;
4
+ lockedUntil?: number;
5
+ windowStartedAt: number;
6
+ };
7
+ export type LockoutStore = {
8
+ get: (key: string) => Promise<LockoutRecord | undefined>;
9
+ increment: (key: string, windowMs: number) => Promise<LockoutRecord>;
10
+ lock: (key: string, lockedUntil: number) => Promise<void>;
11
+ reset: (key: string) => Promise<void>;
12
+ };
@@ -0,0 +1,18 @@
1
+ import type { AuthConfig } from './types';
2
+ export declare const manifest: Omit<import("@absolutejs/manifest").PackageManifest<AuthConfig<unknown>, never>, "contract" | "settings" | "tools"> & (({
3
+ contract: 1;
4
+ tools?: Record<string, import("@absolutejs/manifest").LegacyManifestTool<never>> | undefined;
5
+ } | {
6
+ contract: 2;
7
+ tools?: Record<string, import("@absolutejs/manifest").AuthorizedManifestTool<never>> | undefined;
8
+ }) & {
9
+ settings: import("@sinclair/typebox").TObject<{
10
+ cleanupIntervalMs: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TNumber>;
11
+ cookieSecure: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TBoolean>;
12
+ maxSessions: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TInteger>;
13
+ providersConfiguration: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TRecord<import("@sinclair/typebox").TString, import("@sinclair/typebox").TObject<{
14
+ scope: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TArray<import("@sinclair/typebox").TString>>;
15
+ }>>>;
16
+ sessionDurationMs: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TNumber>;
17
+ }>;
18
+ });
@@ -0,0 +1,373 @@
1
+ {
2
+ "contract": 2,
3
+ "discovery": {
4
+ "audiences": [
5
+ "applications",
6
+ "agent-hosts"
7
+ ],
8
+ "intents": [
9
+ "authenticate people and agents",
10
+ "issue scoped agent delegations",
11
+ "publish OAuth discovery"
12
+ ],
13
+ "keywords": [
14
+ "auth",
15
+ "oauth",
16
+ "oidc",
17
+ "agents",
18
+ "delegation",
19
+ "device-flow"
20
+ ],
21
+ "protocols": [
22
+ "OAuth 2.0",
23
+ "OpenID Connect",
24
+ "ID-JAG"
25
+ ]
26
+ },
27
+ "identity": {
28
+ "accent": "#6366f1",
29
+ "category": "auth",
30
+ "description": "OAuth/OIDC sign-in for people and AI agents, including open auth.md registration, scoped delegation, agent account linking, 60+ providers, passkeys, MFA, enterprise SSO/SCIM, organizations, roles, and API keys.",
31
+ "docsUrl": "https://github.com/absolutejs/auth",
32
+ "name": "@absolutejs/auth",
33
+ "tagline": "Let people and agents create accounts and sign in."
34
+ },
35
+ "implements": [
36
+ {
37
+ "contract": "auth/session-store",
38
+ "factory": "createNeonAuthSessionStore",
39
+ "from": "@absolutejs/auth",
40
+ "requires": {
41
+ "env": [
42
+ {
43
+ "description": "Postgres connection string",
44
+ "example": "postgres://user:pass@host/db",
45
+ "key": "DATABASE_URL",
46
+ "secret": true
47
+ }
48
+ ]
49
+ },
50
+ "title": "Your Postgres database (recommended)",
51
+ "wiring": {
52
+ "code": "createNeonAuthSessionStore(${env.DATABASE_URL} ?? \"\", decodeSessionUserRecord)",
53
+ "imports": [
54
+ {
55
+ "from": "@absolutejs/auth",
56
+ "names": [
57
+ "createNeonAuthSessionStore",
58
+ "decodeSessionUserRecord"
59
+ ]
60
+ }
61
+ ]
62
+ }
63
+ },
64
+ {
65
+ "contract": "auth/session-store",
66
+ "factory": "createInMemoryAuthSessionStore",
67
+ "from": "@absolutejs/auth",
68
+ "title": "In memory (development only — sign-ins reset on restart)",
69
+ "wiring": {
70
+ "code": "createInMemoryAuthSessionStore()",
71
+ "imports": [
72
+ {
73
+ "from": "@absolutejs/auth",
74
+ "names": [
75
+ "createInMemoryAuthSessionStore"
76
+ ]
77
+ }
78
+ ]
79
+ }
80
+ }
81
+ ],
82
+ "lifecycle": [
83
+ {
84
+ "command": "bunx absolute-auth migrate",
85
+ "id": "migrate",
86
+ "idempotent": true,
87
+ "kind": "migration",
88
+ "title": "Set up the sign-in tables in your database",
89
+ "when": "after-install"
90
+ },
91
+ {
92
+ "command": "bunx absolute-auth migrate",
93
+ "id": "migrate-upgrade",
94
+ "idempotent": true,
95
+ "kind": "migration",
96
+ "title": "Apply new sign-in tables after upgrading",
97
+ "when": "after-upgrade"
98
+ }
99
+ ],
100
+ "presets": [
101
+ {
102
+ "id": "social-login",
103
+ "title": "Social login (Google + GitHub)",
104
+ "values": {
105
+ "providersConfiguration": {
106
+ "github": {},
107
+ "google": {}
108
+ }
109
+ }
110
+ }
111
+ ],
112
+ "requires": {
113
+ "env": [
114
+ {
115
+ "description": "Postgres connection string (sign-in tables live here)",
116
+ "example": "postgres://user:pass@host/db",
117
+ "key": "DATABASE_URL",
118
+ "secret": true
119
+ },
120
+ {
121
+ "description": "Discord OAuth client id",
122
+ "docsUrl": "https://discord.com/developers/applications",
123
+ "key": "DISCORD_CLIENT_ID",
124
+ "when": "providersConfiguration.discord"
125
+ },
126
+ {
127
+ "description": "Discord OAuth client secret",
128
+ "docsUrl": "https://discord.com/developers/applications",
129
+ "key": "DISCORD_CLIENT_SECRET",
130
+ "secret": true,
131
+ "when": "providersConfiguration.discord"
132
+ },
133
+ {
134
+ "description": "Facebook OAuth client id",
135
+ "docsUrl": "https://developers.facebook.com/apps",
136
+ "key": "FACEBOOK_CLIENT_ID",
137
+ "when": "providersConfiguration.facebook"
138
+ },
139
+ {
140
+ "description": "Facebook OAuth client secret",
141
+ "docsUrl": "https://developers.facebook.com/apps",
142
+ "key": "FACEBOOK_CLIENT_SECRET",
143
+ "secret": true,
144
+ "when": "providersConfiguration.facebook"
145
+ },
146
+ {
147
+ "description": "Github OAuth client id",
148
+ "docsUrl": "https://github.com/settings/developers",
149
+ "key": "GITHUB_CLIENT_ID",
150
+ "when": "providersConfiguration.github"
151
+ },
152
+ {
153
+ "description": "Github OAuth client secret",
154
+ "docsUrl": "https://github.com/settings/developers",
155
+ "key": "GITHUB_CLIENT_SECRET",
156
+ "secret": true,
157
+ "when": "providersConfiguration.github"
158
+ },
159
+ {
160
+ "description": "Google OAuth client id",
161
+ "docsUrl": "https://console.cloud.google.com/apis/credentials",
162
+ "key": "GOOGLE_CLIENT_ID",
163
+ "when": "providersConfiguration.google"
164
+ },
165
+ {
166
+ "description": "Google OAuth client secret",
167
+ "docsUrl": "https://console.cloud.google.com/apis/credentials",
168
+ "key": "GOOGLE_CLIENT_SECRET",
169
+ "secret": true,
170
+ "when": "providersConfiguration.google"
171
+ },
172
+ {
173
+ "description": "Linkedin OAuth client id",
174
+ "docsUrl": "https://www.linkedin.com/developers/apps",
175
+ "key": "LINKEDIN_CLIENT_ID",
176
+ "when": "providersConfiguration.linkedin"
177
+ },
178
+ {
179
+ "description": "Linkedin OAuth client secret",
180
+ "docsUrl": "https://www.linkedin.com/developers/apps",
181
+ "key": "LINKEDIN_CLIENT_SECRET",
182
+ "secret": true,
183
+ "when": "providersConfiguration.linkedin"
184
+ },
185
+ {
186
+ "description": "Microsoft OAuth client id",
187
+ "docsUrl": "https://portal.azure.com/#blade/Microsoft_AAD_RegisteredApps/ApplicationsListBlade",
188
+ "key": "MICROSOFT_CLIENT_ID",
189
+ "when": "providersConfiguration.microsoft"
190
+ },
191
+ {
192
+ "description": "Microsoft OAuth client secret",
193
+ "docsUrl": "https://portal.azure.com/#blade/Microsoft_AAD_RegisteredApps/ApplicationsListBlade",
194
+ "key": "MICROSOFT_CLIENT_SECRET",
195
+ "secret": true,
196
+ "when": "providersConfiguration.microsoft"
197
+ },
198
+ {
199
+ "description": "Slack OAuth client id",
200
+ "docsUrl": "https://api.slack.com/apps",
201
+ "key": "SLACK_CLIENT_ID",
202
+ "when": "providersConfiguration.slack"
203
+ },
204
+ {
205
+ "description": "Slack OAuth client secret",
206
+ "docsUrl": "https://api.slack.com/apps",
207
+ "key": "SLACK_CLIENT_SECRET",
208
+ "secret": true,
209
+ "when": "providersConfiguration.slack"
210
+ },
211
+ {
212
+ "description": "Spotify OAuth client id",
213
+ "docsUrl": "https://developer.spotify.com/dashboard",
214
+ "key": "SPOTIFY_CLIENT_ID",
215
+ "when": "providersConfiguration.spotify"
216
+ },
217
+ {
218
+ "description": "Spotify OAuth client secret",
219
+ "docsUrl": "https://developer.spotify.com/dashboard",
220
+ "key": "SPOTIFY_CLIENT_SECRET",
221
+ "secret": true,
222
+ "when": "providersConfiguration.spotify"
223
+ },
224
+ {
225
+ "description": "Twitch OAuth client id",
226
+ "docsUrl": "https://dev.twitch.tv/console/apps",
227
+ "key": "TWITCH_CLIENT_ID",
228
+ "when": "providersConfiguration.twitch"
229
+ },
230
+ {
231
+ "description": "Twitch OAuth client secret",
232
+ "docsUrl": "https://dev.twitch.tv/console/apps",
233
+ "key": "TWITCH_CLIENT_SECRET",
234
+ "secret": true,
235
+ "when": "providersConfiguration.twitch"
236
+ }
237
+ ],
238
+ "peers": [
239
+ {
240
+ "name": "elysia",
241
+ "range": ">=1.0",
242
+ "reason": "plugin host"
243
+ }
244
+ ],
245
+ "services": [
246
+ {
247
+ "description": "Stores accounts, sessions, and audit events",
248
+ "id": "postgres"
249
+ }
250
+ ]
251
+ },
252
+ "settings": {
253
+ "type": "object",
254
+ "properties": {
255
+ "cleanupIntervalMs": {
256
+ "description": "How often expired sessions are swept, in milliseconds.",
257
+ "minimum": 1000,
258
+ "title": "Session cleanup interval",
259
+ "x-group": "advanced",
260
+ "type": "number"
261
+ },
262
+ "cookieSecure": {
263
+ "description": "Only send the sign-in cookie over HTTPS. Leave off in local development.",
264
+ "title": "HTTPS-only cookies",
265
+ "x-group": "advanced",
266
+ "type": "boolean"
267
+ },
268
+ "maxSessions": {
269
+ "description": "How many devices someone can stay signed in on at once.",
270
+ "minimum": 1,
271
+ "title": "Signed-in devices per person",
272
+ "x-group": "sessions",
273
+ "type": "integer"
274
+ },
275
+ "providersConfiguration": {
276
+ "description": "Which services people can sign in with. Each needs a client id and secret from that provider.",
277
+ "title": "Sign-in providers",
278
+ "x-group": "providers",
279
+ "type": "object",
280
+ "patternProperties": {
281
+ "^(.*)$": {
282
+ "type": "object",
283
+ "properties": {
284
+ "scope": {
285
+ "description": "Extra permissions to request from the provider.",
286
+ "title": "Permissions",
287
+ "type": "array",
288
+ "items": {
289
+ "type": "string"
290
+ }
291
+ }
292
+ }
293
+ }
294
+ }
295
+ },
296
+ "sessionDurationMs": {
297
+ "description": "How long someone stays signed in, in milliseconds. Default is 7 days.",
298
+ "minimum": 60000,
299
+ "title": "Stay signed in for",
300
+ "x-group": "sessions",
301
+ "type": "number"
302
+ }
303
+ }
304
+ },
305
+ "slots": {
306
+ "sessionStore": {
307
+ "configPath": "authSessionStore",
308
+ "contract": "auth/session-store",
309
+ "description": "Where live sign-in sessions are kept",
310
+ "known": [
311
+ "@absolutejs/auth#postgres",
312
+ "@absolutejs/auth#memory"
313
+ ],
314
+ "required": true
315
+ },
316
+ "verificationProvider": {
317
+ "configPath": "verificationProvider",
318
+ "contract": "auth/verification-provider",
319
+ "description": "Provider-managed phone verification for MFA and future passwordless flows",
320
+ "known": [
321
+ "@absolutejs/auth-twilio"
322
+ ],
323
+ "required": false
324
+ }
325
+ },
326
+ "wiring": [
327
+ {
328
+ "description": "Sign in with Google, GitHub, and 60+ other services. Add email/password later from settings.",
329
+ "id": "default",
330
+ "server": {
331
+ "code": ".use(\n\tawait auth({\n\t\t// TODO: return your application user for a session subject.\n\t\tgetUser: (sub) => ({ sub }),\n\t\tauthSessionStore: ${slot.sessionStore},\n\t\tcookieSecure: ${settings.cookieSecure},\n\t\tmaxSessions: ${settings.maxSessions},\n\t\tprovidersConfiguration: providersFromEnv(${settings.providersConfiguration} ?? {}),\n\t\tsessionDurationMs: ${settings.sessionDurationMs}\n\t})\n)",
332
+ "imports": [
333
+ {
334
+ "from": "@absolutejs/auth",
335
+ "names": [
336
+ "auth",
337
+ "providersFromEnv"
338
+ ]
339
+ }
340
+ ],
341
+ "placement": "server-plugin"
342
+ },
343
+ "title": "Social sign-in (OAuth)"
344
+ }
345
+ ],
346
+ "tools": {
347
+ "list_sign_in_providers": {
348
+ "annotations": {
349
+ "readOnlyHint": true
350
+ },
351
+ "authorization": {
352
+ "approval": "never",
353
+ "audience": "admin",
354
+ "effects": [
355
+ "read"
356
+ ],
357
+ "requiredScopes": [
358
+ "auth:inspect"
359
+ ]
360
+ },
361
+ "capabilities": [
362
+ "read",
363
+ "glob"
364
+ ],
365
+ "description": "List which sign-in providers this project has configured, and which are missing credentials.",
366
+ "input": {
367
+ "type": "object",
368
+ "properties": {}
369
+ },
370
+ "kind": "workspace"
371
+ }
372
+ }
373
+ }
@@ -0,0 +1,5 @@
1
+ export declare const consumeBackupCode: (code: string, hashes: string[]) => Promise<string[] | undefined>;
2
+ export declare const generateBackupCodes: (count: number) => Promise<{
3
+ codes: string[];
4
+ hashes: string[];
5
+ }>;
@@ -0,0 +1,72 @@
1
+ import { Elysia } from 'elysia';
2
+ import { type MfaRouteProps } from './config';
3
+ export declare const mfaChallenge: <UserType>({ authSessionStore, challengeRoute, cookieSecure, encryptionKey, getChallengeUser, getUserId, mfaStore, onMfaChallengeError, onMfaChallengeSuccess, onSendSmsCode, verificationProvider, sessionDurationMs, smsCodeLength, smsCodeTtlMs, smsMaxAttempts, smsResendCooldownMs, totpMaxAttempts }: MfaRouteProps<UserType>) => Elysia<"", {
4
+ decorator: {};
5
+ store: {
6
+ session: import("..").SessionRecord<UserType>;
7
+ unregisteredSession: import("..").UnregisteredSessionRecord;
8
+ };
9
+ derive: {};
10
+ resolve: {};
11
+ }, {
12
+ typebox: {};
13
+ error: {};
14
+ }, {
15
+ schema: {};
16
+ standaloneSchema: {};
17
+ macro: {};
18
+ macroFn: {};
19
+ parser: {};
20
+ response: {};
21
+ }, {
22
+ [x: string]: {
23
+ post: {
24
+ body: {
25
+ code?: string | undefined;
26
+ action?: "verify" | "send" | undefined;
27
+ factor?: "sms" | undefined;
28
+ };
29
+ params: {};
30
+ query: unknown;
31
+ headers: unknown;
32
+ response: {
33
+ 400: string;
34
+ 401: "SMS code expired" | "Too many attempts" | "SMS challenge is no longer active" | "No MFA challenge in progress" | "Invalid MFA code";
35
+ 200: {
36
+ readonly status: "sent";
37
+ } | {
38
+ readonly status: "authenticated";
39
+ };
40
+ 422: {
41
+ type: "validation";
42
+ on: string;
43
+ summary?: string;
44
+ message?: string;
45
+ found?: unknown;
46
+ property?: string;
47
+ expected?: string;
48
+ };
49
+ 429: string;
50
+ 503: string;
51
+ };
52
+ };
53
+ };
54
+ }, {
55
+ derive: {};
56
+ resolve: {};
57
+ schema: {};
58
+ standaloneSchema: {};
59
+ response: {};
60
+ }, {
61
+ derive: {};
62
+ resolve: {};
63
+ schema: {};
64
+ standaloneSchema: {};
65
+ response: {};
66
+ } & {
67
+ derive: {};
68
+ resolve: {};
69
+ schema: {};
70
+ standaloneSchema: {};
71
+ response: {};
72
+ }>;
@@ -0,0 +1,59 @@
1
+ import type { AuthSessionStore } from '../session/types';
2
+ import type { RouteString, UserSessionId } from '../types';
3
+ import type { MFAStore } from './types';
4
+ export declare const DEFAULT_BACKUP_CODE_COUNT = 10;
5
+ export declare const DEFAULT_MFA_ISSUER = "AbsoluteAuth";
6
+ export declare const DEFAULT_MFA_MANAGEMENT_AUTH_MAX_AGE_MS: number;
7
+ export declare const DEFAULT_MFA_SESSION_TTL_MS: number;
8
+ export declare const DEFAULT_SMS_CODE_LENGTH = 6;
9
+ export declare const DEFAULT_SMS_CODE_TTL_MS: number;
10
+ export declare const DEFAULT_SMS_MAX_ATTEMPTS = 3;
11
+ export declare const DEFAULT_SMS_RESEND_COOLDOWN_MS: number;
12
+ export declare const DEFAULT_TOTP_MAX_ATTEMPTS = 5;
13
+ export type SmsCodeMessage = {
14
+ code: string;
15
+ expiresAt: number;
16
+ phone: string;
17
+ purpose: 'mfa_challenge' | 'mfa_enrollment';
18
+ userId: string;
19
+ };
20
+ export type MfaConfig<UserType> = {
21
+ mfaStore: MFAStore;
22
+ getUserId: (user: UserType) => string;
23
+ getChallengeUser: (userIdentity: Record<string, unknown>) => Promise<UserType | null | undefined> | UserType | null | undefined;
24
+ backupCodeCount?: number;
25
+ challengeRoute?: RouteString;
26
+ encryptionKey?: string;
27
+ issuer?: string;
28
+ managementRoute?: RouteString;
29
+ /** Maximum age of the authentication ceremony used to enroll, replace, or remove MFA. */
30
+ managementAuthMaxAgeMs?: number;
31
+ onMfaChallengeError?: (context: {
32
+ error: unknown;
33
+ userId?: string;
34
+ }) => void | Promise<void>;
35
+ onMfaChallengeSuccess?: (context: {
36
+ user: UserType;
37
+ userSessionId: UserSessionId;
38
+ }) => void | Promise<void>;
39
+ onMfaEnrolled?: (context: {
40
+ userId: string;
41
+ }) => void | Promise<void>;
42
+ onSendSmsCode?: (message: SmsCodeMessage) => void | Promise<void>;
43
+ sessionDurationMs?: number;
44
+ smsCodeLength?: number;
45
+ smsCodeTtlMs?: number;
46
+ smsMaxAttempts?: number;
47
+ /** Minimum delay between code sends for the same enrollment. */
48
+ smsResendCooldownMs?: number;
49
+ smsSetupRoute?: RouteString;
50
+ smsVerifyRoute?: RouteString;
51
+ totpMaxAttempts?: number;
52
+ totpSetupRoute?: RouteString;
53
+ totpVerifyRoute?: RouteString;
54
+ };
55
+ export type MfaRouteProps<UserType> = MfaConfig<UserType> & {
56
+ authSessionStore?: AuthSessionStore<UserType>;
57
+ cookieSecure?: boolean;
58
+ verificationProvider?: import('../verification/types').VerificationProvider;
59
+ };
@@ -0,0 +1,2 @@
1
+ import type { MfaConfig } from './config';
2
+ export declare const createMfaGate: <UserType>({ getUserId, mfaStore }: MfaConfig<UserType>) => (user: UserType) => Promise<boolean>;
@@ -0,0 +1,2 @@
1
+ import type { MFAStore } from './types';
2
+ export declare const createInMemoryMfaStore: () => MFAStore;
@@ -0,0 +1,106 @@
1
+ import { Elysia } from 'elysia';
2
+ import { type MfaRouteProps } from './config';
3
+ export type MfaStatus = {
4
+ backupCodesRemaining: number;
5
+ enabled: boolean;
6
+ smsBackup: {
7
+ enabled: boolean;
8
+ phone: string | null;
9
+ };
10
+ totp: {
11
+ enabled: boolean;
12
+ };
13
+ };
14
+ export declare const mfaManagementRoutes: <UserType>({ authSessionStore, getUserId, managementRoute, managementAuthMaxAgeMs, mfaStore }: MfaRouteProps<UserType>) => Elysia<"", {
15
+ decorator: {};
16
+ store: {
17
+ session: import("..").SessionRecord<UserType>;
18
+ unregisteredSession: import("..").UnregisteredSessionRecord;
19
+ };
20
+ derive: {};
21
+ resolve: {};
22
+ }, {
23
+ typebox: {};
24
+ error: {};
25
+ }, {
26
+ schema: {};
27
+ standaloneSchema: {};
28
+ macro: {};
29
+ macroFn: {};
30
+ parser: {};
31
+ response: {};
32
+ }, {
33
+ [x: string]: {
34
+ get: {
35
+ body: unknown;
36
+ params: {};
37
+ query: unknown;
38
+ headers: unknown;
39
+ response: {
40
+ 401: "Authentication required";
41
+ 200: {
42
+ backupCodesRemaining: number;
43
+ enabled: boolean;
44
+ smsBackup: {
45
+ enabled: boolean;
46
+ phone: string | null;
47
+ };
48
+ totp: {
49
+ enabled: boolean;
50
+ };
51
+ };
52
+ 422: {
53
+ type: "validation";
54
+ on: string;
55
+ summary?: string;
56
+ message?: string;
57
+ found?: unknown;
58
+ property?: string;
59
+ expected?: string;
60
+ };
61
+ };
62
+ };
63
+ };
64
+ } & {
65
+ [x: string]: {
66
+ delete: {
67
+ body: unknown;
68
+ params: {};
69
+ query: unknown;
70
+ headers: unknown;
71
+ response: {
72
+ 401: "Recent authentication required" | "Authentication required";
73
+ 200: {
74
+ readonly status: "disabled";
75
+ };
76
+ 422: {
77
+ type: "validation";
78
+ on: string;
79
+ summary?: string;
80
+ message?: string;
81
+ found?: unknown;
82
+ property?: string;
83
+ expected?: string;
84
+ };
85
+ };
86
+ };
87
+ };
88
+ }, {
89
+ derive: {};
90
+ resolve: {};
91
+ schema: {};
92
+ standaloneSchema: {};
93
+ response: {};
94
+ }, {
95
+ derive: {};
96
+ resolve: {};
97
+ schema: {};
98
+ standaloneSchema: {};
99
+ response: {};
100
+ } & {
101
+ derive: {};
102
+ resolve: {};
103
+ schema: {};
104
+ standaloneSchema: {};
105
+ response: {};
106
+ }>;