@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,20 @@
|
|
1
|
+
import { OAuthError } from './oauth-error.js'
|
2
|
+
|
3
|
+
/**
|
4
|
+
* @see {@link https://datatracker.ietf.org/doc/html/rfc7591#section-3.2.2 | RFC7591 - Client Registration Error Response}
|
5
|
+
*
|
6
|
+
* The value of one of the client metadata fields is invalid and the server has
|
7
|
+
* rejected this request. Note that an authorization server MAY choose to
|
8
|
+
* substitute a valid value for any requested parameter of a client's metadata.
|
9
|
+
*/
|
10
|
+
export class InvalidClientIdError extends OAuthError {
|
11
|
+
constructor(error_description: string, cause?: unknown) {
|
12
|
+
super('invalid_client_id', error_description, 400, cause)
|
13
|
+
}
|
14
|
+
|
15
|
+
static from(err: unknown): InvalidClientIdError {
|
16
|
+
if (err instanceof InvalidClientIdError) return err
|
17
|
+
if (err instanceof TypeError) return new InvalidClientIdError(err.message)
|
18
|
+
return new InvalidClientIdError('Invalid client identifier', err)
|
19
|
+
}
|
20
|
+
}
|
@@ -0,0 +1,19 @@
|
|
1
|
+
import { OAuthError } from './oauth-error.js'
|
2
|
+
|
3
|
+
/**
|
4
|
+
* @see {@link https://datatracker.ietf.org/doc/html/rfc7591#section-3.2.2 | RFC7591 - Client Registration Error Response}
|
5
|
+
*
|
6
|
+
* The value of one of the client metadata fields is invalid and the server has
|
7
|
+
* rejected this request. Note that an authorization server MAY choose to
|
8
|
+
* substitute a valid value for any requested parameter of a client's metadata.
|
9
|
+
*/
|
10
|
+
export class InvalidClientMetadataError extends OAuthError {
|
11
|
+
constructor(error_description: string, cause?: unknown) {
|
12
|
+
super('invalid_client_metadata', error_description, 400, cause)
|
13
|
+
}
|
14
|
+
|
15
|
+
static from(cause: unknown): InvalidClientMetadataError {
|
16
|
+
if (cause instanceof InvalidClientMetadataError) return cause
|
17
|
+
return new InvalidClientMetadataError('Invalid client configuration', cause)
|
18
|
+
}
|
19
|
+
}
|
@@ -0,0 +1,21 @@
|
|
1
|
+
import { WWWAuthenticateError } from './www-authenticate-error.js'
|
2
|
+
|
3
|
+
/**
|
4
|
+
* @see
|
5
|
+
* {@link https://datatracker.ietf.org/doc/html/rfc6750#section-3.1 | RFC6750 - The WWW-Authenticate Response Header Field}
|
6
|
+
*
|
7
|
+
* @see
|
8
|
+
* {@link https://datatracker.ietf.org/doc/html/rfc9449#name-the-dpop-authentication-sch | RFC9449 - The DPoP Authentication Scheme}
|
9
|
+
*/
|
10
|
+
export class InvalidDpopKeyBindingError extends WWWAuthenticateError {
|
11
|
+
constructor(cause?: unknown) {
|
12
|
+
const error = 'invalid_token'
|
13
|
+
const error_description = 'Invalid DPoP key binding'
|
14
|
+
super(
|
15
|
+
error,
|
16
|
+
error_description,
|
17
|
+
{ DPoP: { error, error_description } },
|
18
|
+
cause,
|
19
|
+
)
|
20
|
+
}
|
21
|
+
}
|
@@ -0,0 +1,13 @@
|
|
1
|
+
import { WWWAuthenticateError } from './www-authenticate-error.js'
|
2
|
+
|
3
|
+
export class InvalidDpopProofError extends WWWAuthenticateError {
|
4
|
+
constructor(error_description: string, cause?: unknown) {
|
5
|
+
const error = 'invalid_dpop_proof'
|
6
|
+
super(
|
7
|
+
error,
|
8
|
+
error_description,
|
9
|
+
{ DPoP: { error, error_description } },
|
10
|
+
cause,
|
11
|
+
)
|
12
|
+
}
|
13
|
+
}
|
@@ -0,0 +1,16 @@
|
|
1
|
+
import { OAuthError } from './oauth-error.js'
|
2
|
+
|
3
|
+
/**
|
4
|
+
* @see
|
5
|
+
* {@link https://datatracker.ietf.org/doc/html/rfc6749#section-5.2 | RFC6749 - Issuing an Access Token }
|
6
|
+
*
|
7
|
+
* The provided authorization grant (e.g., authorization code, resource owner
|
8
|
+
* credentials) or refresh token is invalid, expired, revoked, does not match
|
9
|
+
* the redirection URI used in the authorization request, or was issued to
|
10
|
+
* another client.
|
11
|
+
*/
|
12
|
+
export class InvalidGrantError extends OAuthError {
|
13
|
+
constructor(error_description: string, cause?: unknown) {
|
14
|
+
super('invalid_grant', error_description, 400, cause)
|
15
|
+
}
|
16
|
+
}
|
@@ -0,0 +1,12 @@
|
|
1
|
+
import { OAuthAuthenticationRequestParameters } from '@atproto/oauth-types'
|
2
|
+
import { AccessDeniedError } from './access-denied-error.js'
|
3
|
+
|
4
|
+
export class InvalidParametersError extends AccessDeniedError {
|
5
|
+
constructor(
|
6
|
+
parameters: OAuthAuthenticationRequestParameters,
|
7
|
+
error_description: string,
|
8
|
+
cause?: unknown,
|
9
|
+
) {
|
10
|
+
super(parameters, error_description, 'invalid_request', cause)
|
11
|
+
}
|
12
|
+
}
|
@@ -0,0 +1,17 @@
|
|
1
|
+
import { OAuthError } from './oauth-error.js'
|
2
|
+
|
3
|
+
/**
|
4
|
+
* @see {@link https://datatracker.ietf.org/doc/html/rfc7591#section-3.2.2 | RFC7591}
|
5
|
+
*
|
6
|
+
* The value of one or more redirection URIs is invalid.
|
7
|
+
*/
|
8
|
+
export class InvalidRedirectUriError extends OAuthError {
|
9
|
+
constructor(error_description: string, cause?: unknown) {
|
10
|
+
super('invalid_redirect_uri', error_description, 400, cause)
|
11
|
+
}
|
12
|
+
|
13
|
+
static from(cause?: unknown): InvalidRedirectUriError {
|
14
|
+
if (cause instanceof InvalidRedirectUriError) return cause
|
15
|
+
return new InvalidRedirectUriError('Invalid redirect URI', cause)
|
16
|
+
}
|
17
|
+
}
|
@@ -0,0 +1,30 @@
|
|
1
|
+
import { OAuthError } from './oauth-error.js'
|
2
|
+
|
3
|
+
/**
|
4
|
+
* @see
|
5
|
+
* {@link https://datatracker.ietf.org/doc/html/rfc6749#section-5.2 | RFC6749 - Issuing an Access Token }
|
6
|
+
*
|
7
|
+
* The request is missing a required parameter, includes an unsupported
|
8
|
+
* parameter value (other than grant type), repeats a parameter, includes
|
9
|
+
* multiple credentials, utilizes more than one mechanism for authenticating the
|
10
|
+
* client, or is otherwise malformed.
|
11
|
+
*
|
12
|
+
* @see
|
13
|
+
* {@link https://datatracker.ietf.org/doc/html/rfc6749#section-4.1.2.1 | RFC6749 - Authorization Code Grant, Authorization Request}
|
14
|
+
*
|
15
|
+
* The request is missing a required parameter, includes an invalid parameter
|
16
|
+
* value, includes a parameter more than once, or is otherwise malformed.
|
17
|
+
*
|
18
|
+
* @see
|
19
|
+
* {@link https://datatracker.ietf.org/doc/html/rfc6750#section-3.1 | RFC6750 - The WWW-Authenticate Response Header Field }
|
20
|
+
*
|
21
|
+
* The request is missing a required parameter, includes an unsupported
|
22
|
+
* parameter or parameter value, repeats the same parameter, uses more than one
|
23
|
+
* method for including an access token, or is otherwise malformed. The resource
|
24
|
+
* server SHOULD respond with the HTTP 400 (Bad Request) status code.
|
25
|
+
*/
|
26
|
+
export class InvalidRequestError extends OAuthError {
|
27
|
+
constructor(error_description: string, cause?: unknown) {
|
28
|
+
super('invalid_request', error_description, 400, cause)
|
29
|
+
}
|
30
|
+
}
|
@@ -0,0 +1,59 @@
|
|
1
|
+
import { JwtVerifyError } from '@atproto/jwk'
|
2
|
+
import { JOSEError } from 'jose/errors'
|
3
|
+
import { ZodError } from 'zod'
|
4
|
+
|
5
|
+
import { OAuthError } from './oauth-error.js'
|
6
|
+
import { WWWAuthenticateError } from './www-authenticate-error.js'
|
7
|
+
|
8
|
+
/**
|
9
|
+
* @see
|
10
|
+
* {@link https://datatracker.ietf.org/doc/html/rfc6750#section-3.1 | RFC6750 - The WWW-Authenticate Response Header Field }
|
11
|
+
*
|
12
|
+
* The access token provided is expired, revoked, malformed, or invalid for
|
13
|
+
* other reasons. The resource SHOULD respond with the HTTP 401 (Unauthorized)
|
14
|
+
* status code. The client MAY request a new access token and retry the
|
15
|
+
* protected resource request.
|
16
|
+
*/
|
17
|
+
export class InvalidTokenError extends WWWAuthenticateError {
|
18
|
+
static from(
|
19
|
+
err: unknown,
|
20
|
+
tokenType: string,
|
21
|
+
fallbackMessage = 'Invalid token',
|
22
|
+
): InvalidTokenError {
|
23
|
+
if (err instanceof InvalidTokenError) {
|
24
|
+
return err
|
25
|
+
}
|
26
|
+
|
27
|
+
if (err instanceof OAuthError) {
|
28
|
+
return new InvalidTokenError(tokenType, err.error_description, err)
|
29
|
+
}
|
30
|
+
|
31
|
+
if (err instanceof JOSEError) {
|
32
|
+
return new InvalidTokenError(tokenType, err.message, err)
|
33
|
+
}
|
34
|
+
|
35
|
+
if (err instanceof JwtVerifyError) {
|
36
|
+
return new InvalidTokenError(tokenType, err.message, err)
|
37
|
+
}
|
38
|
+
|
39
|
+
if (err instanceof ZodError) {
|
40
|
+
return new InvalidTokenError(tokenType, err.message, err)
|
41
|
+
}
|
42
|
+
|
43
|
+
return new InvalidTokenError(tokenType, fallbackMessage, err)
|
44
|
+
}
|
45
|
+
|
46
|
+
constructor(
|
47
|
+
readonly tokenType: string,
|
48
|
+
error_description: string,
|
49
|
+
cause?: unknown,
|
50
|
+
) {
|
51
|
+
const error = 'invalid_token'
|
52
|
+
super(
|
53
|
+
error,
|
54
|
+
error_description,
|
55
|
+
{ [tokenType]: { error, error_description } },
|
56
|
+
cause,
|
57
|
+
)
|
58
|
+
}
|
59
|
+
}
|
@@ -0,0 +1,12 @@
|
|
1
|
+
import { OAuthAuthenticationRequestParameters } from '@atproto/oauth-types'
|
2
|
+
import { AccessDeniedError } from './access-denied-error.js'
|
3
|
+
|
4
|
+
export class LoginRequiredError extends AccessDeniedError {
|
5
|
+
constructor(
|
6
|
+
parameters: OAuthAuthenticationRequestParameters,
|
7
|
+
error_description = 'Login is required',
|
8
|
+
cause?: unknown,
|
9
|
+
) {
|
10
|
+
super(parameters, error_description, 'login_required', cause)
|
11
|
+
}
|
12
|
+
}
|
@@ -0,0 +1,28 @@
|
|
1
|
+
export class OAuthError extends Error {
|
2
|
+
public expose: boolean
|
3
|
+
|
4
|
+
constructor(
|
5
|
+
public readonly error: string,
|
6
|
+
public readonly error_description: string,
|
7
|
+
public readonly status = 400,
|
8
|
+
cause?: unknown,
|
9
|
+
) {
|
10
|
+
super(error_description, { cause })
|
11
|
+
|
12
|
+
Error.captureStackTrace?.(this, this.constructor)
|
13
|
+
|
14
|
+
this.name = this.constructor.name
|
15
|
+
this.expose = status < 500
|
16
|
+
}
|
17
|
+
|
18
|
+
get statusCode() {
|
19
|
+
return this.status
|
20
|
+
}
|
21
|
+
|
22
|
+
toJSON() {
|
23
|
+
return {
|
24
|
+
error: this.error,
|
25
|
+
error_description: this.error_description,
|
26
|
+
} as const
|
27
|
+
}
|
28
|
+
}
|
@@ -0,0 +1,20 @@
|
|
1
|
+
import { OAuthError } from './oauth-error.js'
|
2
|
+
|
3
|
+
/**
|
4
|
+
* @see
|
5
|
+
* {@link https://datatracker.ietf.org/doc/html/rfc6749#section-5.2 | RFC6749 - Issuing an Access Token }
|
6
|
+
*
|
7
|
+
* The authenticated client is not authorized to use this authorization grant
|
8
|
+
* type.
|
9
|
+
*
|
10
|
+
* @see
|
11
|
+
* {@link https://datatracker.ietf.org/doc/html/rfc6749#section-4.1.2.1 | RFC6749 - Authorization Code Grant, Authorization Request}
|
12
|
+
*
|
13
|
+
* The client is not authorized to request an authorization code using this
|
14
|
+
* method.
|
15
|
+
*/
|
16
|
+
export class UnauthorizedClientError extends OAuthError {
|
17
|
+
constructor(error_description: string, cause?: unknown) {
|
18
|
+
super('unauthorized_client', error_description, 400, cause)
|
19
|
+
}
|
20
|
+
}
|
@@ -0,0 +1,32 @@
|
|
1
|
+
import { OAuthError } from './oauth-error.js'
|
2
|
+
import { WWWAuthenticateError } from './www-authenticate-error.js'
|
3
|
+
|
4
|
+
/**
|
5
|
+
* @see
|
6
|
+
* {@link https://datatracker.ietf.org/doc/html/rfc9449#section-8 | RFC9449 - Section 8. Authorization Server-Provided Nonce}
|
7
|
+
*/
|
8
|
+
export class UseDpopNonceError extends OAuthError {
|
9
|
+
constructor(
|
10
|
+
error_description = 'Authorization server requires nonce in DPoP proof',
|
11
|
+
cause?: unknown,
|
12
|
+
) {
|
13
|
+
super('use_dpop_nonce', error_description, 400, cause)
|
14
|
+
}
|
15
|
+
|
16
|
+
/**
|
17
|
+
* Convert this error into an error meant to be used as "Resource
|
18
|
+
* Server-Provided Nonce" error.
|
19
|
+
*
|
20
|
+
* @see
|
21
|
+
* {@link https://datatracker.ietf.org/doc/html/rfc9449#section-9 | RFC9449 - Section 9. Resource Server-Provided Nonce}
|
22
|
+
*/
|
23
|
+
toWwwAuthenticateError(): WWWAuthenticateError {
|
24
|
+
const { error, error_description } = this
|
25
|
+
return new WWWAuthenticateError(
|
26
|
+
error,
|
27
|
+
error_description,
|
28
|
+
{ DPoP: { error, error_description } },
|
29
|
+
this,
|
30
|
+
)
|
31
|
+
}
|
32
|
+
}
|
@@ -0,0 +1,65 @@
|
|
1
|
+
import { VERIFY_ALGOS } from '../lib/util/crypto.js'
|
2
|
+
|
3
|
+
import { OAuthError } from './oauth-error.js'
|
4
|
+
|
5
|
+
export type WWWAuthenticateParams = Record<string, string | undefined>
|
6
|
+
export type WWWAuthenticate = Record<string, undefined | WWWAuthenticateParams>
|
7
|
+
|
8
|
+
export class WWWAuthenticateError extends OAuthError {
|
9
|
+
public readonly wwwAuthenticate: WWWAuthenticate
|
10
|
+
|
11
|
+
constructor(
|
12
|
+
error: string,
|
13
|
+
error_description: string,
|
14
|
+
wwwAuthenticate: WWWAuthenticate,
|
15
|
+
cause?: unknown,
|
16
|
+
) {
|
17
|
+
super(error, error_description, 401, cause)
|
18
|
+
|
19
|
+
this.wwwAuthenticate =
|
20
|
+
wwwAuthenticate['DPoP'] != null
|
21
|
+
? {
|
22
|
+
...wwwAuthenticate,
|
23
|
+
DPoP: { algs: VERIFY_ALGOS.join(' '), ...wwwAuthenticate['DPoP'] },
|
24
|
+
}
|
25
|
+
: wwwAuthenticate
|
26
|
+
}
|
27
|
+
|
28
|
+
get wwwAuthenticateHeader() {
|
29
|
+
return formatWWWAuthenticateHeader(this.wwwAuthenticate)
|
30
|
+
}
|
31
|
+
}
|
32
|
+
|
33
|
+
function formatWWWAuthenticateHeader(wwwAuthenticate: WWWAuthenticate): string {
|
34
|
+
return Object.entries(wwwAuthenticate)
|
35
|
+
.filter(isWWWAuthenticateEntry)
|
36
|
+
.map(wwwAuthenticateEntryToString)
|
37
|
+
.join(', ')
|
38
|
+
}
|
39
|
+
|
40
|
+
type WWWAuthenticateEntry = [type: string, params: WWWAuthenticateParams]
|
41
|
+
function isWWWAuthenticateEntry(
|
42
|
+
entry: [string, unknown],
|
43
|
+
): entry is WWWAuthenticateEntry {
|
44
|
+
const [, value] = entry
|
45
|
+
return value != null && typeof value === 'object'
|
46
|
+
}
|
47
|
+
|
48
|
+
function wwwAuthenticateEntryToString([type, params]: WWWAuthenticateEntry) {
|
49
|
+
const paramsEnc = Object.entries(params)
|
50
|
+
.filter(isParamEntry)
|
51
|
+
.map(paramEntryToString)
|
52
|
+
|
53
|
+
return paramsEnc.length ? `${type} ${paramsEnc.join(', ')}` : type
|
54
|
+
}
|
55
|
+
|
56
|
+
type ParamEntry = [name: string, value: string]
|
57
|
+
|
58
|
+
function isParamEntry(entry: [string, unknown]): entry is ParamEntry {
|
59
|
+
const [, value] = entry
|
60
|
+
return typeof value === 'string' && value !== '' && !value.includes('"')
|
61
|
+
}
|
62
|
+
|
63
|
+
function paramEntryToString([name, value]: ParamEntry): string {
|
64
|
+
return `${name}="${value}"`
|
65
|
+
}
|
package/src/index.ts
ADDED
@@ -0,0 +1,15 @@
|
|
1
|
+
// Avoid having to explicitly depend sub dependencies
|
2
|
+
export * from '@atproto-labs/fetch'
|
3
|
+
export * from '@atproto-labs/fetch-node'
|
4
|
+
export * from '@atproto/jwk'
|
5
|
+
export * from '@atproto/jwk-jose'
|
6
|
+
export * from '@atproto/oauth-types'
|
7
|
+
|
8
|
+
export * from './constants.js'
|
9
|
+
export * from './oauth-client.js'
|
10
|
+
export * from './oauth-dpop.js'
|
11
|
+
export * from './oauth-errors.js'
|
12
|
+
export * from './oauth-hooks.js'
|
13
|
+
export * from './oauth-provider.js'
|
14
|
+
export * from './oauth-store.js'
|
15
|
+
export * from './oauth-verifier.js'
|
@@ -0,0 +1,9 @@
|
|
1
|
+
# Safe HTML generation and concatenation utility
|
2
|
+
|
3
|
+
This library provides a safe way to generate and concatenate HTML strings.
|
4
|
+
|
5
|
+
This code _could_ be used as a standalone library, but the Bluesky dev team does
|
6
|
+
not want to maintain it as such. As it is currently only used by the
|
7
|
+
`@atproto/oauth-provider` package, it is included here. Future development
|
8
|
+
should aim to keep this library independent of the rest of the
|
9
|
+
`@atproto/oauth-provider` package, so that it can be extracted and published.
|
@@ -0,0 +1,98 @@
|
|
1
|
+
import { HtmlValue } from './escapers.js'
|
2
|
+
import { Html } from './html.js'
|
3
|
+
import { html } from './tags.js'
|
4
|
+
|
5
|
+
export type AssetRef = {
|
6
|
+
url: string
|
7
|
+
sha256: string
|
8
|
+
}
|
9
|
+
|
10
|
+
export type Attrs = Record<string, boolean | string | undefined>
|
11
|
+
export type LinkAttrs = { href: string } & Attrs
|
12
|
+
export type MetaAttrs =
|
13
|
+
| { name: string; content: string }
|
14
|
+
| { 'http-equiv': string; content: string }
|
15
|
+
|
16
|
+
const defaultViewport = html`<meta
|
17
|
+
name="viewport"
|
18
|
+
content="width=device-width, initial-scale=1.0"
|
19
|
+
/>`
|
20
|
+
|
21
|
+
export type BuildDocumentOptions = {
|
22
|
+
htmlAttrs?: Attrs
|
23
|
+
base?: URL
|
24
|
+
meta?: readonly MetaAttrs[]
|
25
|
+
links?: readonly LinkAttrs[]
|
26
|
+
head?: HtmlValue
|
27
|
+
title?: HtmlValue
|
28
|
+
scripts?: readonly (Html | AssetRef)[]
|
29
|
+
styles?: readonly (Html | AssetRef)[]
|
30
|
+
body: HtmlValue
|
31
|
+
bodyAttrs?: Attrs
|
32
|
+
}
|
33
|
+
|
34
|
+
export const buildDocument = ({
|
35
|
+
htmlAttrs,
|
36
|
+
head,
|
37
|
+
title,
|
38
|
+
body,
|
39
|
+
bodyAttrs,
|
40
|
+
base,
|
41
|
+
meta,
|
42
|
+
links,
|
43
|
+
scripts,
|
44
|
+
styles,
|
45
|
+
}: BuildDocumentOptions) => html`<!doctype html>
|
46
|
+
<html${attrsToHtml(htmlAttrs)}>
|
47
|
+
<head>
|
48
|
+
<meta charset="UTF-8" />
|
49
|
+
${title && html`<title>${title}</title>`}
|
50
|
+
${base && html`<base href="${base.href}" />`}
|
51
|
+
${meta?.some(isViewportMeta) ? null : defaultViewport}
|
52
|
+
${meta?.map(metaToHtml)}
|
53
|
+
${links?.map(linkToHtml)}
|
54
|
+
${head} ${styles?.map(styleToHtml)}
|
55
|
+
</head>
|
56
|
+
<body${attrsToHtml(bodyAttrs)}>
|
57
|
+
${body} ${scripts?.map(scriptToHtml)}
|
58
|
+
</body>
|
59
|
+
</html>`
|
60
|
+
|
61
|
+
function isViewportMeta<T extends MetaAttrs>(
|
62
|
+
attrs: T,
|
63
|
+
): attrs is T & { name: 'viewport' } {
|
64
|
+
return 'name' in attrs && attrs.name === 'viewport'
|
65
|
+
}
|
66
|
+
|
67
|
+
function* linkToHtml(attrs: LinkAttrs) {
|
68
|
+
yield html`<link${attrsToHtml(attrs)} />`
|
69
|
+
}
|
70
|
+
|
71
|
+
function* metaToHtml(attrs: MetaAttrs) {
|
72
|
+
yield html`<meta${attrsToHtml(attrs)} />`
|
73
|
+
}
|
74
|
+
|
75
|
+
function* attrsToHtml(attrs?: Attrs) {
|
76
|
+
if (attrs) {
|
77
|
+
for (const [name, value] of Object.entries(attrs)) {
|
78
|
+
if (value == null) continue
|
79
|
+
else if (value === false) continue
|
80
|
+
else if (value === true) yield html` ${name}`
|
81
|
+
else yield html` ${name}="${value}"`
|
82
|
+
}
|
83
|
+
}
|
84
|
+
}
|
85
|
+
|
86
|
+
function* scriptToHtml(script: Html | AssetRef) {
|
87
|
+
yield script instanceof Html
|
88
|
+
? // prettier-ignore
|
89
|
+
html`<script>${script}</script>` // hash validity requires no space around the content
|
90
|
+
: html`<script type="module" src="${script.url}?${script.sha256}"></script>`
|
91
|
+
}
|
92
|
+
|
93
|
+
function* styleToHtml(style: Html | AssetRef) {
|
94
|
+
yield style instanceof Html
|
95
|
+
? // prettier-ignore
|
96
|
+
html`<style>${style}</style>` // hash validity requires no space around the content
|
97
|
+
: html`<link rel="stylesheet" href="${style.url}?${style.sha256}" />`
|
98
|
+
}
|
@@ -0,0 +1,66 @@
|
|
1
|
+
import { Html } from './html.js'
|
2
|
+
import { NestedIterable, stringReplacer } from './util.js'
|
3
|
+
|
4
|
+
export function* javascriptEscaper(code: string) {
|
5
|
+
// "</script>" can only appear in javascript strings, so we can safely escape
|
6
|
+
// the "<" without breaking the javascript.
|
7
|
+
yield* stringReplacer(code, '</script>', '\\u003c/script>')
|
8
|
+
}
|
9
|
+
|
10
|
+
export function* jsonEscaper(value: unknown) {
|
11
|
+
// https://redux.js.org/usage/server-rendering#security-considerations
|
12
|
+
const json = JSON.stringify(value)
|
13
|
+
if (json === undefined) throw new TypeError('Cannot serialize to JSON')
|
14
|
+
// "<" can only appear in JSON strings, so we can safely escape it without
|
15
|
+
// breaking the JSON.
|
16
|
+
yield* stringReplacer(json, '<', '\\u003c')
|
17
|
+
}
|
18
|
+
|
19
|
+
export function* cssEscaper(css: string) {
|
20
|
+
yield* stringReplacer(css, '</style>', '\\u003c/style>')
|
21
|
+
}
|
22
|
+
|
23
|
+
export type HtmlVariable = Html | string | number | null | undefined
|
24
|
+
export type HtmlValue = NestedIterable<HtmlVariable>
|
25
|
+
|
26
|
+
export function* htmlEscaper(
|
27
|
+
htmlFragments: TemplateStringsArray,
|
28
|
+
values: readonly HtmlValue[],
|
29
|
+
): Generator<string | Html, void, undefined> {
|
30
|
+
for (let i = 0; i < htmlFragments.length; i++) {
|
31
|
+
yield htmlFragments[i]!
|
32
|
+
|
33
|
+
const value = values[i]
|
34
|
+
if (value != null) yield* htmlVariableToFragments(value)
|
35
|
+
}
|
36
|
+
}
|
37
|
+
|
38
|
+
function* htmlVariableToFragments(
|
39
|
+
value: HtmlValue,
|
40
|
+
): Generator<string | Html, void, undefined> {
|
41
|
+
if (value == null) {
|
42
|
+
return
|
43
|
+
} else if (typeof value === 'number') {
|
44
|
+
yield String(value)
|
45
|
+
} else if (typeof value === 'string') {
|
46
|
+
yield encode(value)
|
47
|
+
} else if (value instanceof Html) {
|
48
|
+
yield value
|
49
|
+
} else {
|
50
|
+
// Will throw if the value is not an iterable
|
51
|
+
for (const v of value) yield* htmlVariableToFragments(v)
|
52
|
+
}
|
53
|
+
}
|
54
|
+
|
55
|
+
const specialCharRegExp = /[<>"'&]/g
|
56
|
+
const specialCharMap = new Map([
|
57
|
+
['<', '<'],
|
58
|
+
['>', '>'],
|
59
|
+
['"', '"'],
|
60
|
+
["'", '''],
|
61
|
+
['&', '&'],
|
62
|
+
])
|
63
|
+
const specialCharMapGet = (c: string) => specialCharMap.get(c)!
|
64
|
+
function encode(value: string): string {
|
65
|
+
return value.replace(specialCharRegExp, specialCharMapGet)
|
66
|
+
}
|
@@ -0,0 +1,61 @@
|
|
1
|
+
import { isString } from './util'
|
2
|
+
|
3
|
+
const symbol = Symbol('Html.dangerouslyCreate')
|
4
|
+
|
5
|
+
/**
|
6
|
+
* This class represents trusted HTML that can be safely embedded in a web page,
|
7
|
+
* or used as fragments to build a larger HTML document.
|
8
|
+
*/
|
9
|
+
export class Html {
|
10
|
+
#fragments: Iterable<Html | string>
|
11
|
+
|
12
|
+
private constructor(fragments: Iterable<Html | string>, guard: symbol) {
|
13
|
+
if (guard !== symbol) {
|
14
|
+
// Force developers to use `Html.dangerouslyCreate` to create an Html
|
15
|
+
// instance, to make it clear that the content needs to be trusted.
|
16
|
+
throw new TypeError(
|
17
|
+
'Use Html.dangerouslyCreate() to create an Html instance',
|
18
|
+
)
|
19
|
+
}
|
20
|
+
|
21
|
+
this.#fragments = fragments
|
22
|
+
}
|
23
|
+
|
24
|
+
toString(): string {
|
25
|
+
// Lazily compute & join the fragments when they are used, to avoid
|
26
|
+
// unnecessary intermediate strings when concatenating multiple Html as
|
27
|
+
// fragments.
|
28
|
+
if (
|
29
|
+
!Array.isArray(this.#fragments) ||
|
30
|
+
this.#fragments.length > 1 ||
|
31
|
+
!this.#fragments.every(isString)
|
32
|
+
) {
|
33
|
+
// Will call `toString` recursively, as well as generating iterator
|
34
|
+
// results.
|
35
|
+
const fragment = Array.from(this.#fragments, String).join('')
|
36
|
+
this.#fragments = [fragment] // Cache result for future calls
|
37
|
+
return fragment
|
38
|
+
}
|
39
|
+
|
40
|
+
return this.#fragments.join('')
|
41
|
+
}
|
42
|
+
|
43
|
+
[Symbol.toPrimitive](hint): string {
|
44
|
+
switch (hint) {
|
45
|
+
case 'string':
|
46
|
+
case 'default':
|
47
|
+
return this.toString()
|
48
|
+
default:
|
49
|
+
throw new TypeError(`Cannot convert Html to a ${hint}`)
|
50
|
+
}
|
51
|
+
}
|
52
|
+
|
53
|
+
*[Symbol.iterator](): IterableIterator<string> {
|
54
|
+
// Using toString() here to use the optimized path for string concatenation
|
55
|
+
yield this.toString()
|
56
|
+
}
|
57
|
+
|
58
|
+
static dangerouslyCreate(fragments: Iterable<Html | string>): Html {
|
59
|
+
return new Html(fragments, symbol)
|
60
|
+
}
|
61
|
+
}
|