@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,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
|
+
}
|