@tempoxyz/id 0.0.0-stage → 0.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +80 -2
- package/dist/App.d.ts +20 -0
- package/dist/App.d.ts.map +1 -0
- package/dist/App.js +26 -0
- package/dist/App.js.map +1 -0
- package/dist/app/client/.assetsignore +2 -0
- package/dist/app/client/assets/BRLA-CZvVDNYr.png +0 -0
- package/dist/app/client/assets/CHFAU-DCedc4aH.png +0 -0
- package/dist/app/client/assets/DLUSD-BnRXm3EI.png +0 -0
- package/dist/app/client/assets/PRIME-CiFp2-3e.svg +14 -0
- package/dist/app/client/assets/Pilat-Bold-C1t1eIrF.woff2 +0 -0
- package/dist/app/client/assets/Pilat-Book-CbS8ofT8.woff2 +0 -0
- package/dist/app/client/assets/Pilat-Demi-CADSbPAt.woff2 +0 -0
- package/dist/app/client/assets/Pilat-Regular-Bx8vzE7q.woff2 +0 -0
- package/dist/app/client/assets/USD1-COVcO_PB.svg +30 -0
- package/dist/app/client/assets/YLDS-CRh8Zw0g.svg +3 -0
- package/dist/app/client/assets/ccip-Cq1mMiVl.js +1 -0
- package/dist/app/client/assets/frxUSD-n9pTpinR.svg +1 -0
- package/dist/app/client/assets/geist-mono-latin-wght-normal-XN7g48iV.woff2 +0 -0
- package/dist/app/client/assets/index-B7YJVP00.css +1 -0
- package/dist/app/client/assets/index-UXTxXCLk.js +55 -0
- package/dist/app/client/assets/pathUSD-BvaO6ooS.svg +25 -0
- package/dist/app/client/assets/reset-co-CHrff.css +1 -0
- package/dist/app/client/assets/wYLDS-CaCKDrO-.svg +10 -0
- package/dist/app/db/auth.d.ts +3207 -0
- package/dist/app/db/auth.d.ts.map +1 -0
- package/dist/app/db/auth.js +330 -0
- package/dist/app/db/auth.js.map +1 -0
- package/dist/app/db/schema.d.ts +932 -0
- package/dist/app/db/schema.d.ts.map +1 -0
- package/dist/app/db/schema.js +171 -0
- package/dist/app/db/schema.js.map +1 -0
- package/dist/app/server/.vite/manifest.json +489 -0
- package/dist/app/server/assets/BRLA-CZvVDNYr.png +0 -0
- package/dist/app/server/assets/CHFAU-DCedc4aH.png +0 -0
- package/dist/app/server/assets/DLUSD-BnRXm3EI.png +0 -0
- package/dist/app/server/assets/PRIME-CiFp2-3e.svg +14 -0
- package/dist/app/server/assets/Pilat-Bold-C1t1eIrF.woff2 +0 -0
- package/dist/app/server/assets/Pilat-Book-CbS8ofT8.woff2 +0 -0
- package/dist/app/server/assets/Pilat-Demi-CADSbPAt.woff2 +0 -0
- package/dist/app/server/assets/Pilat-Regular-Bx8vzE7q.woff2 +0 -0
- package/dist/app/server/assets/USD1-COVcO_PB.svg +30 -0
- package/dist/app/server/assets/YLDS-CRh8Zw0g.svg +3 -0
- package/dist/app/server/assets/_tanstack-start-manifest_v-11GtFGrq.js +1 -0
- package/dist/app/server/assets/arktype-aI7TBD0R-D1R3Byo5.js +2 -0
- package/dist/app/server/assets/arktype-aI7TBD0R-D1R3Byo5.js.map +1 -0
- package/dist/app/server/assets/authorize-C95F-9E1-CbESJKGU.js +31 -0
- package/dist/app/server/assets/authorize-C95F-9E1-CbESJKGU.js.map +1 -0
- package/dist/app/server/assets/bun-sqlite-dialect-DoOVo4ja-CtyBkVMb.js +2 -0
- package/dist/app/server/assets/bun-sqlite-dialect-DoOVo4ja-CtyBkVMb.js.map +1 -0
- package/dist/app/server/assets/call-UQamaCKN.js +32 -0
- package/dist/app/server/assets/call-UQamaCKN.js.map +1 -0
- package/dist/app/server/assets/ccip-CbNKFO4n.js +2 -0
- package/dist/app/server/assets/ccip-CbNKFO4n.js.map +1 -0
- package/dist/app/server/assets/compiled-query-Ds2NVcFT.js +2 -0
- package/dist/app/server/assets/compiled-query-Ds2NVcFT.js.map +1 -0
- package/dist/app/server/assets/convert-BIC8n32x.js +2 -0
- package/dist/app/server/assets/convert-BIC8n32x.js.map +1 -0
- package/dist/app/server/assets/cookie-CS900nSP.css +1 -0
- package/dist/app/server/assets/cookie-Cce9CrIP.js +10 -0
- package/dist/app/server/assets/cookie-Cce9CrIP.js.map +1 -0
- package/dist/app/server/assets/core-B1HCXUmx.js +56 -0
- package/dist/app/server/assets/core-B1HCXUmx.js.map +1 -0
- package/dist/app/server/assets/d1-sqlite-dialect-m0f01-4z-Cv-csE1u.js +2 -0
- package/dist/app/server/assets/d1-sqlite-dialect-m0f01-4z-Cv-csE1u.js.map +1 -0
- package/dist/app/server/assets/default-u_dwuiYb-BJJ9PwCi.js +2 -0
- package/dist/app/server/assets/default-u_dwuiYb-BJJ9PwCi.js.map +1 -0
- package/dist/app/server/assets/dist-BxSwugSY.js +1 -0
- package/dist/app/server/assets/dist-CZGFhmQd.js +2 -0
- package/dist/app/server/assets/dist-CZGFhmQd.js.map +1 -0
- package/dist/app/server/assets/dist-Dg3PQqiW.js +15 -0
- package/dist/app/server/assets/dist-Dg3PQqiW.js.map +1 -0
- package/dist/app/server/assets/effect-QlVUlMFu-2tSPDT2b.js +2 -0
- package/dist/app/server/assets/effect-QlVUlMFu-2tSPDT2b.js.map +1 -0
- package/dist/app/server/assets/empty-plugin-adapters-BaGcmrjC.js +2 -0
- package/dist/app/server/assets/empty-plugin-adapters-BaGcmrjC.js.map +1 -0
- package/dist/app/server/assets/factory-ipHlJXZY.js +5 -0
- package/dist/app/server/assets/factory-ipHlJXZY.js.map +1 -0
- package/dist/app/server/assets/frxUSD-n9pTpinR.svg +1 -0
- package/dist/app/server/assets/geist-mono-latin-wght-normal-XN7g48iV.woff2 +0 -0
- package/dist/app/server/assets/get-id-field-B0x109VU.js +6 -0
- package/dist/app/server/assets/get-id-field-B0x109VU.js.map +1 -0
- package/dist/app/server/assets/index-CLddUTqr-xpSuLpBt.js +2 -0
- package/dist/app/server/assets/index-CLddUTqr-xpSuLpBt.js.map +1 -0
- package/dist/app/server/assets/index-DZEfthgZ-8Uq5s5Pt.js +2 -0
- package/dist/app/server/assets/index-DZEfthgZ-8Uq5s5Pt.js.map +1 -0
- package/dist/app/server/assets/kysely-adapter-MkHAI9Jk.js +1 -0
- package/dist/app/server/assets/node-sqlite-dialect-BowWLXvK.js +2 -0
- package/dist/app/server/assets/node-sqlite-dialect-BowWLXvK.js.map +1 -0
- package/dist/app/server/assets/pathUSD-BvaO6ooS.svg +25 -0
- package/dist/app/server/assets/reset-co-CHrff.css +1 -0
- package/dist/app/server/assets/rolldown-runtime-B0Z9INg1.js +1 -0
- package/dist/app/server/assets/router-CcbyBCI4.css +1 -0
- package/dist/app/server/assets/router-xjZtEeaI.js +7 -0
- package/dist/app/server/assets/router-xjZtEeaI.js.map +1 -0
- package/dist/app/server/assets/schema-check-Cf7QOZZD.js +9 -0
- package/dist/app/server/assets/schema-check-Cf7QOZZD.js.map +1 -0
- package/dist/app/server/assets/schemas-C2lCYmR5.js +2 -0
- package/dist/app/server/assets/schemas-C2lCYmR5.js.map +1 -0
- package/dist/app/server/assets/secp256k1-buM5g4AL.js +2 -0
- package/dist/app/server/assets/secp256k1-buM5g4AL.js.map +1 -0
- package/dist/app/server/assets/sqlite-adapter-C_LAV4e3.js +2 -0
- package/dist/app/server/assets/sqlite-adapter-C_LAV4e3.js.map +1 -0
- package/dist/app/server/assets/sqlite-introspector-DSCAP82F-Crx7Ny14.js +6 -0
- package/dist/app/server/assets/sqlite-introspector-DSCAP82F-Crx7Ny14.js.map +1 -0
- package/dist/app/server/assets/standard-json-Cg1N07hM.js +2 -0
- package/dist/app/server/assets/standard-json-Cg1N07hM.js.map +1 -0
- package/dist/app/server/assets/standard-json-DY77efq0.js +2 -0
- package/dist/app/server/assets/standard-json-DY77efq0.js.map +1 -0
- package/dist/app/server/assets/standard-json-ig2t0wRt.js +2 -0
- package/dist/app/server/assets/standard-json-ig2t0wRt.js.map +1 -0
- package/dist/app/server/assets/standard-json-t-LNckA6.js +2 -0
- package/dist/app/server/assets/standard-json-t-LNckA6.js.map +1 -0
- package/dist/app/server/assets/standard-openapi-CONmVRl8.js +2 -0
- package/dist/app/server/assets/standard-openapi-CONmVRl8.js.map +1 -0
- package/dist/app/server/assets/start-C63VetBp.js +2 -0
- package/dist/app/server/assets/start-C63VetBp.js.map +1 -0
- package/dist/app/server/assets/sury-CWZTCd75-xt1mWc9f.js +2 -0
- package/dist/app/server/assets/sury-CWZTCd75-xt1mWc9f.js.map +1 -0
- package/dist/app/server/assets/typebox-Dei93FPO-D_lCVdAz.js +2 -0
- package/dist/app/server/assets/typebox-Dei93FPO-D_lCVdAz.js.map +1 -0
- package/dist/app/server/assets/utils-C4ZXZIZW.js +2 -0
- package/dist/app/server/assets/utils-C4ZXZIZW.js.map +1 -0
- package/dist/app/server/assets/valibot--1zFm7rT-NSoY2xTp.js +2 -0
- package/dist/app/server/assets/valibot--1zFm7rT-NSoY2xTp.js.map +1 -0
- package/dist/app/server/assets/valibot-D_HTw1Gn-CJwWeOUE.js +2 -0
- package/dist/app/server/assets/valibot-D_HTw1Gn-CJwWeOUE.js.map +1 -0
- package/dist/app/server/assets/wYLDS-CaCKDrO-.svg +10 -0
- package/dist/app/server/assets/zod-Bwrt9trS-CV38yPnQ.js +2 -0
- package/dist/app/server/assets/zod-Bwrt9trS-CV38yPnQ.js.map +1 -0
- package/dist/app/server/assets/zod-DSgpEGAE-BvlnBE2L.js +2 -0
- package/dist/app/server/assets/zod-DSgpEGAE-BvlnBE2L.js.map +1 -0
- package/dist/app/server/index.js +574 -0
- package/dist/app/server/index.js.map +1 -0
- package/dist/app/server/wrangler.json +1 -0
- package/dist/cli/Admin.d.ts +38 -0
- package/dist/cli/Admin.d.ts.map +1 -0
- package/dist/cli/Admin.js +62 -0
- package/dist/cli/Admin.js.map +1 -0
- package/dist/cli/Apps.d.ts +9 -0
- package/dist/cli/Apps.d.ts.map +1 -0
- package/dist/cli/Apps.js +36 -0
- package/dist/cli/Apps.js.map +1 -0
- package/dist/cli/Cli.d.ts +14 -0
- package/dist/cli/Cli.d.ts.map +1 -0
- package/dist/cli/Cli.js +27 -0
- package/dist/cli/Cli.js.map +1 -0
- package/dist/cli/Project.d.ts +20 -0
- package/dist/cli/Project.d.ts.map +1 -0
- package/dist/cli/Project.js +88 -0
- package/dist/cli/Project.js.map +1 -0
- package/dist/cli/Realms.d.ts +24 -0
- package/dist/cli/Realms.d.ts.map +1 -0
- package/dist/cli/Realms.js +49 -0
- package/dist/cli/Realms.js.map +1 -0
- package/dist/cli/Session.d.ts +85 -0
- package/dist/cli/Session.d.ts.map +1 -0
- package/dist/cli/Session.js +178 -0
- package/dist/cli/Session.js.map +1 -0
- package/dist/cli/User.d.ts +29 -0
- package/dist/cli/User.d.ts.map +1 -0
- package/dist/cli/User.js +39 -0
- package/dist/cli/User.js.map +1 -0
- package/dist/cli/V1.d.ts +35 -0
- package/dist/cli/V1.d.ts.map +1 -0
- package/dist/cli/V1.js +41 -0
- package/dist/cli/V1.js.map +1 -0
- package/dist/cli/bin.d.ts +3 -0
- package/dist/cli/bin.d.ts.map +1 -0
- package/dist/cli/bin.js +46 -0
- package/dist/cli/bin.js.map +1 -0
- package/dist/cli/commands/admin/apps/create.d.ts +23 -0
- package/dist/cli/commands/admin/apps/create.d.ts.map +1 -0
- package/dist/cli/commands/admin/apps/create.js +89 -0
- package/dist/cli/commands/admin/apps/create.js.map +1 -0
- package/dist/cli/commands/admin/apps/delete.d.ts +14 -0
- package/dist/cli/commands/admin/apps/delete.d.ts.map +1 -0
- package/dist/cli/commands/admin/apps/delete.js +41 -0
- package/dist/cli/commands/admin/apps/delete.js.map +1 -0
- package/dist/cli/commands/admin/apps/index.d.ts +5 -0
- package/dist/cli/commands/admin/apps/index.d.ts.map +1 -0
- package/dist/cli/commands/admin/apps/index.js +14 -0
- package/dist/cli/commands/admin/apps/index.js.map +1 -0
- package/dist/cli/commands/admin/apps/list.d.ts +9 -0
- package/dist/cli/commands/admin/apps/list.d.ts.map +1 -0
- package/dist/cli/commands/admin/apps/list.js +26 -0
- package/dist/cli/commands/admin/apps/list.js.map +1 -0
- package/dist/cli/commands/admin/apps/rotate-secret.d.ts +16 -0
- package/dist/cli/commands/admin/apps/rotate-secret.d.ts.map +1 -0
- package/dist/cli/commands/admin/apps/rotate-secret.js +47 -0
- package/dist/cli/commands/admin/apps/rotate-secret.js.map +1 -0
- package/dist/cli/commands/admin/apps/update.d.ts +20 -0
- package/dist/cli/commands/admin/apps/update.d.ts.map +1 -0
- package/dist/cli/commands/admin/apps/update.js +76 -0
- package/dist/cli/commands/admin/apps/update.js.map +1 -0
- package/dist/cli/commands/admin/index.d.ts +5 -0
- package/dist/cli/commands/admin/index.d.ts.map +1 -0
- package/dist/cli/commands/admin/index.js +13 -0
- package/dist/cli/commands/admin/index.js.map +1 -0
- package/dist/cli/commands/admin/migrate.d.ts +9 -0
- package/dist/cli/commands/admin/migrate.d.ts.map +1 -0
- package/dist/cli/commands/admin/migrate.js +17 -0
- package/dist/cli/commands/admin/migrate.js.map +1 -0
- package/dist/cli/commands/admin/realms/add.d.ts +12 -0
- package/dist/cli/commands/admin/realms/add.d.ts.map +1 -0
- package/dist/cli/commands/admin/realms/add.js +42 -0
- package/dist/cli/commands/admin/realms/add.js.map +1 -0
- package/dist/cli/commands/admin/realms/index.d.ts +5 -0
- package/dist/cli/commands/admin/realms/index.d.ts.map +1 -0
- package/dist/cli/commands/admin/realms/index.js +13 -0
- package/dist/cli/commands/admin/realms/index.js.map +1 -0
- package/dist/cli/commands/admin/realms/list.d.ts +13 -0
- package/dist/cli/commands/admin/realms/list.d.ts.map +1 -0
- package/dist/cli/commands/admin/realms/list.js +36 -0
- package/dist/cli/commands/admin/realms/list.js.map +1 -0
- package/dist/cli/commands/admin/realms/passkeys/index.d.ts +5 -0
- package/dist/cli/commands/admin/realms/passkeys/index.d.ts.map +1 -0
- package/dist/cli/commands/admin/realms/passkeys/index.js +13 -0
- package/dist/cli/commands/admin/realms/passkeys/index.js.map +1 -0
- package/dist/cli/commands/admin/realms/passkeys/set.d.ts +16 -0
- package/dist/cli/commands/admin/realms/passkeys/set.d.ts.map +1 -0
- package/dist/cli/commands/admin/realms/passkeys/set.js +46 -0
- package/dist/cli/commands/admin/realms/passkeys/set.js.map +1 -0
- package/dist/cli/commands/admin/realms/privy/index.d.ts +5 -0
- package/dist/cli/commands/admin/realms/privy/index.d.ts.map +1 -0
- package/dist/cli/commands/admin/realms/privy/index.js +13 -0
- package/dist/cli/commands/admin/realms/privy/index.js.map +1 -0
- package/dist/cli/commands/admin/realms/privy/set.d.ts +18 -0
- package/dist/cli/commands/admin/realms/privy/set.d.ts.map +1 -0
- package/dist/cli/commands/admin/realms/privy/set.js +66 -0
- package/dist/cli/commands/admin/realms/privy/set.js.map +1 -0
- package/dist/cli/commands/admin/realms/remove.d.ts +11 -0
- package/dist/cli/commands/admin/realms/remove.d.ts.map +1 -0
- package/dist/cli/commands/admin/realms/remove.js +35 -0
- package/dist/cli/commands/admin/realms/remove.js.map +1 -0
- package/dist/cli/commands/admin/realms/secp256k1/disable.d.ts +15 -0
- package/dist/cli/commands/admin/realms/secp256k1/disable.d.ts.map +1 -0
- package/dist/cli/commands/admin/realms/secp256k1/disable.js +42 -0
- package/dist/cli/commands/admin/realms/secp256k1/disable.js.map +1 -0
- package/dist/cli/commands/admin/realms/secp256k1/enable.d.ts +15 -0
- package/dist/cli/commands/admin/realms/secp256k1/enable.d.ts.map +1 -0
- package/dist/cli/commands/admin/realms/secp256k1/enable.js +42 -0
- package/dist/cli/commands/admin/realms/secp256k1/enable.js.map +1 -0
- package/dist/cli/commands/admin/realms/secp256k1/index.d.ts +9 -0
- package/dist/cli/commands/admin/realms/secp256k1/index.d.ts.map +1 -0
- package/dist/cli/commands/admin/realms/secp256k1/index.js +17 -0
- package/dist/cli/commands/admin/realms/secp256k1/index.js.map +1 -0
- package/dist/cli/commands/admin/realms/set.d.ts +16 -0
- package/dist/cli/commands/admin/realms/set.d.ts.map +1 -0
- package/dist/cli/commands/admin/realms/set.js +46 -0
- package/dist/cli/commands/admin/realms/set.js.map +1 -0
- package/dist/cli/commands/admin/rotate-key.d.ts +15 -0
- package/dist/cli/commands/admin/rotate-key.d.ts.map +1 -0
- package/dist/cli/commands/admin/rotate-key.js +46 -0
- package/dist/cli/commands/admin/rotate-key.js.map +1 -0
- package/dist/cli/commands/init.d.ts +11 -0
- package/dist/cli/commands/init.d.ts.map +1 -0
- package/dist/cli/commands/init.js +34 -0
- package/dist/cli/commands/init.js.map +1 -0
- package/dist/cli/commands/login.d.ts +12 -0
- package/dist/cli/commands/login.d.ts.map +1 -0
- package/dist/cli/commands/login.js +29 -0
- package/dist/cli/commands/login.js.map +1 -0
- package/dist/cli/commands/logout.d.ts +8 -0
- package/dist/cli/commands/logout.d.ts.map +1 -0
- package/dist/cli/commands/logout.js +19 -0
- package/dist/cli/commands/logout.js.map +1 -0
- package/dist/cli/commands/whoami.d.ts +12 -0
- package/dist/cli/commands/whoami.d.ts.map +1 -0
- package/dist/cli/commands/whoami.js +24 -0
- package/dist/cli/commands/whoami.js.map +1 -0
- package/dist/client/Actions.d.ts +101 -0
- package/dist/client/Actions.d.ts.map +1 -0
- package/dist/client/Actions.js +90 -0
- package/dist/client/Actions.js.map +1 -0
- package/dist/client/Auth.d.ts +161 -0
- package/dist/client/Auth.d.ts.map +1 -0
- package/dist/client/Auth.js +113 -0
- package/dist/client/Auth.js.map +1 -0
- package/dist/client/Authorization.d.ts +29 -0
- package/dist/client/Authorization.d.ts.map +1 -0
- package/dist/client/Authorization.js +12 -0
- package/dist/client/Authorization.js.map +1 -0
- package/dist/client/Decorator.d.ts +170 -0
- package/dist/client/Decorator.d.ts.map +1 -0
- package/dist/client/Decorator.js +227 -0
- package/dist/client/Decorator.js.map +1 -0
- package/dist/client/Key.d.ts +85 -0
- package/dist/client/Key.d.ts.map +1 -0
- package/dist/client/Key.js +83 -0
- package/dist/client/Key.js.map +1 -0
- package/dist/client/Pending.d.ts +39 -0
- package/dist/client/Pending.d.ts.map +1 -0
- package/dist/client/Pending.js +12 -0
- package/dist/client/Pending.js.map +1 -0
- package/dist/client/Permissions.d.ts +34 -0
- package/dist/client/Permissions.d.ts.map +1 -0
- package/dist/client/Permissions.js +16 -0
- package/dist/client/Permissions.js.map +1 -0
- package/dist/client/Provider.d.ts +16 -0
- package/dist/client/Provider.d.ts.map +1 -0
- package/dist/client/Provider.js +12 -0
- package/dist/client/Provider.js.map +1 -0
- package/dist/client/Step.d.ts +21 -0
- package/dist/client/Step.d.ts.map +1 -0
- package/dist/client/Step.js +16 -0
- package/dist/client/Step.js.map +1 -0
- package/dist/client/Storage.d.ts +27 -0
- package/dist/client/Storage.d.ts.map +1 -0
- package/dist/client/Storage.js +16 -0
- package/dist/client/Storage.js.map +1 -0
- package/dist/client/TempoAccount.d.ts +40 -0
- package/dist/client/TempoAccount.d.ts.map +1 -0
- package/dist/client/TempoAccount.js +16 -0
- package/dist/client/TempoAccount.js.map +1 -0
- package/dist/client/Tokens.d.ts +25 -0
- package/dist/client/Tokens.d.ts.map +1 -0
- package/dist/client/Tokens.js +12 -0
- package/dist/client/Tokens.js.map +1 -0
- package/dist/client/User.d.ts +21 -0
- package/dist/client/User.d.ts.map +1 -0
- package/dist/client/User.js +12 -0
- package/dist/client/User.js.map +1 -0
- package/dist/client/actions/account.d.ts +25 -0
- package/dist/client/actions/account.d.ts.map +1 -0
- package/dist/client/actions/account.js +34 -0
- package/dist/client/actions/account.js.map +1 -0
- package/dist/client/actions/device.d.ts +53 -0
- package/dist/client/actions/device.d.ts.map +1 -0
- package/dist/client/actions/device.js +79 -0
- package/dist/client/actions/device.js.map +1 -0
- package/dist/client/actions/email.d.ts +84 -0
- package/dist/client/actions/email.d.ts.map +1 -0
- package/dist/client/actions/email.js +63 -0
- package/dist/client/actions/email.js.map +1 -0
- package/dist/client/actions/oauth.d.ts +115 -0
- package/dist/client/actions/oauth.d.ts.map +1 -0
- package/dist/client/actions/oauth.js +105 -0
- package/dist/client/actions/oauth.js.map +1 -0
- package/dist/client/actions/passkey.d.ts +88 -0
- package/dist/client/actions/passkey.d.ts.map +1 -0
- package/dist/client/actions/passkey.js +60 -0
- package/dist/client/actions/passkey.js.map +1 -0
- package/dist/client/actions/provider.d.ts +49 -0
- package/dist/client/actions/provider.d.ts.map +1 -0
- package/dist/client/actions/provider.js +34 -0
- package/dist/client/actions/provider.js.map +1 -0
- package/dist/client/actions/realm.d.ts +24 -0
- package/dist/client/actions/realm.d.ts.map +1 -0
- package/dist/client/actions/realm.js +15 -0
- package/dist/client/actions/realm.js.map +1 -0
- package/dist/client/actions/redirect.d.ts +153 -0
- package/dist/client/actions/redirect.d.ts.map +1 -0
- package/dist/client/actions/redirect.js +236 -0
- package/dist/client/actions/redirect.js.map +1 -0
- package/dist/client/internal/accessKey.d.ts +21 -0
- package/dist/client/internal/accessKey.d.ts.map +1 -0
- package/dist/client/internal/accessKey.js +38 -0
- package/dist/client/internal/accessKey.js.map +1 -0
- package/dist/client/internal/account.d.ts +14 -0
- package/dist/client/internal/account.d.ts.map +1 -0
- package/dist/client/internal/account.js +3 -0
- package/dist/client/internal/account.js.map +1 -0
- package/dist/client/internal/api.d.ts +106 -0
- package/dist/client/internal/api.d.ts.map +1 -0
- package/dist/client/internal/api.js +129 -0
- package/dist/client/internal/api.js.map +1 -0
- package/dist/client/internal/headless.d.ts +33 -0
- package/dist/client/internal/headless.d.ts.map +1 -0
- package/dist/client/internal/headless.js +46 -0
- package/dist/client/internal/headless.js.map +1 -0
- package/dist/client/internal/indexedDb.d.ts +9 -0
- package/dist/client/internal/indexedDb.d.ts.map +1 -0
- package/dist/client/internal/indexedDb.js +32 -0
- package/dist/client/internal/indexedDb.js.map +1 -0
- package/dist/client/internal/request.d.ts +58 -0
- package/dist/client/internal/request.d.ts.map +1 -0
- package/dist/client/internal/request.js +45 -0
- package/dist/client/internal/request.js.map +1 -0
- package/dist/client/internal/store.d.ts +12 -0
- package/dist/client/internal/store.d.ts.map +1 -0
- package/dist/client/internal/store.js +15 -0
- package/dist/client/internal/store.js.map +1 -0
- package/dist/client.d.ts +20 -0
- package/dist/client.d.ts.map +1 -0
- package/dist/client.js +20 -0
- package/dist/client.js.map +1 -0
- package/dist/index.d.ts +7 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +7 -0
- package/dist/index.js.map +1 -0
- package/dist/internal/Apps.d.ts +3051 -0
- package/dist/internal/Apps.d.ts.map +1 -0
- package/dist/internal/Apps.js +472 -0
- package/dist/internal/Apps.js.map +1 -0
- package/dist/internal/Auth.d.ts +4058 -0
- package/dist/internal/Auth.d.ts.map +1 -0
- package/dist/internal/Auth.js +137 -0
- package/dist/internal/Auth.js.map +1 -0
- package/dist/internal/Authorize.d.ts +532 -0
- package/dist/internal/Authorize.d.ts.map +1 -0
- package/dist/internal/Authorize.js +326 -0
- package/dist/internal/Authorize.js.map +1 -0
- package/dist/internal/Device.d.ts +371 -0
- package/dist/internal/Device.d.ts.map +1 -0
- package/dist/internal/Device.js +271 -0
- package/dist/internal/Device.js.map +1 -0
- package/dist/internal/Env.d.ts +57 -0
- package/dist/internal/Env.d.ts.map +1 -0
- package/dist/internal/Env.js +2 -0
- package/dist/internal/Env.js.map +1 -0
- package/dist/internal/ErrorResponse.d.ts +609 -0
- package/dist/internal/ErrorResponse.d.ts.map +1 -0
- package/dist/internal/ErrorResponse.js +679 -0
- package/dist/internal/ErrorResponse.js.map +1 -0
- package/dist/internal/Id.d.ts +10 -0
- package/dist/internal/Id.d.ts.map +1 -0
- package/dist/internal/Id.js +34 -0
- package/dist/internal/Id.js.map +1 -0
- package/dist/internal/KeyAuthorization.d.ts +1456 -0
- package/dist/internal/KeyAuthorization.d.ts.map +1 -0
- package/dist/internal/KeyAuthorization.js +1030 -0
- package/dist/internal/KeyAuthorization.js.map +1 -0
- package/dist/internal/Limits.d.ts +65 -0
- package/dist/internal/Limits.d.ts.map +1 -0
- package/dist/internal/Limits.js +35 -0
- package/dist/internal/Limits.js.map +1 -0
- package/dist/internal/Log.d.ts +49 -0
- package/dist/internal/Log.d.ts.map +1 -0
- package/dist/internal/Log.js +101 -0
- package/dist/internal/Log.js.map +1 -0
- package/dist/internal/LogLine.d.ts +33 -0
- package/dist/internal/LogLine.d.ts.map +1 -0
- package/dist/internal/LogLine.js +56 -0
- package/dist/internal/LogLine.js.map +1 -0
- package/dist/internal/Migrations.d.ts +19 -0
- package/dist/internal/Migrations.d.ts.map +1 -0
- package/dist/internal/Migrations.js +57 -0
- package/dist/internal/Migrations.js.map +1 -0
- package/dist/internal/Owner.d.ts +146 -0
- package/dist/internal/Owner.d.ts.map +1 -0
- package/dist/internal/Owner.js +65 -0
- package/dist/internal/Owner.js.map +1 -0
- package/dist/internal/Passkey.d.ts +528 -0
- package/dist/internal/Passkey.d.ts.map +1 -0
- package/dist/internal/Passkey.js +658 -0
- package/dist/internal/Passkey.js.map +1 -0
- package/dist/internal/PendingKey.d.ts +49 -0
- package/dist/internal/PendingKey.d.ts.map +1 -0
- package/dist/internal/PendingKey.js +58 -0
- package/dist/internal/PendingKey.js.map +1 -0
- package/dist/internal/Privy.d.ts +105 -0
- package/dist/internal/Privy.d.ts.map +1 -0
- package/dist/internal/Privy.js +224 -0
- package/dist/internal/Privy.js.map +1 -0
- package/dist/internal/RateLimit.d.ts +190 -0
- package/dist/internal/RateLimit.d.ts.map +1 -0
- package/dist/internal/RateLimit.js +148 -0
- package/dist/internal/RateLimit.js.map +1 -0
- package/dist/internal/Realm.d.ts +281 -0
- package/dist/internal/Realm.d.ts.map +1 -0
- package/dist/internal/Realm.js +477 -0
- package/dist/internal/Realm.js.map +1 -0
- package/dist/internal/RequestId.d.ts +16 -0
- package/dist/internal/RequestId.d.ts.map +1 -0
- package/dist/internal/RequestId.js +78 -0
- package/dist/internal/RequestId.js.map +1 -0
- package/dist/internal/SigningKey.d.ts +115 -0
- package/dist/internal/SigningKey.d.ts.map +1 -0
- package/dist/internal/SigningKey.js +197 -0
- package/dist/internal/SigningKey.js.map +1 -0
- package/dist/internal/TestInbox.d.ts +42 -0
- package/dist/internal/TestInbox.d.ts.map +1 -0
- package/dist/internal/TestInbox.js +20 -0
- package/dist/internal/TestInbox.js.map +1 -0
- package/dist/internal/Timing.d.ts +51 -0
- package/dist/internal/Timing.d.ts.map +1 -0
- package/dist/internal/Timing.js +103 -0
- package/dist/internal/Timing.js.map +1 -0
- package/dist/internal/Validation.d.ts +52 -0
- package/dist/internal/Validation.d.ts.map +1 -0
- package/dist/internal/Validation.js +22 -0
- package/dist/internal/Validation.js.map +1 -0
- package/dist/internal/Wallet.d.ts +37 -0
- package/dist/internal/Wallet.d.ts.map +1 -0
- package/dist/internal/Wallet.js +43 -0
- package/dist/internal/Wallet.js.map +1 -0
- package/dist/worker.d.ts +12 -0
- package/dist/worker.d.ts.map +1 -0
- package/dist/worker.js +12 -0
- package/dist/worker.js.map +1 -0
- package/package.json +79 -3
- package/src/Api.ts +151 -0
- package/src/App.ts +56 -0
- package/src/api/account.ts +311 -0
- package/src/api/authenticate.ts +1290 -0
- package/src/api/authorize.ts +1030 -0
- package/src/api/device.ts +874 -0
- package/src/api/health.ts +72 -0
- package/src/api/lib/AccountStep.ts +335 -0
- package/src/api/lib/Auth.ts +134 -0
- package/src/api/lib/Consent.ts +339 -0
- package/src/api/lib/Cors.ts +107 -0
- package/src/api/lib/Database.ts +10 -0
- package/src/api/lib/DeviceRequest.ts +265 -0
- package/src/api/lib/FirstAccount.ts +90 -0
- package/src/api/lib/KeySigner.ts +393 -0
- package/src/api/lib/PasskeyLink.ts +162 -0
- package/src/api/lib/Session.ts +34 -0
- package/src/api/lib/SignInConsent.ts +316 -0
- package/src/api/oauth.ts +1282 -0
- package/src/api/provider.ts +441 -0
- package/src/app/components/Button.tsx +128 -0
- package/src/app/components/CodeInput.tsx +186 -0
- package/src/app/components/ErrorMessage.tsx +66 -0
- package/src/app/components/Grant.tsx +323 -0
- package/src/app/components/Input.tsx +48 -0
- package/src/app/components/Tooltip.tsx +45 -0
- package/src/app/components/icons/BRLA.png +0 -0
- package/src/app/components/icons/BRZ.svg +1 -0
- package/src/app/components/icons/CHFAU.png +0 -0
- package/src/app/components/icons/DLUSD.png +0 -0
- package/src/app/components/icons/EURAU.svg +1 -0
- package/src/app/components/icons/EURC.e.svg +1 -0
- package/src/app/components/icons/GBPA.svg +4 -0
- package/src/app/components/icons/GUSD.svg +1 -0
- package/src/app/components/icons/MACH.svg +4 -0
- package/src/app/components/icons/OUSD.svg +5 -0
- package/src/app/components/icons/PRIME.svg +14 -0
- package/src/app/components/icons/SBC.svg +1 -0
- package/src/app/components/icons/SEKAU.svg +5 -0
- package/src/app/components/icons/USD1.svg +30 -0
- package/src/app/components/icons/USDB.svg +11 -0
- package/src/app/components/icons/USDC.e.svg +1 -0
- package/src/app/components/icons/USDT0.svg +1 -0
- package/src/app/components/icons/USDY.svg +16 -0
- package/src/app/components/icons/USDe.svg +1 -0
- package/src/app/components/icons/YLDS.svg +3 -0
- package/src/app/components/icons/alphaUSD.svg +1 -0
- package/src/app/components/icons/betaUSD.svg +1 -0
- package/src/app/components/icons/cUSD.svg +1 -0
- package/src/app/components/icons/cbBTC.svg +1 -0
- package/src/app/components/icons/frxUSD.svg +1 -0
- package/src/app/components/icons/goUSD.svg +5 -0
- package/src/app/components/icons/iUSD.svg +1 -0
- package/src/app/components/icons/pathUSD.svg +25 -0
- package/src/app/components/icons/rUSD.svg +1 -0
- package/src/app/components/icons/reUSD.svg +1 -0
- package/src/app/components/icons/sUSDe.svg +1 -0
- package/src/app/components/icons/siUSD.svg +1 -0
- package/src/app/components/icons/stcUSD.svg +1 -0
- package/src/app/components/icons/syrupUSDC.svg +5 -0
- package/src/app/components/icons/thetaUSD.svg +1 -0
- package/src/app/components/icons/wYLDS.svg +10 -0
- package/src/app/components/icons/wsrUSD.svg +1 -0
- package/src/app/components/logos/OUSD.dark.svg +17 -0
- package/src/app/components/logos/OUSD.light.svg +17 -0
- package/src/app/crons/cleanup.ts +42 -0
- package/src/app/db/auth.ts +416 -0
- package/src/app/db/migrations/0000_better_auth.sql +53 -0
- package/src/app/db/migrations/0001_oauth_provider.sql +162 -0
- package/src/app/db/migrations/0002_device_code.sql +17 -0
- package/src/app/db/migrations/0003_realms.sql +27 -0
- package/src/app/db/migrations/0004_default_realm.sql +2 -0
- package/src/app/db/migrations/0005_passkeys.sql +30 -0
- package/src/app/db/migrations/0006_first_accounts.sql +9 -0
- package/src/app/db/migrations/0007_pending_keys.sql +13 -0
- package/src/app/db/migrations/0008_secp256k1_owners.sql +18 -0
- package/src/app/db/migrations/0009_device_requests.sql +8 -0
- package/src/app/db/migrations/0010_device_keys.sql +4 -0
- package/src/app/db/migrations/meta/0000_snapshot.json +362 -0
- package/src/app/db/migrations/meta/0001_snapshot.json +1487 -0
- package/src/app/db/migrations/meta/0002_snapshot.json +1603 -0
- package/src/app/db/migrations/meta/0003_snapshot.json +1760 -0
- package/src/app/db/migrations/meta/0004_snapshot.json +1760 -0
- package/src/app/db/migrations/meta/0005_snapshot.json +1911 -0
- package/src/app/db/migrations/meta/0006_snapshot.json +1967 -0
- package/src/app/db/migrations/meta/0007_snapshot.json +2047 -0
- package/src/app/db/migrations/meta/0008_snapshot.json +2157 -0
- package/src/app/db/migrations/meta/0009_snapshot.json +2207 -0
- package/src/app/db/migrations/meta/0010_snapshot.json +2231 -0
- package/src/app/db/migrations/meta/_journal.json +83 -0
- package/src/app/db/schema.ts +218 -0
- package/src/app/env.ts +49 -0
- package/src/app/lib/Client.ts +82 -0
- package/src/app/lib/Loader.ts +24 -0
- package/src/app/package.json +8 -0
- package/src/app/routeTree.gen.ts +198 -0
- package/src/app/router.tsx +48 -0
- package/src/app/routes/[_].flows.tsx +3001 -0
- package/src/app/routes/__root.tsx +91 -0
- package/src/app/routes/authorize.tsx +197 -0
- package/src/app/routes/choose-account.tsx +111 -0
- package/src/app/routes/deposit.tsx +105 -0
- package/src/app/routes/device.tsx +227 -0
- package/src/app/routes/index.tsx +115 -0
- package/src/app/routes/login.tsx +506 -0
- package/src/app/screens/Account.tsx +347 -0
- package/src/app/screens/Approval.tsx +276 -0
- package/src/app/screens/ChooseAccount.tsx +240 -0
- package/src/app/screens/Deposit.tsx +762 -0
- package/src/app/screens/DeviceApproval.tsx +480 -0
- package/src/app/screens/SignIn.tsx +362 -0
- package/src/app/screens/chains/base.svg +3 -0
- package/src/app/screens/chains/ethereum.svg +11 -0
- package/src/app/screens/chains/solana.svg +4 -0
- package/src/app/screens/chains/tempo.svg +4 -0
- package/src/app/server.ts +204 -0
- package/src/app/vite.config.ts +95 -0
- package/src/app/void.config.ts +29 -0
- package/src/app/zyzz.config.ts +274 -0
- package/src/cli/Admin.ts +73 -0
- package/src/cli/Apps.ts +29 -0
- package/src/cli/Cli.ts +42 -0
- package/src/cli/Project.ts +117 -0
- package/src/cli/Realms.ts +50 -0
- package/src/cli/Session.ts +239 -0
- package/src/cli/User.ts +45 -0
- package/src/cli/V1.ts +57 -0
- package/src/cli/bin.ts +44 -0
- package/src/cli/commands/admin/apps/create.ts +101 -0
- package/src/cli/commands/admin/apps/delete.ts +38 -0
- package/src/cli/commands/admin/apps/index.ts +15 -0
- package/src/cli/commands/admin/apps/list.ts +25 -0
- package/src/cli/commands/admin/apps/rotate-secret.ts +47 -0
- package/src/cli/commands/admin/apps/update.ts +86 -0
- package/src/cli/commands/admin/index.ts +14 -0
- package/src/cli/commands/admin/migrate.ts +16 -0
- package/src/cli/commands/admin/realms/add.ts +40 -0
- package/src/cli/commands/admin/realms/index.ts +14 -0
- package/src/cli/commands/admin/realms/list.ts +38 -0
- package/src/cli/commands/admin/realms/passkeys/index.ts +15 -0
- package/src/cli/commands/admin/realms/passkeys/set.ts +44 -0
- package/src/cli/commands/admin/realms/privy/index.ts +14 -0
- package/src/cli/commands/admin/realms/privy/set.ts +69 -0
- package/src/cli/commands/admin/realms/remove.ts +33 -0
- package/src/cli/commands/admin/realms/secp256k1/disable.ts +40 -0
- package/src/cli/commands/admin/realms/secp256k1/enable.ts +40 -0
- package/src/cli/commands/admin/realms/secp256k1/index.ts +19 -0
- package/src/cli/commands/admin/realms/set.ts +46 -0
- package/src/cli/commands/admin/rotate-key.ts +47 -0
- package/src/cli/commands/init.ts +42 -0
- package/src/cli/commands/login.ts +32 -0
- package/src/cli/commands/logout.ts +19 -0
- package/src/cli/commands/whoami.ts +23 -0
- package/src/client/Actions.ts +168 -0
- package/src/client/Auth.ts +285 -0
- package/src/client/Authorization.ts +34 -0
- package/src/client/Decorator.ts +410 -0
- package/src/client/Key.ts +140 -0
- package/src/client/Pending.ts +46 -0
- package/src/client/Permissions.ts +39 -0
- package/src/client/Provider.ts +18 -0
- package/src/client/Step.ts +24 -0
- package/src/client/Storage.ts +29 -0
- package/src/client/TempoAccount.ts +42 -0
- package/src/client/Tokens.ts +27 -0
- package/src/client/User.ts +23 -0
- package/src/client/actions/account.ts +57 -0
- package/src/client/actions/device.ts +151 -0
- package/src/client/actions/email.ts +141 -0
- package/src/client/actions/oauth.ts +182 -0
- package/src/client/actions/passkey.ts +141 -0
- package/src/client/actions/provider.ts +70 -0
- package/src/client/actions/realm.ts +36 -0
- package/src/client/actions/redirect.ts +408 -0
- package/src/client/internal/accessKey.ts +54 -0
- package/src/client/internal/account.ts +15 -0
- package/src/client/internal/api.ts +224 -0
- package/src/client/internal/headless.ts +77 -0
- package/src/client/internal/indexedDb.ts +44 -0
- package/src/client/internal/request.ts +71 -0
- package/src/client/internal/store.ts +20 -0
- package/src/client.ts +19 -0
- package/src/index.ts +6 -0
- package/src/internal/Apps.ts +718 -0
- package/src/internal/Auth.ts +203 -0
- package/src/internal/Authorize.ts +424 -0
- package/src/internal/Balance.ts +168 -0
- package/src/internal/BodyLimit.ts +36 -0
- package/src/internal/Chain.ts +16 -0
- package/src/internal/Device.ts +469 -0
- package/src/internal/Env.ts +58 -0
- package/src/internal/ErrorResponse.ts +854 -0
- package/src/internal/Id.ts +41 -0
- package/src/internal/KeyAuthorization.ts +1339 -0
- package/src/internal/Limits.ts +39 -0
- package/src/internal/Log.ts +178 -0
- package/src/internal/LogLine.ts +87 -0
- package/src/internal/Logout.ts +336 -0
- package/src/internal/Migrations.ts +86 -0
- package/src/internal/OpenApi.ts +300 -0
- package/src/internal/Owner.ts +211 -0
- package/src/internal/Passkey.ts +1052 -0
- package/src/internal/PendingKey.ts +104 -0
- package/src/internal/Privy.ts +402 -0
- package/src/internal/Provider.ts +125 -0
- package/src/internal/RateLimit.ts +259 -0
- package/src/internal/Realm.ts +768 -0
- package/src/internal/RequestId.ts +118 -0
- package/src/internal/SignInGrant.ts +168 -0
- package/src/internal/SigningKey.ts +286 -0
- package/src/internal/TempoAccount.ts +342 -0
- package/src/internal/TestInbox.ts +51 -0
- package/src/internal/Timing.ts +158 -0
- package/src/internal/Validation.ts +52 -0
- package/src/internal/Wallet.ts +62 -0
- package/src/internal/owners/Passkey.ts +72 -0
- package/src/internal/owners/Privy.ts +81 -0
- package/src/internal/owners/Secp256k1.ts +143 -0
- package/src/types/app.d.ts +19 -0
- package/src/worker.ts +11 -0
|
@@ -0,0 +1,339 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Records a signed-in user's approval of an app's authorization request, as the approval page does,
|
|
3
|
+
* and as a sign-in does that showed the request's key on the sign-in page. An approval of a request
|
|
4
|
+
* with a key signs the key as the owner of the account first, so a refused key issues no code.
|
|
5
|
+
* @module
|
|
6
|
+
*/
|
|
7
|
+
import { isNativePrivateUseRedirectUri } from '@better-auth/core/utils/redirect-uri'
|
|
8
|
+
import { verifyOAuthQueryParams } from '@better-auth/oauth-provider'
|
|
9
|
+
import { isAPIError } from 'better-auth/api'
|
|
10
|
+
import type { Context } from 'hono'
|
|
11
|
+
import type { Hex } from 'ox'
|
|
12
|
+
import * as z from 'zod'
|
|
13
|
+
import * as Apps from '../../internal/Apps.js'
|
|
14
|
+
import * as core_Auth from '../../internal/Auth.js'
|
|
15
|
+
import * as Authorize from '../../internal/Authorize.js'
|
|
16
|
+
import type { Env } from '../../internal/Env.js'
|
|
17
|
+
import * as ErrorResponse from '../../internal/ErrorResponse.js'
|
|
18
|
+
import * as KeyAuthorization from '../../internal/KeyAuthorization.js'
|
|
19
|
+
import * as Passkey from '../../internal/Passkey.js'
|
|
20
|
+
import * as PendingKey from '../../internal/PendingKey.js'
|
|
21
|
+
import * as Timing from '../../internal/Timing.js'
|
|
22
|
+
import * as Validation from '../../internal/Validation.js'
|
|
23
|
+
import { db } from './Database.js'
|
|
24
|
+
import * as KeySigner from './KeySigner.js'
|
|
25
|
+
|
|
26
|
+
/** Better Auth's result, which names the redirect: a path on Tempo ID, or the app's URL. */
|
|
27
|
+
const result = z.object({ url: z.string().min(1) })
|
|
28
|
+
|
|
29
|
+
/**
|
|
30
|
+
* Approves the authorization request that `oauthQuery` carries for the signed-in `session`, and
|
|
31
|
+
* returns the app's redirect. A request with a key first has its key signed by the account's owner,
|
|
32
|
+
* and the first redemption of the code returns it. A passkey-owned account returns the options of
|
|
33
|
+
* the passkey step, unless `oneTap` holds an assertion of that passkey over the key's digest.
|
|
34
|
+
* Better Auth stores the consent before it returns the redirect, so the next request of the app
|
|
35
|
+
* with the same scopes skips the approval page.
|
|
36
|
+
*/
|
|
37
|
+
export async function approve(
|
|
38
|
+
c: Context<Env>,
|
|
39
|
+
options: approve.Options,
|
|
40
|
+
): Promise<approve.ReturnType | ErrorResponse.Instance<typeof approve.errors>> {
|
|
41
|
+
const { headers, oauthQuery, session } = options
|
|
42
|
+
|
|
43
|
+
// Better Auth stores the consent before it returns the redirect, so the signed redirect URI is
|
|
44
|
+
// checked first, or an approval would let the app's next request reach it without this page.
|
|
45
|
+
const context = await Timing.measure(c, c.var.auth.$context, 'auth.context')
|
|
46
|
+
const verified = await Timing.measure(
|
|
47
|
+
c,
|
|
48
|
+
verifyOAuthQueryParams(oauthQuery, context.secret),
|
|
49
|
+
'auth.verifyOAuthQueryParams',
|
|
50
|
+
)
|
|
51
|
+
if (!verified) return new core_Auth.AuthorizationExpiredError()
|
|
52
|
+
const query = new URLSearchParams(oauthQuery)
|
|
53
|
+
checkRedirect(query)
|
|
54
|
+
|
|
55
|
+
// The caller counts each approval of a key on the user's `AUTHORIZE_LIMIT`, since it reads the
|
|
56
|
+
// user's accounts and calls Privy.
|
|
57
|
+
const keyed = keyedQuery(query)
|
|
58
|
+
const pending = keyed
|
|
59
|
+
? await Timing.measure(
|
|
60
|
+
c,
|
|
61
|
+
approveKey(c, {
|
|
62
|
+
account: options.account,
|
|
63
|
+
assertion: options.assertion,
|
|
64
|
+
oneTap: options.oneTap,
|
|
65
|
+
query,
|
|
66
|
+
session,
|
|
67
|
+
single: options.single,
|
|
68
|
+
}),
|
|
69
|
+
'Consent.approveKey',
|
|
70
|
+
)
|
|
71
|
+
: undefined
|
|
72
|
+
if (pending instanceof ErrorResponse.ResponseError) return pending
|
|
73
|
+
if (pending && 'options' in pending) return { options: pending.options }
|
|
74
|
+
|
|
75
|
+
const approved = await Timing.measure(
|
|
76
|
+
c,
|
|
77
|
+
c.var.auth.api.oauth2Consent({
|
|
78
|
+
// A call with a request returns a `Response` unless `asResponse` is false.
|
|
79
|
+
asResponse: false,
|
|
80
|
+
body: { accept: true, oauth_query: oauthQuery },
|
|
81
|
+
headers,
|
|
82
|
+
// An authorization that asks to sign in again continues through the request.
|
|
83
|
+
request: new Request(c.req.url, { headers, method: 'POST' }),
|
|
84
|
+
}),
|
|
85
|
+
'auth.oauth2Consent',
|
|
86
|
+
).catch((error: unknown) => {
|
|
87
|
+
// Better Auth refuses a forged or expired request before it stores anything.
|
|
88
|
+
if (isAPIError(error) && error.body?.error === 'invalid_signature')
|
|
89
|
+
return new core_Auth.AuthorizationExpiredError()
|
|
90
|
+
throw error
|
|
91
|
+
})
|
|
92
|
+
if (approved instanceof ErrorResponse.ResponseError) return approved
|
|
93
|
+
const redirect = result.parse(approved).url
|
|
94
|
+
|
|
95
|
+
// The signed key waits for the code's redemption, since a redirect URL reaches history, logs, and
|
|
96
|
+
// `Referer` headers. A redirect without a code, such as to sign in again, holds no key.
|
|
97
|
+
const code = URL.parse(redirect)?.searchParams.get('code')
|
|
98
|
+
if (pending && code)
|
|
99
|
+
await Timing.measure(
|
|
100
|
+
c,
|
|
101
|
+
PendingKey.put(db, {
|
|
102
|
+
clientId: pending.clientId,
|
|
103
|
+
codeChallenge: pending.codeChallenge,
|
|
104
|
+
expiry: pending.expiry,
|
|
105
|
+
key: { account: pending.account, keyAuthorization: pending.signed },
|
|
106
|
+
userId: session.user.id,
|
|
107
|
+
}),
|
|
108
|
+
'PendingKey.put',
|
|
109
|
+
)
|
|
110
|
+
return { redirect }
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
export declare namespace approve {
|
|
114
|
+
type Options = {
|
|
115
|
+
/** The account that the approval page showed, if any. */
|
|
116
|
+
account?: `0x${string}` | undefined
|
|
117
|
+
/** The passkey's assertion over the options of the passkey step, if any. */
|
|
118
|
+
assertion?: Passkey.Assertion | undefined
|
|
119
|
+
/** The request headers, with the cookie of the signed-in session. */
|
|
120
|
+
headers: Headers
|
|
121
|
+
/** The signed query string of the approved authorization request. */
|
|
122
|
+
oauthQuery: string
|
|
123
|
+
/** A passkey sign-in whose assertion signed the key's digest, if any. */
|
|
124
|
+
oneTap?: OneTap | undefined
|
|
125
|
+
/** The signed-in session. */
|
|
126
|
+
session: Session
|
|
127
|
+
/**
|
|
128
|
+
* Whether a user who holds several accounts and chose none is refused, in place of the oldest
|
|
129
|
+
* account. A sign-in that grants the key sets it, since it shows no account. Defaults to `false`.
|
|
130
|
+
*/
|
|
131
|
+
single?: boolean | undefined
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
type ReturnType =
|
|
135
|
+
| {
|
|
136
|
+
/** The options of the passkey step, which a passkey-owned account's approval returns. */
|
|
137
|
+
options: PasskeyOptions
|
|
138
|
+
}
|
|
139
|
+
| {
|
|
140
|
+
/** The app's redirect: its `redirect_uri` with a code, or a path on Tempo ID. */
|
|
141
|
+
redirect: string
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
export namespace approve {
|
|
146
|
+
/** The refusals `approve` returns. Its return type admits no other. */
|
|
147
|
+
export const errors = [
|
|
148
|
+
...Authorize.checkKey.errors,
|
|
149
|
+
...KeySigner.resolve.errors,
|
|
150
|
+
...KeySigner.sign.errors,
|
|
151
|
+
core_Auth.AuthorizationExpiredError,
|
|
152
|
+
Authorize.RejectedError,
|
|
153
|
+
KeyAuthorization.WebAuthnRequiredError,
|
|
154
|
+
Passkey.WebAuthnRejectedError,
|
|
155
|
+
Validation.InvalidFieldError,
|
|
156
|
+
] as const
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
/** Returns whether the authorization request `query` carries a key or a challenge, which an approval signs. */
|
|
160
|
+
export function keyedQuery(query: URLSearchParams) {
|
|
161
|
+
return query.has('key_authorization') || query.has('challenge')
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
/** A passkey sign-in whose challenge was the digest of the request's key. */
|
|
165
|
+
export type OneTap = {
|
|
166
|
+
/** The passkey's assertion, which signed the sign-in and the key's digest. */
|
|
167
|
+
assertion: Passkey.Assertion
|
|
168
|
+
/** The random witness that the key's digest binds. */
|
|
169
|
+
witness: Hex.Hex
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
/** The request options of the passkey step, for `navigator.credentials.get()`. */
|
|
173
|
+
type PasskeyOptions = Awaited<ReturnType<typeof KeySigner.challenge>>
|
|
174
|
+
|
|
175
|
+
/** A signed-in session, as `Session.get` returns it. */
|
|
176
|
+
export type Session = { session: { id: string }; user: { id: string } }
|
|
177
|
+
|
|
178
|
+
/**
|
|
179
|
+
* Throws when the `redirect_uri` of the signed authorization `query` is missing, or uses a scheme
|
|
180
|
+
* other than `http:`, `https:`, or a native app's private-use scheme. Better Auth refuses a
|
|
181
|
+
* `javascript:`, `data:`, or `vbscript:` redirect URI, and registration refuses every reserved
|
|
182
|
+
* scheme, such as `file:`. One here is a corrupt registration.
|
|
183
|
+
*/
|
|
184
|
+
export function checkRedirect(query: URLSearchParams) {
|
|
185
|
+
const url = URL.parse(query.get('redirect_uri') ?? '')
|
|
186
|
+
if (
|
|
187
|
+
!url ||
|
|
188
|
+
(url.protocol !== 'http:' &&
|
|
189
|
+
url.protocol !== 'https:' &&
|
|
190
|
+
!isNativePrivateUseRedirectUri(url))
|
|
191
|
+
)
|
|
192
|
+
throw new Error("The app's redirect URI uses a refused scheme.")
|
|
193
|
+
}
|
|
194
|
+
|
|
195
|
+
/**
|
|
196
|
+
* Checks and signs the key authorization that the approved request `query` carries, as the owner of
|
|
197
|
+
* the account that the key names, else the account that the approval page showed, else the app's
|
|
198
|
+
* selected account, else the user's oldest. A user who holds no account receives a first account
|
|
199
|
+
* before the key is signed. A passkey owner signs with `assertion`, or with the assertion of
|
|
200
|
+
* `oneTap` when that passkey owns the account. Without either, it returns the options of the
|
|
201
|
+
* passkey step. Returns what `PendingKey.put` holds, `undefined` for a request without a key, or a
|
|
202
|
+
* refusal.
|
|
203
|
+
*/
|
|
204
|
+
async function approveKey(c: Context<Env>, options: approveKey.Options) {
|
|
205
|
+
const { oneTap, query, session } = options
|
|
206
|
+
const requested = Authorize.fromQuery(query)
|
|
207
|
+
if (!requested || requested instanceof ErrorResponse.ResponseError)
|
|
208
|
+
return requested
|
|
209
|
+
|
|
210
|
+
// Better Auth verified the query's signature, which covers its client ID and challenge.
|
|
211
|
+
const clientId = query.get('client_id')!
|
|
212
|
+
const codeChallenge = query.get('code_challenge')
|
|
213
|
+
|
|
214
|
+
const app = await Timing.measure(
|
|
215
|
+
c,
|
|
216
|
+
Apps.get(db, { clientId }).catch((error: unknown) => {
|
|
217
|
+
if (error instanceof Apps.NotFoundError) return undefined
|
|
218
|
+
throw error
|
|
219
|
+
}),
|
|
220
|
+
'Apps.get',
|
|
221
|
+
)
|
|
222
|
+
const refused = Authorize.checkKey({
|
|
223
|
+
app,
|
|
224
|
+
clientId,
|
|
225
|
+
codeChallenge,
|
|
226
|
+
key: requested,
|
|
227
|
+
})
|
|
228
|
+
if (refused) return refused
|
|
229
|
+
|
|
230
|
+
const signing = await Timing.measure(
|
|
231
|
+
c,
|
|
232
|
+
KeySigner.resolve(c, {
|
|
233
|
+
account: requested.account ?? options.account,
|
|
234
|
+
clientId,
|
|
235
|
+
cookie: c.req.header('cookie'),
|
|
236
|
+
// The approval is an explicit decision on Tempo ID's own page, so a user who holds no account
|
|
237
|
+
// receives the first one here, never on a cross-site GET or a headless authorization.
|
|
238
|
+
create: true,
|
|
239
|
+
// The approval page runs the passkey step.
|
|
240
|
+
passkey: true,
|
|
241
|
+
sessionId: session.session.id,
|
|
242
|
+
single: options.single,
|
|
243
|
+
userId: session.user.id,
|
|
244
|
+
}),
|
|
245
|
+
'KeySigner.resolve',
|
|
246
|
+
)
|
|
247
|
+
// The approval page is the redirect's page, so the refusal names no other flow. Only a passkey
|
|
248
|
+
// whose relying party does not cover Tempo ID's origin reaches it.
|
|
249
|
+
if (signing instanceof KeyAuthorization.WebAuthnRequiredError) {
|
|
250
|
+
const account = signing.response.meta?.account as `0x${string}`
|
|
251
|
+
return new KeyAuthorization.WebAuthnRequiredError({
|
|
252
|
+
account,
|
|
253
|
+
description: `Passkey required: the passkey of Tempo Account ${account} signs only at its own relying party, which the approval page is not part of. Name another account, or deny the request.`,
|
|
254
|
+
})
|
|
255
|
+
}
|
|
256
|
+
if (signing instanceof ErrorResponse.ResponseError) return signing
|
|
257
|
+
|
|
258
|
+
// A one-tap sign-in signs only for the account that its own passkey owns. Its digest binds the
|
|
259
|
+
// sign-in's witness, so the key carries that witness.
|
|
260
|
+
const tapped =
|
|
261
|
+
oneTap && signing.owner.credential?.id === oneTap.assertion.id
|
|
262
|
+
? oneTap
|
|
263
|
+
: undefined
|
|
264
|
+
const key = tapped ? { ...requested, witness: tapped.witness } : requested
|
|
265
|
+
const assertion = tapped?.assertion ?? options.assertion
|
|
266
|
+
|
|
267
|
+
// Only the passkey step issues a challenge, so an assertion for another owner verifies nothing.
|
|
268
|
+
if (options.assertion && signing.owner.signer)
|
|
269
|
+
return new Passkey.WebAuthnRejectedError()
|
|
270
|
+
if (!assertion && !signing.owner.signer)
|
|
271
|
+
return {
|
|
272
|
+
options: await Timing.measure(
|
|
273
|
+
c,
|
|
274
|
+
KeySigner.challenge(c, {
|
|
275
|
+
account: signing.account,
|
|
276
|
+
clientId,
|
|
277
|
+
key,
|
|
278
|
+
owner: signing.owner,
|
|
279
|
+
userId: session.user.id,
|
|
280
|
+
}),
|
|
281
|
+
'KeySigner.challenge',
|
|
282
|
+
),
|
|
283
|
+
}
|
|
284
|
+
|
|
285
|
+
// The sign-in already spent its own challenge, so the key's digest is recorded as a signature
|
|
286
|
+
// request here, and `KeySigner.sign` spends it, which records the assertion as spent.
|
|
287
|
+
if (tapped)
|
|
288
|
+
await Timing.measure(
|
|
289
|
+
c,
|
|
290
|
+
Passkey.requestSignature(db, {
|
|
291
|
+
account: signing.account,
|
|
292
|
+
clientId,
|
|
293
|
+
credential: signing.owner.credential!,
|
|
294
|
+
digest: KeyAuthorization.digest({ key }),
|
|
295
|
+
userId: session.user.id,
|
|
296
|
+
}),
|
|
297
|
+
'Passkey.requestSignature',
|
|
298
|
+
)
|
|
299
|
+
|
|
300
|
+
const signed = await Timing.measure(
|
|
301
|
+
c,
|
|
302
|
+
KeySigner.sign(c, {
|
|
303
|
+
account: signing.account,
|
|
304
|
+
// A server signer ignores the assertion of a one-tap sign-in by another passkey.
|
|
305
|
+
assertion: signing.owner.signer ? undefined : assertion,
|
|
306
|
+
clientId,
|
|
307
|
+
key,
|
|
308
|
+
owner: signing.owner,
|
|
309
|
+
userId: session.user.id,
|
|
310
|
+
}),
|
|
311
|
+
'KeySigner.sign',
|
|
312
|
+
)
|
|
313
|
+
if (signed instanceof ErrorResponse.ResponseError) return signed
|
|
314
|
+
return {
|
|
315
|
+
account: signing.account,
|
|
316
|
+
clientId,
|
|
317
|
+
// `checkKey` refuses a request without a challenge.
|
|
318
|
+
codeChallenge: codeChallenge!,
|
|
319
|
+
expiry: key.expiry,
|
|
320
|
+
signed,
|
|
321
|
+
}
|
|
322
|
+
}
|
|
323
|
+
|
|
324
|
+
declare namespace approveKey {
|
|
325
|
+
type Options = {
|
|
326
|
+
/** The account that the approval page showed, if any. */
|
|
327
|
+
account: `0x${string}` | undefined
|
|
328
|
+
/** The passkey's assertion over the passkey step's options, if any. */
|
|
329
|
+
assertion: Passkey.Assertion | undefined
|
|
330
|
+
/** A passkey sign-in whose assertion signed the key's digest, if any. */
|
|
331
|
+
oneTap: OneTap | undefined
|
|
332
|
+
/** The approved authorization request, whose signature Better Auth verified. */
|
|
333
|
+
query: URLSearchParams
|
|
334
|
+
/** The signed-in session. */
|
|
335
|
+
session: Session
|
|
336
|
+
/** Whether a user who holds several accounts and chose none is refused. */
|
|
337
|
+
single: boolean | undefined
|
|
338
|
+
}
|
|
339
|
+
}
|
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The CORS policies of the root app. First-party apps call `/v1/*` from their own pages with the
|
|
3
|
+
* session cookie, and any page calls the OAuth endpoints that a client authenticates without a
|
|
4
|
+
* cookie, such as the token endpoint.
|
|
5
|
+
* @module
|
|
6
|
+
*/
|
|
7
|
+
import type { Context } from 'hono'
|
|
8
|
+
import { cors } from 'hono/cors'
|
|
9
|
+
import { createMiddleware } from 'hono/factory'
|
|
10
|
+
import { env } from 'void/env'
|
|
11
|
+
import * as Apps from '../../internal/Apps.js'
|
|
12
|
+
import type { Env } from '../../internal/Env.js'
|
|
13
|
+
import * as ErrorResponse from '../../internal/ErrorResponse.js'
|
|
14
|
+
import * as RateLimit from '../../internal/RateLimit.js'
|
|
15
|
+
import * as RequestId from '../../internal/RequestId.js'
|
|
16
|
+
import * as Timing from '../../internal/Timing.js'
|
|
17
|
+
import { db } from './Database.js'
|
|
18
|
+
|
|
19
|
+
/** The response headers outside the CORS safelist that apps read. */
|
|
20
|
+
const exposeHeaders = [...RateLimit.headers, RequestId.header]
|
|
21
|
+
|
|
22
|
+
/**
|
|
23
|
+
* The `/v1` routes that an app's page calls. The routes behind Tempo ID's own pages, such as
|
|
24
|
+
* `/v1/authorize/consent` and `/v1/authorize/account`, stay off the list, so only those pages
|
|
25
|
+
* decide consent and the account step.
|
|
26
|
+
*/
|
|
27
|
+
const paths = new Set([
|
|
28
|
+
'/v1/account',
|
|
29
|
+
'/v1/auth/code',
|
|
30
|
+
'/v1/auth/code/verify',
|
|
31
|
+
'/v1/auth/logout',
|
|
32
|
+
'/v1/auth/passkey/options',
|
|
33
|
+
'/v1/auth/passkey/verify',
|
|
34
|
+
'/v1/auth/providers',
|
|
35
|
+
'/v1/auth/session',
|
|
36
|
+
'/v1/authorize',
|
|
37
|
+
'/v1/realms',
|
|
38
|
+
])
|
|
39
|
+
|
|
40
|
+
/**
|
|
41
|
+
* Returns the `Origin` of a request from a page other than Tempo ID's own, such as a first-party
|
|
42
|
+
* app's page, or `undefined` for Tempo ID's own page and for a request without `Origin`.
|
|
43
|
+
*/
|
|
44
|
+
export function appOrigin(c: Context<Env>) {
|
|
45
|
+
const origin = c.req.header('origin')
|
|
46
|
+
if (!origin) return undefined
|
|
47
|
+
// Tempo ID's pages send the origin they load from: `URL`, or the request's own origin where Tempo
|
|
48
|
+
// ID serves at another address, such as a test harness.
|
|
49
|
+
if ([new URL(env.URL).origin, new URL(c.req.url).origin].includes(origin))
|
|
50
|
+
return undefined
|
|
51
|
+
return origin
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
/**
|
|
55
|
+
* Grants credentialed CORS on the `/v1` routes that an app's page calls, to the origin of a
|
|
56
|
+
* redirect URI of an enabled first-party app, one that skips consent, and to no other origin. A
|
|
57
|
+
* request without an `Origin`, from Tempo ID's own origin, or to another route, passes through
|
|
58
|
+
* unchanged.
|
|
59
|
+
*/
|
|
60
|
+
export const firstParty = createMiddleware<Env>((c, next) => {
|
|
61
|
+
if (!paths.has(c.req.path)) return next()
|
|
62
|
+
return cors({
|
|
63
|
+
credentials: true,
|
|
64
|
+
exposeHeaders,
|
|
65
|
+
origin: async (origin) => {
|
|
66
|
+
if (!origin || origin === new URL(env.URL).origin) return null
|
|
67
|
+
const allowed = await Timing.measure(
|
|
68
|
+
c,
|
|
69
|
+
Apps.firstPartyOrigin(db, { origin }),
|
|
70
|
+
'Apps.firstPartyOrigin',
|
|
71
|
+
)
|
|
72
|
+
return allowed ? origin : null
|
|
73
|
+
},
|
|
74
|
+
})(c, next)
|
|
75
|
+
})
|
|
76
|
+
|
|
77
|
+
/**
|
|
78
|
+
* Grants CORS without credentials to every origin, for the discovery documents, the JWKS, and the
|
|
79
|
+
* OAuth endpoints that read no cookie. Each of those endpoints requires its own credential, such
|
|
80
|
+
* as a code with its PKCE verifier, a client secret, or a Bearer token. The documents and the JWKS
|
|
81
|
+
* are public.
|
|
82
|
+
*/
|
|
83
|
+
export const oauth = cors({ exposeHeaders })
|
|
84
|
+
|
|
85
|
+
/**
|
|
86
|
+
* Refuses a request that continues an app's authorization request with `oauth_query` from an origin
|
|
87
|
+
* other than Tempo ID's own, or the request's own. Only Tempo ID's pages continue one, so a first-party app's page, which
|
|
88
|
+
* CORS admits, cannot sign the user in to another app or approve its request. A request without an
|
|
89
|
+
* `Origin` comes from no browser page, which sends no other user's session cookie.
|
|
90
|
+
*/
|
|
91
|
+
export function ownPage(
|
|
92
|
+
c: Context<Env>,
|
|
93
|
+
options: ownPage.Options,
|
|
94
|
+
): ErrorResponse.Instance<typeof ownPage.errors> | undefined {
|
|
95
|
+
if (!options.oauth_query || !appOrigin(c)) return undefined
|
|
96
|
+
return new ErrorResponse.CrossSiteRequestError()
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
export namespace ownPage {
|
|
100
|
+
export type Options = {
|
|
101
|
+
/** The query string of the authorization request that the request continues, if any. */
|
|
102
|
+
oauth_query?: string | undefined
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
/** The refusals `ownPage` returns. Its return type admits no other. */
|
|
106
|
+
export const errors = [ErrorResponse.CrossSiteRequestError] as const
|
|
107
|
+
}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Void's database client, typed for Tempo ID's Postgres tables. Void writes the Postgres type of
|
|
3
|
+
* `void/db` to `.void/db.d.ts`, which `tsc` excludes as generated, so `tsc` reads Void's D1 default.
|
|
4
|
+
* @module
|
|
5
|
+
*/
|
|
6
|
+
import { db as client } from 'void/db'
|
|
7
|
+
import type * as Realm from '../../internal/Realm.js'
|
|
8
|
+
|
|
9
|
+
/** The request's Drizzle client, which Void connects through Hyperdrive or `DATABASE_URL`. */
|
|
10
|
+
export const db = client as unknown as Realm.Database
|