@atproto/oauth-provider 0.1.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/.postcssrc.yml +3 -0
- package/CHANGELOG.md +19 -0
- package/LICENSE.txt +7 -0
- package/dist/access-token/access-token-type.d.ts +6 -0
- package/dist/access-token/access-token-type.d.ts.map +1 -0
- package/dist/access-token/access-token-type.js +10 -0
- package/dist/access-token/access-token-type.js.map +1 -0
- package/dist/account/account-manager.d.ts +14 -0
- package/dist/account/account-manager.d.ts.map +1 -0
- package/dist/account/account-manager.js +39 -0
- package/dist/account/account-manager.js.map +1 -0
- package/dist/account/account-store.d.ts +39 -0
- package/dist/account/account-store.d.ts.map +1 -0
- package/dist/account/account-store.js +19 -0
- package/dist/account/account-store.js.map +1 -0
- package/dist/account/account.d.ts +8 -0
- package/dist/account/account.d.ts.map +1 -0
- package/dist/account/account.js +3 -0
- package/dist/account/account.js.map +1 -0
- package/dist/assets/app/bundle-manifest.json +22 -0
- package/dist/assets/app/main.css +3 -0
- package/dist/assets/app/main.js +20 -0
- package/dist/assets/app/main.js.map +1 -0
- package/dist/assets/asset.d.ts +9 -0
- package/dist/assets/asset.d.ts.map +1 -0
- package/dist/assets/asset.js +3 -0
- package/dist/assets/asset.js.map +1 -0
- package/dist/assets/assets-middleware.d.ts +2 -0
- package/dist/assets/assets-middleware.d.ts.map +1 -0
- package/dist/assets/assets-middleware.js +30 -0
- package/dist/assets/assets-middleware.js.map +1 -0
- package/dist/assets/index.d.ts +4 -0
- package/dist/assets/index.d.ts.map +1 -0
- package/dist/assets/index.js +65 -0
- package/dist/assets/index.js.map +1 -0
- package/dist/client/client-auth.d.ts +13 -0
- package/dist/client/client-auth.d.ts.map +1 -0
- package/dist/client/client-auth.js +35 -0
- package/dist/client/client-auth.js.map +1 -0
- package/dist/client/client-data.d.ts +8 -0
- package/dist/client/client-data.d.ts.map +1 -0
- package/dist/client/client-data.js +3 -0
- package/dist/client/client-data.js.map +1 -0
- package/dist/client/client-id.d.ts +4 -0
- package/dist/client/client-id.d.ts.map +1 -0
- package/dist/client/client-id.js +6 -0
- package/dist/client/client-id.js.map +1 -0
- package/dist/client/client-info.d.ts +13 -0
- package/dist/client/client-info.d.ts.map +1 -0
- package/dist/client/client-info.js +3 -0
- package/dist/client/client-info.js.map +1 -0
- package/dist/client/client-manager.d.ts +38 -0
- package/dist/client/client-manager.d.ts.map +1 -0
- package/dist/client/client-manager.js +534 -0
- package/dist/client/client-manager.js.map +1 -0
- package/dist/client/client-store.d.ts +13 -0
- package/dist/client/client-store.d.ts.map +1 -0
- package/dist/client/client-store.js +39 -0
- package/dist/client/client-store.js.map +1 -0
- package/dist/client/client-utils.d.ts +6 -0
- package/dist/client/client-utils.d.ts.map +1 -0
- package/dist/client/client-utils.js +40 -0
- package/dist/client/client-utils.js.map +1 -0
- package/dist/client/client.d.ts +41 -0
- package/dist/client/client.d.ts.map +1 -0
- package/dist/client/client.js +163 -0
- package/dist/client/client.js.map +1 -0
- package/dist/constants.d.ts +42 -0
- package/dist/constants.d.ts.map +1 -0
- package/dist/constants.js +53 -0
- package/dist/constants.js.map +1 -0
- package/dist/device/device-data.d.ts +20 -0
- package/dist/device/device-data.d.ts.map +1 -0
- package/dist/device/device-data.js +11 -0
- package/dist/device/device-data.js.map +1 -0
- package/dist/device/device-details.d.ts +17 -0
- package/dist/device/device-details.d.ts.map +1 -0
- package/dist/device/device-details.js +34 -0
- package/dist/device/device-details.js.map +1 -0
- package/dist/device/device-id.d.ts +6 -0
- package/dist/device/device-id.d.ts.map +1 -0
- package/dist/device/device-id.js +18 -0
- package/dist/device/device-id.js.map +1 -0
- package/dist/device/device-manager.d.ts +88 -0
- package/dist/device/device-manager.d.ts.map +1 -0
- package/dist/device/device-manager.js +206 -0
- package/dist/device/device-manager.js.map +1 -0
- package/dist/device/device-store.d.ts +15 -0
- package/dist/device/device-store.d.ts.map +1 -0
- package/dist/device/device-store.js +36 -0
- package/dist/device/device-store.js.map +1 -0
- package/dist/device/session-id.d.ts +6 -0
- package/dist/device/session-id.d.ts.map +1 -0
- package/dist/device/session-id.js +18 -0
- package/dist/device/session-id.js.map +1 -0
- package/dist/dpop/dpop-manager.d.ts +33 -0
- package/dist/dpop/dpop-manager.d.ts.map +1 -0
- package/dist/dpop/dpop-manager.js +115 -0
- package/dist/dpop/dpop-manager.js.map +1 -0
- package/dist/dpop/dpop-nonce.d.ts +13 -0
- package/dist/dpop/dpop-nonce.d.ts.map +1 -0
- package/dist/dpop/dpop-nonce.js +94 -0
- package/dist/dpop/dpop-nonce.js.map +1 -0
- package/dist/errors/access-denied-error.d.ts +8 -0
- package/dist/errors/access-denied-error.d.ts.map +1 -0
- package/dist/errors/access-denied-error.js +21 -0
- package/dist/errors/access-denied-error.js.map +1 -0
- package/dist/errors/account-selection-required-error.d.ts +6 -0
- package/dist/errors/account-selection-required-error.d.ts.map +1 -0
- package/dist/errors/account-selection-required-error.js +11 -0
- package/dist/errors/account-selection-required-error.js.map +1 -0
- package/dist/errors/consent-required-error.d.ts +6 -0
- package/dist/errors/consent-required-error.d.ts.map +1 -0
- package/dist/errors/consent-required-error.js +11 -0
- package/dist/errors/consent-required-error.js.map +1 -0
- package/dist/errors/invalid-authorization-details-error.d.ts +20 -0
- package/dist/errors/invalid-authorization-details-error.d.ts.map +1 -0
- package/dist/errors/invalid-authorization-details-error.js +26 -0
- package/dist/errors/invalid-authorization-details-error.js.map +1 -0
- package/dist/errors/invalid-client-error.d.ts +18 -0
- package/dist/errors/invalid-client-error.d.ts.map +1 -0
- package/dist/errors/invalid-client-error.js +24 -0
- package/dist/errors/invalid-client-error.js.map +1 -0
- package/dist/errors/invalid-client-id-error.d.ts +13 -0
- package/dist/errors/invalid-client-id-error.d.ts.map +1 -0
- package/dist/errors/invalid-client-id-error.js +25 -0
- package/dist/errors/invalid-client-id-error.js.map +1 -0
- package/dist/errors/invalid-client-metadata-error.d.ts +13 -0
- package/dist/errors/invalid-client-metadata-error.d.ts.map +1 -0
- package/dist/errors/invalid-client-metadata-error.js +23 -0
- package/dist/errors/invalid-client-metadata-error.js.map +1 -0
- package/dist/errors/invalid-dpop-key-binding-error.d.ts +12 -0
- package/dist/errors/invalid-dpop-key-binding-error.d.ts.map +1 -0
- package/dist/errors/invalid-dpop-key-binding-error.js +20 -0
- package/dist/errors/invalid-dpop-key-binding-error.js.map +1 -0
- package/dist/errors/invalid-dpop-proof-error.d.ts +5 -0
- package/dist/errors/invalid-dpop-proof-error.d.ts.map +1 -0
- package/dist/errors/invalid-dpop-proof-error.js +12 -0
- package/dist/errors/invalid-dpop-proof-error.js.map +1 -0
- package/dist/errors/invalid-grant-error.d.ts +14 -0
- package/dist/errors/invalid-grant-error.d.ts.map +1 -0
- package/dist/errors/invalid-grant-error.js +20 -0
- package/dist/errors/invalid-grant-error.js.map +1 -0
- package/dist/errors/invalid-parameters-error.d.ts +6 -0
- package/dist/errors/invalid-parameters-error.d.ts.map +1 -0
- package/dist/errors/invalid-parameters-error.js +11 -0
- package/dist/errors/invalid-parameters-error.js.map +1 -0
- package/dist/errors/invalid-redirect-uri-error.d.ts +11 -0
- package/dist/errors/invalid-redirect-uri-error.d.ts.map +1 -0
- package/dist/errors/invalid-redirect-uri-error.js +21 -0
- package/dist/errors/invalid-redirect-uri-error.js.map +1 -0
- package/dist/errors/invalid-request-error.d.ts +28 -0
- package/dist/errors/invalid-request-error.d.ts.map +1 -0
- package/dist/errors/invalid-request-error.js +34 -0
- package/dist/errors/invalid-request-error.js.map +1 -0
- package/dist/errors/invalid-token-error.d.ts +16 -0
- package/dist/errors/invalid-token-error.d.ts.map +1 -0
- package/dist/errors/invalid-token-error.js +45 -0
- package/dist/errors/invalid-token-error.js.map +1 -0
- package/dist/errors/login-required-error.d.ts +6 -0
- package/dist/errors/login-required-error.d.ts.map +1 -0
- package/dist/errors/login-required-error.js +11 -0
- package/dist/errors/login-required-error.js.map +1 -0
- package/dist/errors/oauth-error.d.ts +13 -0
- package/dist/errors/oauth-error.d.ts.map +1 -0
- package/dist/errors/oauth-error.js +29 -0
- package/dist/errors/oauth-error.js.map +1 -0
- package/dist/errors/unauthorized-client-error.d.ts +18 -0
- package/dist/errors/unauthorized-client-error.d.ts.map +1 -0
- package/dist/errors/unauthorized-client-error.js +24 -0
- package/dist/errors/unauthorized-client-error.js.map +1 -0
- package/dist/errors/use-dpop-nonce-error.d.ts +18 -0
- package/dist/errors/use-dpop-nonce-error.d.ts.map +1 -0
- package/dist/errors/use-dpop-nonce-error.js +27 -0
- package/dist/errors/use-dpop-nonce-error.js.map +1 -0
- package/dist/errors/www-authenticate-error.d.ts +9 -0
- package/dist/errors/www-authenticate-error.d.ts.map +1 -0
- package/dist/errors/www-authenticate-error.js +46 -0
- package/dist/errors/www-authenticate-error.js.map +1 -0
- package/dist/index.d.ts +14 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +31 -0
- package/dist/index.js.map +1 -0
- package/dist/lib/html/build-document.d.ts +32 -0
- package/dist/lib/html/build-document.d.ts.map +1 -0
- package/dist/lib/html/build-document.js +61 -0
- package/dist/lib/html/build-document.js.map +1 -0
- package/dist/lib/html/escapers.d.ts +9 -0
- package/dist/lib/html/escapers.d.ts.map +1 -0
- package/dist/lib/html/escapers.js +66 -0
- package/dist/lib/html/escapers.js.map +1 -0
- package/dist/lib/html/html.d.ts +13 -0
- package/dist/lib/html/html.d.ts.map +1 -0
- package/dist/lib/html/html.js +53 -0
- package/dist/lib/html/html.js.map +1 -0
- package/dist/lib/html/index.d.ts +4 -0
- package/dist/lib/html/index.d.ts.map +1 -0
- package/dist/lib/html/index.js +21 -0
- package/dist/lib/html/index.js.map +1 -0
- package/dist/lib/html/tags.d.ts +34 -0
- package/dist/lib/html/tags.d.ts.map +1 -0
- package/dist/lib/html/tags.js +47 -0
- package/dist/lib/html/tags.js.map +1 -0
- package/dist/lib/html/util.d.ts +4 -0
- package/dist/lib/html/util.d.ts.map +1 -0
- package/dist/lib/html/util.js +20 -0
- package/dist/lib/html/util.js.map +1 -0
- package/dist/lib/http/accept.d.ts +29 -0
- package/dist/lib/http/accept.d.ts.map +1 -0
- package/dist/lib/http/accept.js +67 -0
- package/dist/lib/http/accept.js.map +1 -0
- package/dist/lib/http/context.d.ts +5 -0
- package/dist/lib/http/context.d.ts.map +1 -0
- package/dist/lib/http/context.js +10 -0
- package/dist/lib/http/context.js.map +1 -0
- package/dist/lib/http/index.d.ts +10 -0
- package/dist/lib/http/index.d.ts.map +1 -0
- package/dist/lib/http/index.js +26 -0
- package/dist/lib/http/index.js.map +1 -0
- package/dist/lib/http/method.d.ts +6 -0
- package/dist/lib/http/method.d.ts.map +1 -0
- package/dist/lib/http/method.js +19 -0
- package/dist/lib/http/method.js.map +1 -0
- package/dist/lib/http/middleware.d.ts +18 -0
- package/dist/lib/http/middleware.d.ts.map +1 -0
- package/dist/lib/http/middleware.js +118 -0
- package/dist/lib/http/middleware.js.map +1 -0
- package/dist/lib/http/parser.d.ts +33 -0
- package/dist/lib/http/parser.d.ts.map +1 -0
- package/dist/lib/http/parser.js +48 -0
- package/dist/lib/http/parser.js.map +1 -0
- package/dist/lib/http/path.d.ts +9 -0
- package/dist/lib/http/path.d.ts.map +1 -0
- package/dist/lib/http/path.js +54 -0
- package/dist/lib/http/path.js.map +1 -0
- package/dist/lib/http/request.d.ts +33 -0
- package/dist/lib/http/request.d.ts.map +1 -0
- package/dist/lib/http/request.js +86 -0
- package/dist/lib/http/request.js.map +1 -0
- package/dist/lib/http/response.d.ts +13 -0
- package/dist/lib/http/response.d.ts.map +1 -0
- package/dist/lib/http/response.js +98 -0
- package/dist/lib/http/response.js.map +1 -0
- package/dist/lib/http/route.d.ts +25 -0
- package/dist/lib/http/route.d.ts.map +1 -0
- package/dist/lib/http/route.js +39 -0
- package/dist/lib/http/route.js.map +1 -0
- package/dist/lib/http/router.d.ts +32 -0
- package/dist/lib/http/router.d.ts.map +1 -0
- package/dist/lib/http/router.js +74 -0
- package/dist/lib/http/router.js.map +1 -0
- package/dist/lib/http/stream.d.ts +13 -0
- package/dist/lib/http/stream.d.ts.map +1 -0
- package/dist/lib/http/stream.js +46 -0
- package/dist/lib/http/stream.js.map +1 -0
- package/dist/lib/http/types.d.ts +7 -0
- package/dist/lib/http/types.d.ts.map +1 -0
- package/dist/lib/http/types.js +3 -0
- package/dist/lib/http/types.js.map +1 -0
- package/dist/lib/http/url.d.ts +8 -0
- package/dist/lib/http/url.d.ts.map +1 -0
- package/dist/lib/http/url.js +22 -0
- package/dist/lib/http/url.js.map +1 -0
- package/dist/lib/redis.d.ts +5 -0
- package/dist/lib/redis.d.ts.map +1 -0
- package/dist/lib/redis.js +22 -0
- package/dist/lib/redis.js.map +1 -0
- package/dist/lib/util/authorization-header.d.ts +4 -0
- package/dist/lib/util/authorization-header.d.ts.map +1 -0
- package/dist/lib/util/authorization-header.js +23 -0
- package/dist/lib/util/authorization-header.js.map +1 -0
- package/dist/lib/util/cast.d.ts +2 -0
- package/dist/lib/util/cast.d.ts.map +1 -0
- package/dist/lib/util/cast.js +10 -0
- package/dist/lib/util/cast.js.map +1 -0
- package/dist/lib/util/crypto.d.ts +3 -0
- package/dist/lib/util/crypto.d.ts.map +1 -0
- package/dist/lib/util/crypto.js +29 -0
- package/dist/lib/util/crypto.js.map +1 -0
- package/dist/lib/util/date.d.ts +3 -0
- package/dist/lib/util/date.d.ts.map +1 -0
- package/dist/lib/util/date.js +12 -0
- package/dist/lib/util/date.js.map +1 -0
- package/dist/lib/util/hostname.d.ts +6 -0
- package/dist/lib/util/hostname.d.ts.map +1 -0
- package/dist/lib/util/hostname.js +24 -0
- package/dist/lib/util/hostname.js.map +1 -0
- package/dist/lib/util/redirect-uri.d.ts +7 -0
- package/dist/lib/util/redirect-uri.d.ts.map +1 -0
- package/dist/lib/util/redirect-uri.js +44 -0
- package/dist/lib/util/redirect-uri.js.map +1 -0
- package/dist/lib/util/time.d.ts +6 -0
- package/dist/lib/util/time.d.ts.map +1 -0
- package/dist/lib/util/time.js +28 -0
- package/dist/lib/util/time.js.map +1 -0
- package/dist/lib/util/type.d.ts +6 -0
- package/dist/lib/util/type.d.ts.map +1 -0
- package/dist/lib/util/type.js +3 -0
- package/dist/lib/util/type.js.map +1 -0
- package/dist/lib/util/well-known.d.ts +3 -0
- package/dist/lib/util/well-known.d.ts.map +1 -0
- package/dist/lib/util/well-known.js +11 -0
- package/dist/lib/util/well-known.js.map +1 -0
- package/dist/metadata/build-metadata.d.ts +14 -0
- package/dist/metadata/build-metadata.d.ts.map +1 -0
- package/dist/metadata/build-metadata.js +132 -0
- package/dist/metadata/build-metadata.js.map +1 -0
- package/dist/oauth-client.d.ts +4 -0
- package/dist/oauth-client.d.ts.map +1 -0
- package/dist/oauth-client.js +19 -0
- package/dist/oauth-client.js.map +1 -0
- package/dist/oauth-dpop.d.ts +3 -0
- package/dist/oauth-dpop.d.ts.map +1 -0
- package/dist/oauth-dpop.js +19 -0
- package/dist/oauth-dpop.js.map +1 -0
- package/dist/oauth-errors.d.ts +20 -0
- package/dist/oauth-errors.d.ts.map +1 -0
- package/dist/oauth-errors.js +43 -0
- package/dist/oauth-errors.js.map +1 -0
- package/dist/oauth-hooks.d.ts +42 -0
- package/dist/oauth-hooks.d.ts.map +1 -0
- package/dist/oauth-hooks.js +3 -0
- package/dist/oauth-hooks.js.map +1 -0
- package/dist/oauth-provider.d.ts +179 -0
- package/dist/oauth-provider.d.ts.map +1 -0
- package/dist/oauth-provider.js +748 -0
- package/dist/oauth-provider.js.map +1 -0
- package/dist/oauth-store.d.ts +11 -0
- package/dist/oauth-store.d.ts.map +1 -0
- package/dist/oauth-store.js +27 -0
- package/dist/oauth-store.js.map +1 -0
- package/dist/oauth-verifier.d.ts +66 -0
- package/dist/oauth-verifier.d.ts.map +1 -0
- package/dist/oauth-verifier.js +94 -0
- package/dist/oauth-verifier.js.map +1 -0
- package/dist/oidc/claims.d.ts +16 -0
- package/dist/oidc/claims.d.ts.map +1 -0
- package/dist/oidc/claims.js +29 -0
- package/dist/oidc/claims.js.map +1 -0
- package/dist/oidc/sub.d.ts +4 -0
- package/dist/oidc/sub.d.ts.map +1 -0
- package/dist/oidc/sub.js +6 -0
- package/dist/oidc/sub.js.map +1 -0
- package/dist/oidc/userinfo.d.ts +7 -0
- package/dist/oidc/userinfo.d.ts.map +1 -0
- package/dist/oidc/userinfo.js +3 -0
- package/dist/oidc/userinfo.js.map +1 -0
- package/dist/output/build-error-payload.d.ts +6 -0
- package/dist/output/build-error-payload.d.ts.map +1 -0
- package/dist/output/build-error-payload.js +108 -0
- package/dist/output/build-error-payload.js.map +1 -0
- package/dist/output/customization.d.ts +37 -0
- package/dist/output/customization.d.ts.map +1 -0
- package/dist/output/customization.js +62 -0
- package/dist/output/customization.js.map +1 -0
- package/dist/output/send-authorize-page.d.ts +43 -0
- package/dist/output/send-authorize-page.d.ts.map +1 -0
- package/dist/output/send-authorize-page.js +49 -0
- package/dist/output/send-authorize-page.js.map +1 -0
- package/dist/output/send-authorize-redirect.d.ts +25 -0
- package/dist/output/send-authorize-redirect.d.ts.map +1 -0
- package/dist/output/send-authorize-redirect.js +72 -0
- package/dist/output/send-authorize-redirect.js.map +1 -0
- package/dist/output/send-error-page.d.ts +5 -0
- package/dist/output/send-error-page.d.ts.map +1 -0
- package/dist/output/send-error-page.js +31 -0
- package/dist/output/send-error-page.js.map +1 -0
- package/dist/output/send-web-page.d.ts +8 -0
- package/dist/output/send-web-page.d.ts.map +1 -0
- package/dist/output/send-web-page.js +48 -0
- package/dist/output/send-web-page.js.map +1 -0
- package/dist/parameters/claims-requested.d.ts +3 -0
- package/dist/parameters/claims-requested.d.ts.map +1 -0
- package/dist/parameters/claims-requested.js +77 -0
- package/dist/parameters/claims-requested.js.map +1 -0
- package/dist/parameters/oidc-payload.d.ts +31 -0
- package/dist/parameters/oidc-payload.d.ts.map +1 -0
- package/dist/parameters/oidc-payload.js +25 -0
- package/dist/parameters/oidc-payload.js.map +1 -0
- package/dist/replay/replay-manager.d.ts +10 -0
- package/dist/replay/replay-manager.d.ts.map +1 -0
- package/dist/replay/replay-manager.js +23 -0
- package/dist/replay/replay-manager.js.map +1 -0
- package/dist/replay/replay-store-memory.d.ts +11 -0
- package/dist/replay/replay-store-memory.d.ts.map +1 -0
- package/dist/replay/replay-store-memory.js +30 -0
- package/dist/replay/replay-store-memory.js.map +1 -0
- package/dist/replay/replay-store-redis.d.ts +16 -0
- package/dist/replay/replay-store-redis.d.ts.map +1 -0
- package/dist/replay/replay-store-redis.js +20 -0
- package/dist/replay/replay-store-redis.js.map +1 -0
- package/dist/replay/replay-store.d.ts +16 -0
- package/dist/replay/replay-store.d.ts.map +1 -0
- package/dist/replay/replay-store.js +22 -0
- package/dist/replay/replay-store.js.map +1 -0
- package/dist/request/code.d.ts +7 -0
- package/dist/request/code.d.ts.map +1 -0
- package/dist/request/code.js +20 -0
- package/dist/request/code.js.map +1 -0
- package/dist/request/request-data.d.ts +21 -0
- package/dist/request/request-data.d.ts.map +1 -0
- package/dist/request/request-data.js +6 -0
- package/dist/request/request-data.js.map +1 -0
- package/dist/request/request-id.d.ts +6 -0
- package/dist/request/request-id.d.ts.map +1 -0
- package/dist/request/request-id.js +18 -0
- package/dist/request/request-id.js.map +1 -0
- package/dist/request/request-info.d.ts +12 -0
- package/dist/request/request-info.d.ts.map +1 -0
- package/dist/request/request-info.js +3 -0
- package/dist/request/request-info.js.map +1 -0
- package/dist/request/request-manager.d.ts +40 -0
- package/dist/request/request-manager.d.ts.map +1 -0
- package/dist/request/request-manager.js +310 -0
- package/dist/request/request-manager.js.map +1 -0
- package/dist/request/request-store-memory.d.ts +16 -0
- package/dist/request/request-store-memory.d.ts.map +1 -0
- package/dist/request/request-store-memory.js +31 -0
- package/dist/request/request-store-memory.js.map +1 -0
- package/dist/request/request-store-redis.d.ts +24 -0
- package/dist/request/request-store-redis.d.ts.map +1 -0
- package/dist/request/request-store-redis.js +58 -0
- package/dist/request/request-store-redis.js.map +1 -0
- package/dist/request/request-store.d.ts +27 -0
- package/dist/request/request-store.d.ts.map +1 -0
- package/dist/request/request-store.js +37 -0
- package/dist/request/request-store.js.map +1 -0
- package/dist/request/request-uri.d.ts +8 -0
- package/dist/request/request-uri.d.ts.map +1 -0
- package/dist/request/request-uri.js +24 -0
- package/dist/request/request-uri.js.map +1 -0
- package/dist/request/types.d.ts +328 -0
- package/dist/request/types.d.ts.map +1 -0
- package/dist/request/types.js +27 -0
- package/dist/request/types.js.map +1 -0
- package/dist/signer/signed-token-payload.d.ts +1694 -0
- package/dist/signer/signed-token-payload.d.ts.map +1 -0
- package/dist/signer/signed-token-payload.js +32 -0
- package/dist/signer/signed-token-payload.js.map +1 -0
- package/dist/signer/signer.d.ts +193 -0
- package/dist/signer/signer.d.ts.map +1 -0
- package/dist/signer/signer.js +101 -0
- package/dist/signer/signer.js.map +1 -0
- package/dist/token/refresh-token.d.ts +7 -0
- package/dist/token/refresh-token.d.ts.map +1 -0
- package/dist/token/refresh-token.js +20 -0
- package/dist/token/refresh-token.js.map +1 -0
- package/dist/token/token-claims.d.ts +1687 -0
- package/dist/token/token-claims.d.ts.map +1 -0
- package/dist/token/token-claims.js +30 -0
- package/dist/token/token-claims.js.map +1 -0
- package/dist/token/token-data.d.ts +20 -0
- package/dist/token/token-data.d.ts.map +1 -0
- package/dist/token/token-data.js +3 -0
- package/dist/token/token-data.js.map +1 -0
- package/dist/token/token-id.d.ts +7 -0
- package/dist/token/token-id.d.ts.map +1 -0
- package/dist/token/token-id.js +20 -0
- package/dist/token/token-id.js.map +1 -0
- package/dist/token/token-manager.d.ts +48 -0
- package/dist/token/token-manager.d.ts.map +1 -0
- package/dist/token/token-manager.js +421 -0
- package/dist/token/token-manager.js.map +1 -0
- package/dist/token/token-store.d.ts +35 -0
- package/dist/token/token-store.d.ts.map +1 -0
- package/dist/token/token-store.js +38 -0
- package/dist/token/token-store.js.map +1 -0
- package/dist/token/types.d.ts +250 -0
- package/dist/token/types.d.ts.map +1 -0
- package/dist/token/types.js +36 -0
- package/dist/token/types.js.map +1 -0
- package/dist/token/verify-token-claims.d.ts +17 -0
- package/dist/token/verify-token-claims.d.ts.map +1 -0
- package/dist/token/verify-token-claims.js +39 -0
- package/dist/token/verify-token-claims.js.map +1 -0
- package/package.json +83 -0
- package/rollup.config.js +55 -0
- package/src/access-token/access-token-type.ts +5 -0
- package/src/account/account-manager.ts +55 -0
- package/src/account/account-store.ts +74 -0
- package/src/account/account.ts +10 -0
- package/src/assets/app/app.tsx +28 -0
- package/src/assets/app/backend-data.ts +65 -0
- package/src/assets/app/components/accept-form.tsx +112 -0
- package/src/assets/app/components/account-identifier.tsx +18 -0
- package/src/assets/app/components/account-picker.tsx +108 -0
- package/src/assets/app/components/client-identifier.tsx +32 -0
- package/src/assets/app/components/client-name.tsx +30 -0
- package/src/assets/app/components/error-card.tsx +41 -0
- package/src/assets/app/components/help-card.tsx +42 -0
- package/src/assets/app/components/layout-title-page.tsx +43 -0
- package/src/assets/app/components/layout-welcome.tsx +58 -0
- package/src/assets/app/components/sign-in-form.tsx +290 -0
- package/src/assets/app/components/sign-up-account-form.tsx +210 -0
- package/src/assets/app/components/sign-up-disclaimer.tsx +44 -0
- package/src/assets/app/components/url-viewer.tsx +70 -0
- package/src/assets/app/cookies.ts +11 -0
- package/src/assets/app/hooks/use-api.ts +104 -0
- package/src/assets/app/hooks/use-bound-dispatch.ts +5 -0
- package/src/assets/app/hooks/use-csrf-token.ts +5 -0
- package/src/assets/app/lib/api.ts +64 -0
- package/src/assets/app/lib/clsx.ts +4 -0
- package/src/assets/app/lib/util.ts +10 -0
- package/src/assets/app/main.css +11 -0
- package/src/assets/app/main.tsx +28 -0
- package/src/assets/app/views/accept-view.tsx +51 -0
- package/src/assets/app/views/authorize-view.tsx +101 -0
- package/src/assets/app/views/error-view.tsx +27 -0
- package/src/assets/app/views/sign-in-view.tsx +121 -0
- package/src/assets/app/views/sign-up-view.tsx +93 -0
- package/src/assets/app/views/welcome-view.tsx +61 -0
- package/src/assets/asset.ts +8 -0
- package/src/assets/assets-middleware.ts +32 -0
- package/src/assets/index.ts +74 -0
- package/src/client/client-auth.ts +45 -0
- package/src/client/client-data.ts +9 -0
- package/src/client/client-id.ts +4 -0
- package/src/client/client-info.ts +13 -0
- package/src/client/client-manager.ts +818 -0
- package/src/client/client-store.ts +38 -0
- package/src/client/client-utils.ts +43 -0
- package/src/client/client.ts +231 -0
- package/src/constants.ts +69 -0
- package/src/device/device-data.ts +11 -0
- package/src/device/device-details.ts +43 -0
- package/src/device/device-id.ts +23 -0
- package/src/device/device-manager.ts +287 -0
- package/src/device/device-store.ts +35 -0
- package/src/device/session-id.ts +22 -0
- package/src/dpop/dpop-manager.ts +147 -0
- package/src/dpop/dpop-nonce.ts +104 -0
- package/src/errors/access-denied-error.ts +26 -0
- package/src/errors/account-selection-required-error.ts +12 -0
- package/src/errors/consent-required-error.ts +12 -0
- package/src/errors/invalid-authorization-details-error.ts +22 -0
- package/src/errors/invalid-client-error.ts +20 -0
- package/src/errors/invalid-client-id-error.ts +20 -0
- package/src/errors/invalid-client-metadata-error.ts +19 -0
- package/src/errors/invalid-dpop-key-binding-error.ts +21 -0
- package/src/errors/invalid-dpop-proof-error.ts +13 -0
- package/src/errors/invalid-grant-error.ts +16 -0
- package/src/errors/invalid-parameters-error.ts +12 -0
- package/src/errors/invalid-redirect-uri-error.ts +17 -0
- package/src/errors/invalid-request-error.ts +30 -0
- package/src/errors/invalid-token-error.ts +59 -0
- package/src/errors/login-required-error.ts +12 -0
- package/src/errors/oauth-error.ts +28 -0
- package/src/errors/unauthorized-client-error.ts +20 -0
- package/src/errors/use-dpop-nonce-error.ts +32 -0
- package/src/errors/www-authenticate-error.ts +65 -0
- package/src/index.ts +15 -0
- package/src/lib/html/README.md +9 -0
- package/src/lib/html/build-document.ts +98 -0
- package/src/lib/html/escapers.ts +66 -0
- package/src/lib/html/html.ts +61 -0
- package/src/lib/html/index.ts +5 -0
- package/src/lib/html/tags.ts +58 -0
- package/src/lib/html/util.ts +21 -0
- package/src/lib/http/README.md +11 -0
- package/src/lib/http/accept.ts +91 -0
- package/src/lib/http/context.ts +11 -0
- package/src/lib/http/index.ts +9 -0
- package/src/lib/http/method.ts +18 -0
- package/src/lib/http/middleware.ts +183 -0
- package/src/lib/http/parser.ts +64 -0
- package/src/lib/http/path.ts +82 -0
- package/src/lib/http/request.ts +141 -0
- package/src/lib/http/response.ts +133 -0
- package/src/lib/http/route.ts +56 -0
- package/src/lib/http/router.ts +118 -0
- package/src/lib/http/stream.ts +78 -0
- package/src/lib/http/types.ts +22 -0
- package/src/lib/http/url.ts +23 -0
- package/src/lib/redis.ts +23 -0
- package/src/lib/util/authorization-header.ts +26 -0
- package/src/lib/util/cast.ts +4 -0
- package/src/lib/util/crypto.ts +27 -0
- package/src/lib/util/date.ts +7 -0
- package/src/lib/util/hostname.ts +19 -0
- package/src/lib/util/redirect-uri.ts +46 -0
- package/src/lib/util/time.ts +33 -0
- package/src/lib/util/type.ts +4 -0
- package/src/lib/util/well-known.ts +8 -0
- package/src/metadata/build-metadata.ts +165 -0
- package/src/oauth-client.ts +3 -0
- package/src/oauth-dpop.ts +2 -0
- package/src/oauth-errors.ts +21 -0
- package/src/oauth-hooks.ts +66 -0
- package/src/oauth-provider.ts +1409 -0
- package/src/oauth-store.ts +11 -0
- package/src/oauth-verifier.ts +219 -0
- package/src/oidc/claims.ts +35 -0
- package/src/oidc/sub.ts +4 -0
- package/src/oidc/userinfo.ts +11 -0
- package/src/output/build-error-payload.ts +143 -0
- package/src/output/customization.ts +96 -0
- package/src/output/send-authorize-page.ts +111 -0
- package/src/output/send-authorize-redirect.ts +130 -0
- package/src/output/send-error-page.ts +41 -0
- package/src/output/send-web-page.ts +66 -0
- package/src/parameters/claims-requested.ts +106 -0
- package/src/parameters/oidc-payload.ts +28 -0
- package/src/replay/replay-manager.ts +38 -0
- package/src/replay/replay-store-memory.ts +36 -0
- package/src/replay/replay-store-redis.ts +31 -0
- package/src/replay/replay-store.ts +44 -0
- package/src/request/code.ts +24 -0
- package/src/request/request-data.ts +26 -0
- package/src/request/request-id.ts +23 -0
- package/src/request/request-info.ts +12 -0
- package/src/request/request-manager.ts +479 -0
- package/src/request/request-store-memory.ts +39 -0
- package/src/request/request-store-redis.ts +71 -0
- package/src/request/request-store.ts +54 -0
- package/src/request/request-uri.ts +29 -0
- package/src/request/types.ts +48 -0
- package/src/signer/signed-token-payload.ts +35 -0
- package/src/signer/signer.ts +165 -0
- package/src/token/refresh-token.ts +31 -0
- package/src/token/token-claims.ts +31 -0
- package/src/token/token-data.ts +33 -0
- package/src/token/token-id.ts +26 -0
- package/src/token/token-manager.ts +591 -0
- package/src/token/token-store.ts +78 -0
- package/src/token/types.ts +86 -0
- package/src/token/verify-token-claims.ts +65 -0
- package/tailwind.config.js +13 -0
- package/tsconfig.backend.json +9 -0
- package/tsconfig.frontend.json +11 -0
- package/tsconfig.json +8 -0
- package/tsconfig.tools.json +8 -0
@@ -0,0 +1,534 @@
|
|
1
|
+
"use strict";
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
3
|
+
exports.ClientManager = void 0;
|
4
|
+
const fetch_1 = require("@atproto-labs/fetch");
|
5
|
+
const pipe_1 = require("@atproto-labs/pipe");
|
6
|
+
const simple_store_1 = require("@atproto-labs/simple-store");
|
7
|
+
const jwk_1 = require("@atproto/jwk");
|
8
|
+
const oauth_types_1 = require("@atproto/oauth-types");
|
9
|
+
const constants_js_1 = require("../constants.js");
|
10
|
+
const invalid_client_metadata_error_js_1 = require("../errors/invalid-client-metadata-error.js");
|
11
|
+
const invalid_redirect_uri_error_js_1 = require("../errors/invalid-redirect-uri-error.js");
|
12
|
+
const oauth_error_js_1 = require("../errors/oauth-error.js");
|
13
|
+
const hostname_js_1 = require("../lib/util/hostname.js");
|
14
|
+
const client_utils_js_1 = require("./client-utils.js");
|
15
|
+
const client_js_1 = require("./client.js");
|
16
|
+
const fetchMetadataHandler = (0, pipe_1.pipe)((0, fetch_1.fetchOkProcessor)(), (0, fetch_1.fetchJsonProcessor)('application/json', false), (0, fetch_1.fetchJsonZodProcessor)(oauth_types_1.oauthClientMetadataSchema));
|
17
|
+
const fetchJwksHandler = (0, pipe_1.pipe)((0, fetch_1.fetchOkProcessor)(), (0, fetch_1.fetchJsonProcessor)('application/json', false), (0, fetch_1.fetchJsonZodProcessor)(jwk_1.jwksSchema));
|
18
|
+
class ClientManager {
|
19
|
+
keyset;
|
20
|
+
hooks;
|
21
|
+
store;
|
22
|
+
loopbackMetadata;
|
23
|
+
jwks;
|
24
|
+
metadata;
|
25
|
+
constructor(keyset, hooks, store, loopbackMetadata = null, safeFetch, clientJwksCache, clientMetadataCache) {
|
26
|
+
this.keyset = keyset;
|
27
|
+
this.hooks = hooks;
|
28
|
+
this.store = store;
|
29
|
+
this.loopbackMetadata = loopbackMetadata;
|
30
|
+
const fetch = (0, fetch_1.bindFetch)(safeFetch);
|
31
|
+
this.jwks = new simple_store_1.CachedGetter(async (uri, options) => {
|
32
|
+
const jwks = await fetch(buildJsonGetRequest(uri, options)).then(fetchJwksHandler);
|
33
|
+
return jwks;
|
34
|
+
}, clientJwksCache);
|
35
|
+
this.metadata = new simple_store_1.CachedGetter(async (uri, options) => {
|
36
|
+
const metadata = await fetch(buildJsonGetRequest(uri, options)).then(fetchMetadataHandler);
|
37
|
+
// Validate within the getter to avoid caching invalid metadata
|
38
|
+
return this.validateClientMetadata(uri, metadata);
|
39
|
+
}, clientMetadataCache);
|
40
|
+
}
|
41
|
+
/**
|
42
|
+
*
|
43
|
+
* @see {@link https://openid.net/specs/openid-connect-registration-1_0.html#rfc.section.2 OIDC Client Registration}
|
44
|
+
*/
|
45
|
+
async getClient(clientId) {
|
46
|
+
try {
|
47
|
+
const metadata = await this.getClientMetadata(clientId);
|
48
|
+
const jwks = metadata.jwks_uri
|
49
|
+
? await this.jwks.get(metadata.jwks_uri)
|
50
|
+
: undefined;
|
51
|
+
const partialInfo = await this.hooks.onClientInfo?.(clientId, {
|
52
|
+
metadata,
|
53
|
+
jwks,
|
54
|
+
});
|
55
|
+
const isFirstParty = partialInfo?.isFirstParty ?? false;
|
56
|
+
const isTrusted = partialInfo?.isTrusted ??
|
57
|
+
(isFirstParty ||
|
58
|
+
// If the client was loaded from the store, we consider it trusted:
|
59
|
+
(!(0, oauth_types_1.isOAuthClientIdLoopback)(clientId) &&
|
60
|
+
!(0, oauth_types_1.isOAuthClientIdDiscoverable)(clientId)));
|
61
|
+
return new client_js_1.Client(clientId, metadata, jwks, { isFirstParty, isTrusted });
|
62
|
+
}
|
63
|
+
catch (err) {
|
64
|
+
if (err instanceof oauth_error_js_1.OAuthError)
|
65
|
+
throw err;
|
66
|
+
if (err?.['code'] === 'DEPTH_ZERO_SELF_SIGNED_CERT') {
|
67
|
+
throw new invalid_client_metadata_error_js_1.InvalidClientMetadataError('Self-signed certificate', err);
|
68
|
+
}
|
69
|
+
throw invalid_client_metadata_error_js_1.InvalidClientMetadataError.from(err);
|
70
|
+
}
|
71
|
+
}
|
72
|
+
async getClientMetadata(clientId) {
|
73
|
+
if ((0, oauth_types_1.isOAuthClientIdLoopback)(clientId)) {
|
74
|
+
return this.getLoopbackClientMetadata(clientId);
|
75
|
+
}
|
76
|
+
else if ((0, oauth_types_1.isOAuthClientIdDiscoverable)(clientId)) {
|
77
|
+
return this.getDiscoverableClientMetadata(clientId);
|
78
|
+
}
|
79
|
+
else if (this.store) {
|
80
|
+
return this.getStoredClientMetadata(clientId);
|
81
|
+
}
|
82
|
+
throw new invalid_client_metadata_error_js_1.InvalidClientMetadataError(`Invalid client ID "${clientId}"`);
|
83
|
+
}
|
84
|
+
async getLoopbackClientMetadata(clientId) {
|
85
|
+
const { loopbackMetadata } = this;
|
86
|
+
if (!loopbackMetadata) {
|
87
|
+
throw new invalid_client_metadata_error_js_1.InvalidClientMetadataError('Loopback clients are not allowed');
|
88
|
+
}
|
89
|
+
const result = oauth_types_1.oauthClientMetadataSchema.safeParse(await loopbackMetadata(clientId));
|
90
|
+
if (!result.success) {
|
91
|
+
throw invalid_client_metadata_error_js_1.InvalidClientMetadataError.from(result.error);
|
92
|
+
}
|
93
|
+
return this.validateClientMetadata(clientId, result.data);
|
94
|
+
}
|
95
|
+
async getDiscoverableClientMetadata(clientId) {
|
96
|
+
const metadataUrl = (0, client_utils_js_1.parseDiscoverableClientId)(clientId);
|
97
|
+
const metadata = await this.metadata.get(metadataUrl.href);
|
98
|
+
// Note: we do *not* re-validate the metadata here, as the metadata is
|
99
|
+
// validated within the getter. This is to avoid double validation.
|
100
|
+
//
|
101
|
+
// return this.validateClientMetadata(metadataUrl.href, metadata)
|
102
|
+
return metadata;
|
103
|
+
}
|
104
|
+
async getStoredClientMetadata(clientId) {
|
105
|
+
if (this.store) {
|
106
|
+
const metadata = await this.store.findClient(clientId);
|
107
|
+
return this.validateClientMetadata(clientId, metadata);
|
108
|
+
}
|
109
|
+
throw new invalid_client_metadata_error_js_1.InvalidClientMetadataError(`Invalid client ID "${clientId}"`);
|
110
|
+
}
|
111
|
+
/**
|
112
|
+
* This method will ensure that the client metadata is valid w.r.t. the OAuth
|
113
|
+
* and OIDC specifications. It will also ensure that the metadata is
|
114
|
+
* compatible with the implementation of this library, and ATPROTO's
|
115
|
+
* requirements.
|
116
|
+
*/
|
117
|
+
validateClientMetadata(clientId, metadata) {
|
118
|
+
if (metadata.jwks && metadata.jwks_uri) {
|
119
|
+
throw new invalid_client_metadata_error_js_1.InvalidClientMetadataError('jwks_uri and jwks are mutually exclusive');
|
120
|
+
}
|
121
|
+
const clientUriUrl = metadata.client_uri
|
122
|
+
? new URL(metadata.client_uri)
|
123
|
+
: null;
|
124
|
+
const clientUriParsed = clientUriUrl ? (0, hostname_js_1.parseUrlDomain)(clientUriUrl) : null;
|
125
|
+
if (clientUriUrl && !clientUriParsed) {
|
126
|
+
throw new invalid_client_metadata_error_js_1.InvalidClientMetadataError('client_uri must be a valid URL');
|
127
|
+
}
|
128
|
+
const scopes = metadata.scope?.split(' ');
|
129
|
+
if (metadata.grant_types.includes('refresh_token') !==
|
130
|
+
(scopes?.includes('offline_access') ?? false)) {
|
131
|
+
throw new invalid_client_metadata_error_js_1.InvalidClientMetadataError('Grant type "refresh_token" requires scope "offline_access" (and vice versa)');
|
132
|
+
}
|
133
|
+
for (const grantType of metadata.grant_types) {
|
134
|
+
switch (grantType) {
|
135
|
+
case 'authorization_code':
|
136
|
+
case 'refresh_token':
|
137
|
+
case 'implicit': // Required by OIDC (for id_token)
|
138
|
+
continue;
|
139
|
+
case 'password':
|
140
|
+
throw new invalid_client_metadata_error_js_1.InvalidClientMetadataError(`Grant type "${grantType}" is not allowed`);
|
141
|
+
default:
|
142
|
+
throw new invalid_client_metadata_error_js_1.InvalidClientMetadataError(`Grant type "${grantType}" is not supported`);
|
143
|
+
}
|
144
|
+
}
|
145
|
+
if (metadata.client_id && metadata.client_id !== clientId) {
|
146
|
+
throw new invalid_client_metadata_error_js_1.InvalidClientMetadataError('client_id does not match');
|
147
|
+
}
|
148
|
+
if (metadata.subject_type && metadata.subject_type !== 'public') {
|
149
|
+
throw new invalid_client_metadata_error_js_1.InvalidClientMetadataError('Only "public" subject_type is supported');
|
150
|
+
}
|
151
|
+
if (metadata.userinfo_signed_response_alg &&
|
152
|
+
!this.keyset.signAlgorithms.includes(metadata.userinfo_signed_response_alg)) {
|
153
|
+
throw new invalid_client_metadata_error_js_1.InvalidClientMetadataError(`Unsupported "userinfo_signed_response_alg" ${metadata.userinfo_signed_response_alg}`);
|
154
|
+
}
|
155
|
+
if (metadata.id_token_signed_response_alg &&
|
156
|
+
!this.keyset.signAlgorithms.includes(metadata.id_token_signed_response_alg)) {
|
157
|
+
throw new invalid_client_metadata_error_js_1.InvalidClientMetadataError(`Unsupported "id_token_signed_response_alg" ${metadata.id_token_signed_response_alg}`);
|
158
|
+
}
|
159
|
+
if (metadata.userinfo_encrypted_response_alg) {
|
160
|
+
// We only support signature for now.
|
161
|
+
throw new invalid_client_metadata_error_js_1.InvalidClientMetadataError('Encrypted userinfo response is not supported');
|
162
|
+
}
|
163
|
+
if (!metadata[`token_endpoint_auth_method`]) {
|
164
|
+
throw new invalid_client_metadata_error_js_1.InvalidClientMetadataError('Missing token_endpoint_auth_method client metadata');
|
165
|
+
}
|
166
|
+
for (const endpoint of oauth_types_1.OAUTH_AUTHENTICATED_ENDPOINT_NAMES) {
|
167
|
+
const method = metadata[`${endpoint}_endpoint_auth_method`] ||
|
168
|
+
metadata[`token_endpoint_auth_method`];
|
169
|
+
switch (method) {
|
170
|
+
case 'none':
|
171
|
+
if (metadata.token_endpoint_auth_signing_alg) {
|
172
|
+
throw new invalid_client_metadata_error_js_1.InvalidClientMetadataError(`${endpoint}_endpoint_auth_method "none" must not have ${endpoint}_endpoint_auth_signing_alg`);
|
173
|
+
}
|
174
|
+
break;
|
175
|
+
case 'private_key_jwt':
|
176
|
+
if (!metadata.jwks && !metadata.jwks_uri) {
|
177
|
+
throw new invalid_client_metadata_error_js_1.InvalidClientMetadataError(`private_key_jwt auth method requires jwks or jwks_uri`);
|
178
|
+
}
|
179
|
+
if (metadata.jwks?.keys.length === 0) {
|
180
|
+
throw new invalid_client_metadata_error_js_1.InvalidClientMetadataError(`private_key_jwt auth method requires at least one key in jwks`);
|
181
|
+
}
|
182
|
+
if (!metadata.token_endpoint_auth_signing_alg) {
|
183
|
+
throw new invalid_client_metadata_error_js_1.InvalidClientMetadataError(`Missing token_endpoint_auth_signing_alg client metadata`);
|
184
|
+
}
|
185
|
+
break;
|
186
|
+
default:
|
187
|
+
throw new invalid_client_metadata_error_js_1.InvalidClientMetadataError(`${method} is not a supported "${endpoint}_endpoint_auth_method". Use "private_key_jwt" or "none".`);
|
188
|
+
}
|
189
|
+
}
|
190
|
+
if (metadata.authorization_encrypted_response_enc) {
|
191
|
+
throw new invalid_client_metadata_error_js_1.InvalidClientMetadataError('Encrypted authorization response is not supported');
|
192
|
+
}
|
193
|
+
if (metadata.tls_client_certificate_bound_access_tokens) {
|
194
|
+
throw new invalid_client_metadata_error_js_1.InvalidClientMetadataError('Mutual-TLS bound access tokens are not supported');
|
195
|
+
}
|
196
|
+
if (metadata.authorization_encrypted_response_enc &&
|
197
|
+
!metadata.authorization_encrypted_response_alg) {
|
198
|
+
throw new invalid_client_metadata_error_js_1.InvalidClientMetadataError('authorization_encrypted_response_enc requires authorization_encrypted_response_alg');
|
199
|
+
}
|
200
|
+
// ATPROTO spec requires the use of DPoP (OAuth spec defaults to false)
|
201
|
+
if (metadata.dpop_bound_access_tokens !== true) {
|
202
|
+
throw new invalid_client_metadata_error_js_1.InvalidClientMetadataError('"dpop_bound_access_tokens" must be true');
|
203
|
+
}
|
204
|
+
for (const responseType of metadata.response_types) {
|
205
|
+
const rt = responseType.split(' ');
|
206
|
+
// ATPROTO spec requires the use of PKCE
|
207
|
+
if (rt.includes('token')) {
|
208
|
+
throw new invalid_client_metadata_error_js_1.InvalidClientMetadataError('"token" response type is not compatible with PKCE (use "code" instead)');
|
209
|
+
}
|
210
|
+
// Consistency check
|
211
|
+
if (rt.includes('code') &&
|
212
|
+
!metadata.grant_types.includes('authorization_code')) {
|
213
|
+
throw new invalid_client_metadata_error_js_1.InvalidClientMetadataError(`Response type "${responseType}" requires the "authorization_code" grant type`);
|
214
|
+
}
|
215
|
+
// Asking for "code token" or "code id_token" is fine (as long as the
|
216
|
+
// grant_types includes "authorization_code" and the scope includes
|
217
|
+
// "openid"). Asking for "token" or "id_token" (without "code") requires
|
218
|
+
// the "implicit" grant type.
|
219
|
+
if ((rt.includes('token') || rt.includes('id_token')) &&
|
220
|
+
!metadata.grant_types.includes('implicit')) {
|
221
|
+
throw new invalid_client_metadata_error_js_1.InvalidClientMetadataError(`Response type "${responseType}" requires the "implicit" grant type`);
|
222
|
+
}
|
223
|
+
}
|
224
|
+
if (metadata.application_type === 'native') {
|
225
|
+
// https://datatracker.ietf.org/doc/html/rfc8252#section-8.4
|
226
|
+
//
|
227
|
+
// > Except when using a mechanism like Dynamic Client Registration
|
228
|
+
// > [RFC7591] to provision per-instance secrets, native apps are
|
229
|
+
// > classified as public clients, as defined by Section 2.1 of OAuth 2.0
|
230
|
+
// > [RFC6749]; they MUST be registered with the authorization server as
|
231
|
+
// > such. Authorization servers MUST record the client type in the
|
232
|
+
// > client registration details in order to identify and process requests
|
233
|
+
// > accordingly.
|
234
|
+
}
|
235
|
+
if (!metadata.redirect_uris?.length) {
|
236
|
+
// https://openid.net/specs/openid-connect-registration-1_0.html#rfc.section.2
|
237
|
+
//
|
238
|
+
// > OPs can require that request_uri values used be pre-registered with
|
239
|
+
// > the require_request_uri_registration discovery parameter.
|
240
|
+
throw new invalid_client_metadata_error_js_1.InvalidClientMetadataError('At least one redirect_uri is required');
|
241
|
+
}
|
242
|
+
if (metadata.application_type === 'web' &&
|
243
|
+
metadata.grant_types.includes('implicit')) {
|
244
|
+
// https://openid.net/specs/openid-connect-registration-1_0.html#rfc.section.2
|
245
|
+
//
|
246
|
+
// > Web Clients [as defined by "application_type"] using the OAuth
|
247
|
+
// > Implicit Grant Type MUST only register URLs using the https
|
248
|
+
// > scheme as redirect_uris; they MUST NOT use localhost as the
|
249
|
+
// > hostname.
|
250
|
+
for (const redirectUri of metadata.redirect_uris) {
|
251
|
+
const url = (0, client_utils_js_1.parseRedirectUri)(redirectUri);
|
252
|
+
if (url.protocol !== 'https:') {
|
253
|
+
throw new invalid_redirect_uri_error_js_1.InvalidRedirectUriError(`Web clients must use HTTPS redirect URIs`);
|
254
|
+
}
|
255
|
+
if (url.hostname === 'localhost') {
|
256
|
+
throw new invalid_redirect_uri_error_js_1.InvalidRedirectUriError(`Web clients must not use localhost as the hostname`);
|
257
|
+
}
|
258
|
+
}
|
259
|
+
}
|
260
|
+
if (metadata.application_type === 'native') {
|
261
|
+
// https://openid.net/specs/openid-connect-registration-1_0.html#rfc.section.2
|
262
|
+
//
|
263
|
+
// > Native Clients [as defined by "application_type"] MUST only
|
264
|
+
// > register redirect_uris using custom URI schemes or loopback URLs
|
265
|
+
// > using the http scheme; loopback URLs use localhost or the IP
|
266
|
+
// > loopback literals 127.0.0.1 or [::1] as the hostname.
|
267
|
+
for (const redirectUri of metadata.redirect_uris) {
|
268
|
+
const url = (0, client_utils_js_1.parseRedirectUri)(redirectUri);
|
269
|
+
if (url.protocol !== 'http:') {
|
270
|
+
throw new invalid_redirect_uri_error_js_1.InvalidRedirectUriError(`Native clients must use HTTP redirect URIs (got ${url})`);
|
271
|
+
}
|
272
|
+
if (!(0, oauth_types_1.isLoopbackHost)(url.hostname) && !isPrivateUseUriScheme(url)) {
|
273
|
+
throw new invalid_redirect_uri_error_js_1.InvalidRedirectUriError('Loopback redirect URIs are only allowed for native apps');
|
274
|
+
}
|
275
|
+
}
|
276
|
+
}
|
277
|
+
if (metadata.application_type === 'native') {
|
278
|
+
// https://openid.net/specs/openid-connect-registration-1_0.html#rfc.section.2
|
279
|
+
//
|
280
|
+
// > Authorization Servers MAY reject Redirection URI values using
|
281
|
+
// > the http scheme, other than the loopback case for Native
|
282
|
+
// > Clients.
|
283
|
+
for (const redirectUri of metadata.redirect_uris) {
|
284
|
+
const url = (0, client_utils_js_1.parseRedirectUri)(redirectUri);
|
285
|
+
if (url.protocol === 'http:' && !(0, oauth_types_1.isLoopbackUrl)(url)) {
|
286
|
+
throw new invalid_redirect_uri_error_js_1.InvalidRedirectUriError(`Native clients must not use HTTP redirect URIs (got ${url})`);
|
287
|
+
}
|
288
|
+
}
|
289
|
+
}
|
290
|
+
for (const redirectUri of metadata.redirect_uris) {
|
291
|
+
const url = (0, client_utils_js_1.parseRedirectUri)(redirectUri);
|
292
|
+
if (url.username || url.password) {
|
293
|
+
// Is this a valid concern? Should we allow credentials in the URI?
|
294
|
+
throw new invalid_redirect_uri_error_js_1.InvalidRedirectUriError(`Redirect URI ${url} must not contain credentials`);
|
295
|
+
}
|
296
|
+
switch (true) {
|
297
|
+
// FIRST: Loopback redirect URI exception (only for native apps)
|
298
|
+
case url.hostname === 'localhost': {
|
299
|
+
// https://datatracker.ietf.org/doc/html/rfc8252#section-8.3
|
300
|
+
//
|
301
|
+
// > While redirect URIs using localhost (i.e.,
|
302
|
+
// > "http://localhost:{port}/{path}") function similarly to loopback IP
|
303
|
+
// > redirects described in Section 7.3, the use of localhost is NOT
|
304
|
+
// > RECOMMENDED. Specifying a redirect URI with the loopback IP literal
|
305
|
+
// > rather than localhost avoids inadvertently listening on network
|
306
|
+
// > interfaces other than the loopback interface. It is also less
|
307
|
+
// > susceptible to client-side firewalls and misconfigured host name
|
308
|
+
// > resolution on the user's device.
|
309
|
+
throw new invalid_redirect_uri_error_js_1.InvalidRedirectUriError(`Loopback redirect URI ${url} is not allowed (use explicit IPs instead)`);
|
310
|
+
}
|
311
|
+
// falls through
|
312
|
+
case url.hostname === '127.0.0.1':
|
313
|
+
case url.hostname === '[::1]': {
|
314
|
+
// https://datatracker.ietf.org/doc/html/rfc8252#section-7.3
|
315
|
+
//
|
316
|
+
// > Loopback redirect URIs use the "http" scheme and are constructed
|
317
|
+
// > with the loopback IP literal and whatever port the client is
|
318
|
+
// > listening on. That is, "http://127.0.0.1:{port}/{path}" for IPv4,
|
319
|
+
// > and "http://[::1]:{port}/{path}" for IPv6.
|
320
|
+
if (metadata.application_type !== 'native') {
|
321
|
+
throw new invalid_redirect_uri_error_js_1.InvalidRedirectUriError(`Loopback redirect URIs are only allowed for native apps`);
|
322
|
+
}
|
323
|
+
if (url.port) {
|
324
|
+
// https://datatracker.ietf.org/doc/html/rfc8252#section-7.3
|
325
|
+
//
|
326
|
+
// > The authorization server MUST allow any port to be specified at
|
327
|
+
// > the time of the request for loopback IP redirect URIs, to
|
328
|
+
// > accommodate clients that obtain an available ephemeral port
|
329
|
+
// > from the operating system at the time of the request.
|
330
|
+
//
|
331
|
+
// Note: although validation of the redirect_uri will ignore the
|
332
|
+
// port we still allow it to be specified, as the spec does not
|
333
|
+
// forbid it. If a port number is specified, ports will need to
|
334
|
+
// match when validating authorization requests. See
|
335
|
+
// "compareRedirectUri()".
|
336
|
+
}
|
337
|
+
if (url.protocol !== 'http:') {
|
338
|
+
throw new invalid_redirect_uri_error_js_1.InvalidRedirectUriError(`Loopback redirect URI ${url} must use HTTP`);
|
339
|
+
}
|
340
|
+
break;
|
341
|
+
}
|
342
|
+
// SECOND: Protocol-based URI Redirection
|
343
|
+
case url.protocol === 'http:': {
|
344
|
+
// https://openid.net/specs/openid-connect-registration-1_0.html#rfc.section.2
|
345
|
+
//
|
346
|
+
// > request_uri [...] URLs MUST use the https scheme unless the
|
347
|
+
// > target Request Object is signed in a way that is verifiable by
|
348
|
+
// > the OP.
|
349
|
+
//
|
350
|
+
// TODO: Should we allow this (and check for signed request objects)?
|
351
|
+
throw new invalid_redirect_uri_error_js_1.InvalidRedirectUriError(`Non loopback redirect URI ${url} must use HTTPS`);
|
352
|
+
}
|
353
|
+
case url.protocol === 'https:': {
|
354
|
+
const redirectUriDomain = (0, hostname_js_1.parseUrlDomain)(url);
|
355
|
+
if (!redirectUriDomain) {
|
356
|
+
throw new invalid_redirect_uri_error_js_1.InvalidRedirectUriError(`Redirect URI ${url} must be a valid URL`);
|
357
|
+
}
|
358
|
+
// https://datatracker.ietf.org/doc/html/rfc8252#section-8.4
|
359
|
+
//
|
360
|
+
// > In addition to the collision-resistant properties, requiring a
|
361
|
+
// > URI scheme based on a domain name that is under the control of
|
362
|
+
// > the app can help to prove ownership in the event of a dispute
|
363
|
+
// > where two apps claim the same private-use URI scheme (where one
|
364
|
+
// > app is acting maliciously).
|
365
|
+
//
|
366
|
+
// Although this only applies to "native" clients (extract being from
|
367
|
+
// rfc8252), we apply this rule to "web" clients as well.
|
368
|
+
if (!clientUriParsed) {
|
369
|
+
throw new invalid_client_metadata_error_js_1.InvalidClientMetadataError('client_uri is required for HTTPS redirect URIs');
|
370
|
+
}
|
371
|
+
else {
|
372
|
+
if (redirectUriDomain.domain !== clientUriParsed.domain) {
|
373
|
+
throw new invalid_redirect_uri_error_js_1.InvalidRedirectUriError(`Redirect URI ${url} must be under the same domain as client_uri ${metadata.client_uri}`);
|
374
|
+
}
|
375
|
+
}
|
376
|
+
break;
|
377
|
+
}
|
378
|
+
case isPrivateUseUriScheme(url): {
|
379
|
+
// https://datatracker.ietf.org/doc/html/rfc8252#section-7.1
|
380
|
+
//
|
381
|
+
// > When choosing a URI scheme to associate with the app, apps MUST
|
382
|
+
// > use a URI scheme based on a domain name under their control,
|
383
|
+
// > expressed in reverse order, as recommended by Section 3.8 of
|
384
|
+
// > [RFC7595] for private-use URI schemes.
|
385
|
+
if (metadata.application_type !== 'native') {
|
386
|
+
throw new invalid_redirect_uri_error_js_1.InvalidRedirectUriError(`Private-Use URI Scheme redirect URI are only allowed for native apps`);
|
387
|
+
}
|
388
|
+
const redirectUriDomain = (0, hostname_js_1.parseDomain)(reverseDomain(url.protocol.slice(0, -1)));
|
389
|
+
if (!redirectUriDomain) {
|
390
|
+
throw new invalid_redirect_uri_error_js_1.InvalidRedirectUriError(`Private-use URI Scheme redirect URI must be based on a valid domain name`);
|
391
|
+
}
|
392
|
+
// https://datatracker.ietf.org/doc/html/rfc8252#section-8.4
|
393
|
+
//
|
394
|
+
// > In addition to the collision-resistant properties, requiring a
|
395
|
+
// > URI scheme based on a domain name that is under the control of
|
396
|
+
// > the app can help to prove ownership in the event of a dispute
|
397
|
+
// > where two apps claim the same private-use URI scheme (where one
|
398
|
+
// > app is acting maliciously).
|
399
|
+
if (!clientUriParsed) {
|
400
|
+
throw new invalid_client_metadata_error_js_1.InvalidClientMetadataError('client_uri is required for native apps using private-use URI Scheme redirect URIs');
|
401
|
+
}
|
402
|
+
else {
|
403
|
+
if (redirectUriDomain.domain !== clientUriParsed.domain) {
|
404
|
+
throw new invalid_redirect_uri_error_js_1.InvalidRedirectUriError(`Private-Use URI Scheme redirect URI ${url} must be under the same domain as client_uri ${metadata.client_uri}`);
|
405
|
+
}
|
406
|
+
}
|
407
|
+
// https://datatracker.ietf.org/doc/html/rfc8252#section-7.1
|
408
|
+
//
|
409
|
+
// > Following the requirements of Section 3.2 of [RFC3986], as there
|
410
|
+
// > is no naming authority for private-use URI scheme redirects, only
|
411
|
+
// > a single slash ("/") appears after the scheme component.
|
412
|
+
if (url.href.startsWith(`${url.protocol}//`) ||
|
413
|
+
url.username ||
|
414
|
+
url.password ||
|
415
|
+
url.hostname ||
|
416
|
+
url.port) {
|
417
|
+
throw new invalid_redirect_uri_error_js_1.InvalidRedirectUriError(`Private-Use URI Scheme must be in the form ${url.protocol}/<path>`);
|
418
|
+
}
|
419
|
+
break;
|
420
|
+
}
|
421
|
+
default:
|
422
|
+
// https://datatracker.ietf.org/doc/html/rfc8252#section-8.4
|
423
|
+
//
|
424
|
+
// > At a minimum, any private-use URI scheme that doesn't contain a
|
425
|
+
// > period character (".") SHOULD be rejected.
|
426
|
+
throw new invalid_redirect_uri_error_js_1.InvalidRedirectUriError(`Invalid redirect URI scheme "${url.protocol}"`);
|
427
|
+
}
|
428
|
+
}
|
429
|
+
if ((0, oauth_types_1.isOAuthClientIdLoopback)(clientId)) {
|
430
|
+
return this.validateLoopbackClientMetadata(clientId, metadata);
|
431
|
+
}
|
432
|
+
else if ((0, oauth_types_1.isOAuthClientIdDiscoverable)(clientId)) {
|
433
|
+
return this.validateDiscoverableClientMetadata(clientId, metadata);
|
434
|
+
}
|
435
|
+
else {
|
436
|
+
return metadata;
|
437
|
+
}
|
438
|
+
}
|
439
|
+
validateLoopbackClientMetadata(clientId, metadata) {
|
440
|
+
if (metadata.client_uri) {
|
441
|
+
throw new invalid_client_metadata_error_js_1.InvalidClientMetadataError('client_uri is not allowed for loopback clients');
|
442
|
+
}
|
443
|
+
if (metadata.application_type !== 'native') {
|
444
|
+
throw new invalid_client_metadata_error_js_1.InvalidClientMetadataError('Loopback clients must have application_type "native"');
|
445
|
+
}
|
446
|
+
if (!constants_js_1.ALLOW_LOOPBACK_CLIENT_REFRESH_TOKEN &&
|
447
|
+
metadata.grant_types.includes('refresh_token')) {
|
448
|
+
throw new invalid_client_metadata_error_js_1.InvalidClientMetadataError('Loopback clients are not allowed to use the "refresh_token" grant type');
|
449
|
+
}
|
450
|
+
for (const endpoint of oauth_types_1.OAUTH_AUTHENTICATED_ENDPOINT_NAMES) {
|
451
|
+
const method = metadata[`${endpoint}_endpoint_auth_method`] ||
|
452
|
+
metadata[`token_endpoint_auth_method`];
|
453
|
+
if (method !== 'none') {
|
454
|
+
throw new invalid_client_metadata_error_js_1.InvalidClientMetadataError(`Loopback clients are not allowed to use "${endpoint}_endpoint_auth_method" ${method}`);
|
455
|
+
}
|
456
|
+
}
|
457
|
+
for (const redirectUri of metadata.redirect_uris) {
|
458
|
+
const url = (0, client_utils_js_1.parseRedirectUri)(redirectUri);
|
459
|
+
if (url.protocol !== 'http:') {
|
460
|
+
throw new invalid_redirect_uri_error_js_1.InvalidRedirectUriError(`Loopback clients must use HTTP redirect URIs`);
|
461
|
+
}
|
462
|
+
if (!(0, oauth_types_1.isLoopbackHost)(url.hostname)) {
|
463
|
+
throw new invalid_redirect_uri_error_js_1.InvalidRedirectUriError(`Loopback clients must use loopback redirect URIs`);
|
464
|
+
}
|
465
|
+
}
|
466
|
+
return metadata;
|
467
|
+
}
|
468
|
+
validateDiscoverableClientMetadata(clientId, metadata) {
|
469
|
+
if (!metadata.client_id) {
|
470
|
+
// https://drafts.aaronpk.com/draft-parecki-oauth-client-id-metadata-document/draft-parecki-oauth-client-id-metadata-document.html
|
471
|
+
throw new invalid_client_metadata_error_js_1.InvalidClientMetadataError(`client_id is required for discoverable clients`);
|
472
|
+
}
|
473
|
+
const clientIdUrl = (0, client_utils_js_1.parseDiscoverableClientId)(clientId);
|
474
|
+
if (metadata.client_uri) {
|
475
|
+
// https://drafts.aaronpk.com/draft-parecki-oauth-client-id-metadata-document/draft-parecki-oauth-client-id-metadata-document.html
|
476
|
+
//
|
477
|
+
// The client_uri must be a parent of the client_id URL. This might be
|
478
|
+
// relaxed in the future.
|
479
|
+
const clientUriUrl = new URL(metadata.client_uri);
|
480
|
+
if (clientUriUrl.origin !== clientIdUrl.origin) {
|
481
|
+
throw new invalid_client_metadata_error_js_1.InvalidClientMetadataError(`client_uri must have the same origin as the client_id`);
|
482
|
+
}
|
483
|
+
if (clientIdUrl.pathname !== clientUriUrl.pathname) {
|
484
|
+
if (!clientIdUrl.pathname.startsWith(clientUriUrl.pathname.endsWith('/')
|
485
|
+
? clientUriUrl.pathname
|
486
|
+
: `${clientUriUrl.pathname}/`)) {
|
487
|
+
throw new invalid_client_metadata_error_js_1.InvalidClientMetadataError(`client_uri must be a parent URL of the client_id`);
|
488
|
+
}
|
489
|
+
}
|
490
|
+
}
|
491
|
+
for (const endpoint of oauth_types_1.OAUTH_AUTHENTICATED_ENDPOINT_NAMES) {
|
492
|
+
const method = metadata[`${endpoint}_endpoint_auth_method`];
|
493
|
+
switch (method) {
|
494
|
+
case 'client_secret_post':
|
495
|
+
case 'client_secret_basic':
|
496
|
+
case 'client_secret_jwt':
|
497
|
+
throw new invalid_client_metadata_error_js_1.InvalidClientMetadataError(`Client authentication method "${method}" is not allowed for discoverable clients`);
|
498
|
+
}
|
499
|
+
}
|
500
|
+
for (const redirectUri of metadata.redirect_uris) {
|
501
|
+
const url = (0, client_utils_js_1.parseRedirectUri)(redirectUri);
|
502
|
+
if (isPrivateUseUriScheme(url)) {
|
503
|
+
// https://drafts.aaronpk.com/draft-parecki-oauth-client-id-metadata-document/draft-parecki-oauth-client-id-metadata-document.html
|
504
|
+
//
|
505
|
+
// Fully qualified domain name (FQDN) of the client_id, in reverse
|
506
|
+
// order. This could be relaxed to allow same apex domain names, or
|
507
|
+
// parent domains, but for now we require an exact match.
|
508
|
+
const protocol = `${reverseDomain(clientIdUrl.hostname)}:`;
|
509
|
+
if (url.protocol !== protocol) {
|
510
|
+
throw new invalid_redirect_uri_error_js_1.InvalidRedirectUriError(`Private-Use URI Scheme redirect URI, for discoverable client metadata, must be the fully qualified domain name (FQDN) of the client_id, in reverse order (${protocol})`);
|
511
|
+
}
|
512
|
+
}
|
513
|
+
}
|
514
|
+
return metadata;
|
515
|
+
}
|
516
|
+
}
|
517
|
+
exports.ClientManager = ClientManager;
|
518
|
+
function reverseDomain(domain) {
|
519
|
+
return domain.split('.').reverse().join('.');
|
520
|
+
}
|
521
|
+
function isPrivateUseUriScheme(uri) {
|
522
|
+
return uri.protocol.includes('.');
|
523
|
+
}
|
524
|
+
function buildJsonGetRequest(uri, options) {
|
525
|
+
const headers = new Headers([['accept', 'application/json']]);
|
526
|
+
if (options?.noCache)
|
527
|
+
headers.set('cache-control', 'no-cache');
|
528
|
+
return new Request(uri, {
|
529
|
+
headers,
|
530
|
+
signal: options?.signal,
|
531
|
+
redirect: 'error',
|
532
|
+
});
|
533
|
+
}
|
534
|
+
//# sourceMappingURL=client-manager.js.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"client-manager.js","sourceRoot":"","sources":["../../src/client/client-manager.ts"],"names":[],"mappings":"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"}
|
@@ -0,0 +1,13 @@
|
|
1
|
+
import { OAuthClientMetadata } from '@atproto/oauth-types';
|
2
|
+
import { Awaitable } from '../lib/util/type.js';
|
3
|
+
import { ClientId } from './client-id.js';
|
4
|
+
export * from './client-data.js';
|
5
|
+
export * from './client-id.js';
|
6
|
+
export type { Awaitable };
|
7
|
+
export interface ClientStore {
|
8
|
+
findClient(clientId: ClientId): Awaitable<OAuthClientMetadata>;
|
9
|
+
}
|
10
|
+
export declare function isClientStore(implementation: Record<string, unknown> & Partial<ClientStore>): implementation is Record<string, unknown> & ClientStore;
|
11
|
+
export declare function ifClientStore(implementation?: Record<string, unknown> & Partial<ClientStore>): ClientStore | undefined;
|
12
|
+
export declare function asClientStore(implementation?: Record<string, unknown> & Partial<ClientStore>): ClientStore;
|
13
|
+
//# sourceMappingURL=client-store.d.ts.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"client-store.d.ts","sourceRoot":"","sources":["../../src/client/client-store.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAA;AAE1D,OAAO,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAA;AAC/C,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAA;AAGzC,cAAc,kBAAkB,CAAA;AAChC,cAAc,gBAAgB,CAAA;AAC9B,YAAY,EAAE,SAAS,EAAE,CAAA;AAEzB,MAAM,WAAW,WAAW;IAC1B,UAAU,CAAC,QAAQ,EAAE,QAAQ,GAAG,SAAS,CAAC,mBAAmB,CAAC,CAAA;CAC/D;AAED,wBAAgB,aAAa,CAC3B,cAAc,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,WAAW,CAAC,GAC7D,cAAc,IAAI,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,WAAW,CAEzD;AAED,wBAAgB,aAAa,CAC3B,cAAc,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,WAAW,CAAC,GAC9D,WAAW,GAAG,SAAS,CAMzB;AAED,wBAAgB,aAAa,CAC3B,cAAc,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,WAAW,CAAC,GAC9D,WAAW,CAKb"}
|
@@ -0,0 +1,39 @@
|
|
1
|
+
"use strict";
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
3
|
+
if (k2 === undefined) k2 = k;
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
7
|
+
}
|
8
|
+
Object.defineProperty(o, k2, desc);
|
9
|
+
}) : (function(o, m, k, k2) {
|
10
|
+
if (k2 === undefined) k2 = k;
|
11
|
+
o[k2] = m[k];
|
12
|
+
}));
|
13
|
+
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
14
|
+
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
15
|
+
};
|
16
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
17
|
+
exports.asClientStore = exports.ifClientStore = exports.isClientStore = void 0;
|
18
|
+
// Export all types needed to implement the ClientStore interface
|
19
|
+
__exportStar(require("./client-data.js"), exports);
|
20
|
+
__exportStar(require("./client-id.js"), exports);
|
21
|
+
function isClientStore(implementation) {
|
22
|
+
return typeof implementation.findClient === 'function';
|
23
|
+
}
|
24
|
+
exports.isClientStore = isClientStore;
|
25
|
+
function ifClientStore(implementation) {
|
26
|
+
if (implementation && isClientStore(implementation)) {
|
27
|
+
return implementation;
|
28
|
+
}
|
29
|
+
return undefined;
|
30
|
+
}
|
31
|
+
exports.ifClientStore = ifClientStore;
|
32
|
+
function asClientStore(implementation) {
|
33
|
+
const store = ifClientStore(implementation);
|
34
|
+
if (store)
|
35
|
+
return store;
|
36
|
+
throw new Error('Invalid ClientStore implementation');
|
37
|
+
}
|
38
|
+
exports.asClientStore = asClientStore;
|
39
|
+
//# sourceMappingURL=client-store.js.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"client-store.js","sourceRoot":"","sources":["../../src/client/client-store.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;AAKA,iEAAiE;AACjE,mDAAgC;AAChC,iDAA8B;AAO9B,SAAgB,aAAa,CAC3B,cAA8D;IAE9D,OAAO,OAAO,cAAc,CAAC,UAAU,KAAK,UAAU,CAAA;AACxD,CAAC;AAJD,sCAIC;AAED,SAAgB,aAAa,CAC3B,cAA+D;IAE/D,IAAI,cAAc,IAAI,aAAa,CAAC,cAAc,CAAC,EAAE,CAAC;QACpD,OAAO,cAAc,CAAA;IACvB,CAAC;IAED,OAAO,SAAS,CAAA;AAClB,CAAC;AARD,sCAQC;AAED,SAAgB,aAAa,CAC3B,cAA+D;IAE/D,MAAM,KAAK,GAAG,aAAa,CAAC,cAAc,CAAC,CAAA;IAC3C,IAAI,KAAK;QAAE,OAAO,KAAK,CAAA;IAEvB,MAAM,IAAI,KAAK,CAAC,oCAAoC,CAAC,CAAA;AACvD,CAAC;AAPD,sCAOC"}
|
@@ -0,0 +1,6 @@
|
|
1
|
+
/// <reference types="node" />
|
2
|
+
import { OAuthClientIdDiscoverable, OAuthClientIdLoopback } from '@atproto/oauth-types';
|
3
|
+
export declare function parseRedirectUri(redirectUri: string): URL;
|
4
|
+
export declare function parseDiscoverableClientId(clientId: OAuthClientIdDiscoverable): URL;
|
5
|
+
export declare function parseLoopbackClientId(clientId: OAuthClientIdLoopback): URL;
|
6
|
+
//# sourceMappingURL=client-utils.d.ts.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"client-utils.d.ts","sourceRoot":"","sources":["../../src/client/client-utils.ts"],"names":[],"mappings":";AAAA,OAAO,EACL,yBAAyB,EACzB,qBAAqB,EAGtB,MAAM,sBAAsB,CAAA;AAM7B,wBAAgB,gBAAgB,CAAC,WAAW,EAAE,MAAM,GAAG,GAAG,CAMzD;AAED,wBAAgB,yBAAyB,CACvC,QAAQ,EAAE,yBAAyB,GAClC,GAAG,CAaL;AAED,wBAAgB,qBAAqB,CAAC,QAAQ,EAAE,qBAAqB,GAAG,GAAG,CAM1E"}
|