@atproto/oauth-provider 0.1.0
Sign up to get free protection for your applications and to get access to all the features.
- 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"}
|