@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,104 @@
|
|
1
|
+
import { useCallback, useMemo, useState } from 'react'
|
2
|
+
|
3
|
+
import { Account, AuthorizeData, Session } from '../backend-data'
|
4
|
+
import { Api } from '../lib/api'
|
5
|
+
import { upsert } from '../lib/util'
|
6
|
+
import { useCsrfToken } from './use-csrf-token'
|
7
|
+
|
8
|
+
export type SignInCredentials = {
|
9
|
+
username: string
|
10
|
+
password: string
|
11
|
+
remember?: boolean
|
12
|
+
}
|
13
|
+
|
14
|
+
export type SignUpData = {
|
15
|
+
username: string
|
16
|
+
password: string
|
17
|
+
extra?: Record<string, string>
|
18
|
+
}
|
19
|
+
|
20
|
+
export function useApi(
|
21
|
+
{
|
22
|
+
clientId,
|
23
|
+
requestUri,
|
24
|
+
csrfCookie,
|
25
|
+
sessions: initialSessions,
|
26
|
+
newSessionsRequireConsent,
|
27
|
+
}: AuthorizeData,
|
28
|
+
{
|
29
|
+
onRedirected,
|
30
|
+
}: {
|
31
|
+
onRedirected?: () => void
|
32
|
+
} = {},
|
33
|
+
) {
|
34
|
+
const csrfToken = useCsrfToken(csrfCookie) ?? '<csrf-token-missing>' // Invalid value
|
35
|
+
const [sessions, setSessions] = useState<readonly Session[]>(initialSessions)
|
36
|
+
|
37
|
+
const setSession = useCallback(
|
38
|
+
(sub: string | null) => {
|
39
|
+
setSessions((sessions) =>
|
40
|
+
sub === (sessions.find((s) => s.selected)?.account.sub || null)
|
41
|
+
? sessions
|
42
|
+
: sessions.map((s) => ({ ...s, selected: s.account.sub === sub })),
|
43
|
+
)
|
44
|
+
},
|
45
|
+
[setSessions],
|
46
|
+
)
|
47
|
+
|
48
|
+
const api = useMemo(
|
49
|
+
() => new Api(requestUri, clientId, csrfToken, newSessionsRequireConsent),
|
50
|
+
[requestUri, clientId, csrfToken, newSessionsRequireConsent],
|
51
|
+
)
|
52
|
+
|
53
|
+
const performRedirect = useCallback(
|
54
|
+
(url: URL) => {
|
55
|
+
window.location.href = String(url)
|
56
|
+
if (onRedirected) setTimeout(onRedirected)
|
57
|
+
},
|
58
|
+
[onRedirected],
|
59
|
+
)
|
60
|
+
|
61
|
+
const doSignIn = useCallback(
|
62
|
+
async (credentials: SignInCredentials): Promise<void> => {
|
63
|
+
const session = await api.signIn(credentials)
|
64
|
+
const { sub } = session.account
|
65
|
+
|
66
|
+
setSessions((sessions) => {
|
67
|
+
return upsert(sessions, session, (s) => s.account.sub === sub).map(
|
68
|
+
// Make sure to de-select any other selected session
|
69
|
+
(s) => (s === session || !s.selected ? s : { ...s, selected: false }),
|
70
|
+
)
|
71
|
+
})
|
72
|
+
},
|
73
|
+
[api, performRedirect, clientId, setSessions],
|
74
|
+
)
|
75
|
+
|
76
|
+
const doSignUp = useCallback(
|
77
|
+
(data: SignUpData) => {
|
78
|
+
//
|
79
|
+
throw new Error('Not implemented')
|
80
|
+
},
|
81
|
+
[api],
|
82
|
+
)
|
83
|
+
|
84
|
+
const doAccept = useCallback(
|
85
|
+
async (account: Account) => {
|
86
|
+
performRedirect(await api.accept(account))
|
87
|
+
},
|
88
|
+
[api, performRedirect],
|
89
|
+
)
|
90
|
+
|
91
|
+
const doReject = useCallback(async () => {
|
92
|
+
performRedirect(await api.reject())
|
93
|
+
}, [api, performRedirect])
|
94
|
+
|
95
|
+
return {
|
96
|
+
sessions,
|
97
|
+
setSession,
|
98
|
+
|
99
|
+
doSignIn,
|
100
|
+
doSignUp,
|
101
|
+
doAccept,
|
102
|
+
doReject,
|
103
|
+
}
|
104
|
+
}
|
@@ -0,0 +1,64 @@
|
|
1
|
+
import { fetchJsonProcessor, fetchOkProcessor } from '@atproto-labs/fetch'
|
2
|
+
|
3
|
+
import { Account, Session } from '../backend-data'
|
4
|
+
|
5
|
+
export class Api {
|
6
|
+
constructor(
|
7
|
+
private requestUri: string,
|
8
|
+
private clientId: string,
|
9
|
+
private csrfToken: string,
|
10
|
+
private newSessionsRequireConsent: boolean,
|
11
|
+
) {}
|
12
|
+
|
13
|
+
async signIn(credentials: {
|
14
|
+
username: string
|
15
|
+
password: string
|
16
|
+
remember?: boolean
|
17
|
+
}): Promise<Session> {
|
18
|
+
const { json } = await fetch('/oauth/authorize/sign-in', {
|
19
|
+
method: 'POST',
|
20
|
+
headers: { 'Content-Type': 'application/json' },
|
21
|
+
mode: 'same-origin',
|
22
|
+
body: JSON.stringify({
|
23
|
+
csrf_token: this.csrfToken,
|
24
|
+
request_uri: this.requestUri,
|
25
|
+
client_id: this.clientId,
|
26
|
+
credentials,
|
27
|
+
}),
|
28
|
+
})
|
29
|
+
.then(fetchOkProcessor())
|
30
|
+
.then(
|
31
|
+
fetchJsonProcessor<{
|
32
|
+
account: Account
|
33
|
+
consentRequired: boolean
|
34
|
+
}>(),
|
35
|
+
)
|
36
|
+
|
37
|
+
return {
|
38
|
+
account: json.account,
|
39
|
+
|
40
|
+
selected: true,
|
41
|
+
loginRequired: false,
|
42
|
+
consentRequired: this.newSessionsRequireConsent || json.consentRequired,
|
43
|
+
}
|
44
|
+
}
|
45
|
+
|
46
|
+
async accept(account: Account): Promise<URL> {
|
47
|
+
const url = new URL('/oauth/authorize/accept', window.origin)
|
48
|
+
url.searchParams.set('request_uri', this.requestUri)
|
49
|
+
url.searchParams.set('account_sub', account.sub)
|
50
|
+
url.searchParams.set('client_id', this.clientId)
|
51
|
+
url.searchParams.set('csrf_token', this.csrfToken)
|
52
|
+
|
53
|
+
return url
|
54
|
+
}
|
55
|
+
|
56
|
+
async reject(): Promise<URL> {
|
57
|
+
const url = new URL('/oauth/authorize/reject', window.origin)
|
58
|
+
url.searchParams.set('request_uri', this.requestUri)
|
59
|
+
url.searchParams.set('client_id', this.clientId)
|
60
|
+
url.searchParams.set('csrf_token', this.csrfToken)
|
61
|
+
|
62
|
+
return url
|
63
|
+
}
|
64
|
+
}
|
@@ -0,0 +1,10 @@
|
|
1
|
+
export function upsert<T>(
|
2
|
+
arr: readonly T[],
|
3
|
+
item: T,
|
4
|
+
predicate: (value: T, index: number, obj: readonly T[]) => boolean,
|
5
|
+
): T[] {
|
6
|
+
const idx = arr.findIndex(predicate)
|
7
|
+
return idx === -1
|
8
|
+
? [...arr, item]
|
9
|
+
: [...arr.slice(0, idx), item, ...arr.slice(idx + 1)]
|
10
|
+
}
|
@@ -0,0 +1,28 @@
|
|
1
|
+
// This must be loaded before any dependency to ensure that global variables
|
2
|
+
// cannot be accessed by JS from node_modules.
|
3
|
+
import * as backendData from './backend-data'
|
4
|
+
|
5
|
+
import { createRoot } from 'react-dom/client'
|
6
|
+
|
7
|
+
import { App } from './app'
|
8
|
+
import './main.css'
|
9
|
+
|
10
|
+
const { authorizeData } = backendData
|
11
|
+
if (authorizeData) {
|
12
|
+
// When the user is logging in, make sure the page URL contains the
|
13
|
+
// "request_uri" in case the user refreshes the page.
|
14
|
+
const url = new URL(window.location.href)
|
15
|
+
if (
|
16
|
+
url.pathname === '/oauth/authorize' &&
|
17
|
+
!url.searchParams.has('request_uri')
|
18
|
+
) {
|
19
|
+
url.search = ''
|
20
|
+
url.searchParams.set('client_id', authorizeData.clientId)
|
21
|
+
url.searchParams.set('request_uri', authorizeData.requestUri)
|
22
|
+
window.history.replaceState(history.state, '', url.pathname + url.search)
|
23
|
+
}
|
24
|
+
}
|
25
|
+
|
26
|
+
const container = document.getElementById('root')!
|
27
|
+
const root = createRoot(container)
|
28
|
+
root.render(<App {...backendData} />)
|
@@ -0,0 +1,51 @@
|
|
1
|
+
import { OAuthClientMetadata } from '@atproto/oauth-types'
|
2
|
+
|
3
|
+
import { Session } from '../backend-data'
|
4
|
+
import { AcceptForm } from '../components/accept-form'
|
5
|
+
import { LayoutTitlePage } from '../components/layout-title-page'
|
6
|
+
|
7
|
+
export type AcceptViewProps = {
|
8
|
+
clientId: string
|
9
|
+
clientMetadata: OAuthClientMetadata
|
10
|
+
clientTrusted: boolean
|
11
|
+
session: Session
|
12
|
+
|
13
|
+
onAccept: () => void
|
14
|
+
onReject: () => void
|
15
|
+
onBack?: () => void
|
16
|
+
}
|
17
|
+
|
18
|
+
export function AcceptView({
|
19
|
+
clientId,
|
20
|
+
clientMetadata,
|
21
|
+
clientTrusted,
|
22
|
+
session,
|
23
|
+
onAccept,
|
24
|
+
onReject,
|
25
|
+
onBack,
|
26
|
+
}: AcceptViewProps) {
|
27
|
+
const { account } = session
|
28
|
+
return (
|
29
|
+
<LayoutTitlePage
|
30
|
+
title="Authorize"
|
31
|
+
subtitle={
|
32
|
+
<>
|
33
|
+
Grant access to your{' '}
|
34
|
+
<b>{account.preferred_username || account.email || account.sub}</b>{' '}
|
35
|
+
account.
|
36
|
+
</>
|
37
|
+
}
|
38
|
+
>
|
39
|
+
<AcceptForm
|
40
|
+
className="max-w-lg w-full"
|
41
|
+
clientId={clientId}
|
42
|
+
clientMetadata={clientMetadata}
|
43
|
+
clientTrusted={clientTrusted}
|
44
|
+
account={account}
|
45
|
+
onBack={onBack}
|
46
|
+
onAccept={onAccept}
|
47
|
+
onReject={onReject}
|
48
|
+
/>
|
49
|
+
</LayoutTitlePage>
|
50
|
+
)
|
51
|
+
}
|
@@ -0,0 +1,101 @@
|
|
1
|
+
import { useEffect, useState } from 'react'
|
2
|
+
|
3
|
+
import type { AuthorizeData, CustomizationData } from '../backend-data'
|
4
|
+
import { LayoutTitlePage } from '../components/layout-title-page'
|
5
|
+
import { useApi } from '../hooks/use-api'
|
6
|
+
import { useBoundDispatch } from '../hooks/use-bound-dispatch'
|
7
|
+
import { AcceptView } from './accept-view'
|
8
|
+
import { SignInView } from './sign-in-view'
|
9
|
+
import { SignUpView } from './sign-up-view'
|
10
|
+
import { WelcomeView } from './welcome-view'
|
11
|
+
|
12
|
+
export type AuthorizeViewProps = {
|
13
|
+
authorizeData: AuthorizeData
|
14
|
+
customizationData?: CustomizationData
|
15
|
+
}
|
16
|
+
|
17
|
+
export function AuthorizeView({
|
18
|
+
authorizeData,
|
19
|
+
customizationData,
|
20
|
+
}: AuthorizeViewProps) {
|
21
|
+
const forceSignIn = authorizeData?.loginHint != null
|
22
|
+
|
23
|
+
const [view, setView] = useState<
|
24
|
+
'welcome' | 'sign-in' | 'sign-up' | 'accept' | 'done'
|
25
|
+
>(forceSignIn ? 'sign-in' : 'welcome')
|
26
|
+
|
27
|
+
const showDone = useBoundDispatch(setView, 'done')
|
28
|
+
const showSignIn = useBoundDispatch(setView, 'sign-in')
|
29
|
+
// const showSignUp = useBoundDispatch(setView, 'sign-up')
|
30
|
+
const showAccept = useBoundDispatch(setView, 'accept')
|
31
|
+
const showWelcome = useBoundDispatch(setView, 'welcome')
|
32
|
+
|
33
|
+
const { sessions, setSession, doAccept, doReject, doSignIn, doSignUp } =
|
34
|
+
useApi(authorizeData, { onRedirected: showDone })
|
35
|
+
|
36
|
+
const session = sessions.find((s) => s.selected && !s.loginRequired)
|
37
|
+
useEffect(() => {
|
38
|
+
if (session) {
|
39
|
+
if (session.consentRequired) showAccept()
|
40
|
+
else doAccept(session.account)
|
41
|
+
}
|
42
|
+
}, [session, doAccept, showAccept])
|
43
|
+
|
44
|
+
if (view === 'welcome') {
|
45
|
+
return (
|
46
|
+
<WelcomeView
|
47
|
+
name={customizationData?.name}
|
48
|
+
logo={customizationData?.logo}
|
49
|
+
links={customizationData?.links}
|
50
|
+
onSignIn={showSignIn}
|
51
|
+
// onSignUp={showSignUp}
|
52
|
+
onCancel={doReject}
|
53
|
+
/>
|
54
|
+
)
|
55
|
+
}
|
56
|
+
|
57
|
+
if (view === 'sign-up') {
|
58
|
+
return (
|
59
|
+
<SignUpView
|
60
|
+
links={customizationData?.links}
|
61
|
+
onSignUp={doSignUp}
|
62
|
+
onBack={showWelcome}
|
63
|
+
/>
|
64
|
+
)
|
65
|
+
}
|
66
|
+
|
67
|
+
if (view === 'sign-in') {
|
68
|
+
return (
|
69
|
+
<SignInView
|
70
|
+
loginHint={authorizeData.loginHint}
|
71
|
+
sessions={sessions}
|
72
|
+
setSession={setSession}
|
73
|
+
onSignIn={doSignIn}
|
74
|
+
onBack={forceSignIn ? doReject : showWelcome}
|
75
|
+
/>
|
76
|
+
)
|
77
|
+
}
|
78
|
+
|
79
|
+
if (view === 'accept' && session) {
|
80
|
+
return (
|
81
|
+
<AcceptView
|
82
|
+
session={session}
|
83
|
+
clientId={authorizeData.clientId}
|
84
|
+
clientMetadata={authorizeData.clientMetadata}
|
85
|
+
clientTrusted={authorizeData.clientTrusted}
|
86
|
+
onAccept={() => doAccept(session.account)}
|
87
|
+
onReject={doReject}
|
88
|
+
onBack={() => {
|
89
|
+
setSession(null)
|
90
|
+
setView(sessions.length ? 'sign-in' : 'welcome')
|
91
|
+
}}
|
92
|
+
/>
|
93
|
+
)
|
94
|
+
}
|
95
|
+
|
96
|
+
return (
|
97
|
+
<LayoutTitlePage title="Login complete">
|
98
|
+
You are being redirected...
|
99
|
+
</LayoutTitlePage>
|
100
|
+
)
|
101
|
+
}
|
@@ -0,0 +1,27 @@
|
|
1
|
+
import { CustomizationData, ErrorData } from '../backend-data'
|
2
|
+
import { ErrorCard } from '../components/error-card'
|
3
|
+
import { LayoutWelcome } from '../components/layout-welcome'
|
4
|
+
|
5
|
+
export type ErrorViewProps = {
|
6
|
+
customizationData?: CustomizationData
|
7
|
+
errorData?: ErrorData
|
8
|
+
}
|
9
|
+
|
10
|
+
export function ErrorView({ errorData, customizationData }: ErrorViewProps) {
|
11
|
+
return (
|
12
|
+
<LayoutWelcome {...customizationData}>
|
13
|
+
<ErrorCard message={getUserFriendlyMessage(errorData)} />
|
14
|
+
</LayoutWelcome>
|
15
|
+
)
|
16
|
+
}
|
17
|
+
|
18
|
+
function getUserFriendlyMessage(errorData?: ErrorData) {
|
19
|
+
const desc = errorData?.error_description
|
20
|
+
switch (desc) {
|
21
|
+
case 'Unknown request_uri': // Request was removed from database
|
22
|
+
case 'This request has expired':
|
23
|
+
return 'This sign-in session has expired'
|
24
|
+
default:
|
25
|
+
return desc || 'An unknown error occurred'
|
26
|
+
}
|
27
|
+
}
|
@@ -0,0 +1,121 @@
|
|
1
|
+
import { useCallback, useEffect, useMemo, useState } from 'react'
|
2
|
+
|
3
|
+
import { Session } from '../backend-data'
|
4
|
+
import { AccountPicker } from '../components/account-picker'
|
5
|
+
import { LayoutTitlePage } from '../components/layout-title-page'
|
6
|
+
import { SignInForm, SignInFormOutput } from '../components/sign-in-form'
|
7
|
+
|
8
|
+
export type SignInViewProps = {
|
9
|
+
sessions: readonly Session[]
|
10
|
+
setSession: (sub: string | null) => void
|
11
|
+
loginHint?: string
|
12
|
+
|
13
|
+
onSignIn: (credentials: SignInFormOutput) => void | PromiseLike<void>
|
14
|
+
onBack?: () => void
|
15
|
+
}
|
16
|
+
|
17
|
+
export function SignInView({
|
18
|
+
loginHint,
|
19
|
+
sessions,
|
20
|
+
setSession,
|
21
|
+
|
22
|
+
onSignIn,
|
23
|
+
onBack,
|
24
|
+
}: SignInViewProps) {
|
25
|
+
const session = useMemo(() => sessions.find((s) => s.selected), [sessions])
|
26
|
+
const clearSession = useCallback(() => setSession(null), [setSession])
|
27
|
+
const accounts = useMemo(() => sessions.map((s) => s.account), [sessions])
|
28
|
+
const [showSignInForm, setShowSignInForm] = useState(sessions.length === 0)
|
29
|
+
|
30
|
+
useEffect(() => {
|
31
|
+
// Make sure the "back" action shows the account picker instead of the
|
32
|
+
// sign-in form (since the account was added to the list of current
|
33
|
+
// sessions).
|
34
|
+
if (session) setShowSignInForm(false)
|
35
|
+
}, [session])
|
36
|
+
|
37
|
+
if (session) {
|
38
|
+
// All set (parent view will handle the redirect)
|
39
|
+
if (!session.loginRequired) return null
|
40
|
+
|
41
|
+
return (
|
42
|
+
<LayoutTitlePage
|
43
|
+
title="Sign in"
|
44
|
+
subtitle="Confirm your password to continue"
|
45
|
+
>
|
46
|
+
<SignInForm
|
47
|
+
className="max-w-lg w-full"
|
48
|
+
onSubmit={onSignIn}
|
49
|
+
onCancel={clearSession}
|
50
|
+
cancelAria="Back" // to account picker
|
51
|
+
usernameDefault={session.account.preferred_username}
|
52
|
+
usernameReadonly={true}
|
53
|
+
rememberDefault={true}
|
54
|
+
/>
|
55
|
+
</LayoutTitlePage>
|
56
|
+
)
|
57
|
+
}
|
58
|
+
|
59
|
+
if (loginHint) {
|
60
|
+
return (
|
61
|
+
<LayoutTitlePage title="Sign in" subtitle="Enter your password">
|
62
|
+
<SignInForm
|
63
|
+
className="max-w-lg w-full"
|
64
|
+
onSubmit={onSignIn}
|
65
|
+
onCancel={onBack}
|
66
|
+
cancelAria="Back"
|
67
|
+
usernameDefault={loginHint}
|
68
|
+
usernameReadonly={true}
|
69
|
+
/>
|
70
|
+
</LayoutTitlePage>
|
71
|
+
)
|
72
|
+
}
|
73
|
+
|
74
|
+
if (sessions.length === 0) {
|
75
|
+
return (
|
76
|
+
<LayoutTitlePage
|
77
|
+
title="Sign in"
|
78
|
+
subtitle="Enter your username and password"
|
79
|
+
>
|
80
|
+
<SignInForm
|
81
|
+
className="max-w-lg w-full"
|
82
|
+
onSubmit={onSignIn}
|
83
|
+
onCancel={onBack}
|
84
|
+
cancelAria="Back"
|
85
|
+
/>
|
86
|
+
</LayoutTitlePage>
|
87
|
+
)
|
88
|
+
}
|
89
|
+
|
90
|
+
if (showSignInForm) {
|
91
|
+
return (
|
92
|
+
<LayoutTitlePage
|
93
|
+
title="Sign in"
|
94
|
+
subtitle="Enter your username and password"
|
95
|
+
>
|
96
|
+
<SignInForm
|
97
|
+
className="max-w-lg w-full"
|
98
|
+
onSubmit={onSignIn}
|
99
|
+
onCancel={() => setShowSignInForm(false)}
|
100
|
+
cancelAria="Back" // to account picker
|
101
|
+
/>
|
102
|
+
</LayoutTitlePage>
|
103
|
+
)
|
104
|
+
}
|
105
|
+
|
106
|
+
return (
|
107
|
+
<LayoutTitlePage
|
108
|
+
title="Sign in as..."
|
109
|
+
subtitle="Select an account to continue."
|
110
|
+
>
|
111
|
+
<AccountPicker
|
112
|
+
className="max-w-lg w-full"
|
113
|
+
accounts={accounts}
|
114
|
+
onAccount={(a) => setSession(a.sub)}
|
115
|
+
onOther={() => setShowSignInForm(true)}
|
116
|
+
onBack={onBack}
|
117
|
+
backAria="Back" // to previous view
|
118
|
+
/>
|
119
|
+
</LayoutTitlePage>
|
120
|
+
)
|
121
|
+
}
|
@@ -0,0 +1,93 @@
|
|
1
|
+
import { ReactNode, useCallback, useState } from 'react'
|
2
|
+
|
3
|
+
import { LinkDefinition } from '../backend-data'
|
4
|
+
import { HelpCard } from '../components/help-card'
|
5
|
+
import { LayoutTitlePage } from '../components/layout-title-page'
|
6
|
+
import {
|
7
|
+
SignUpAccountForm,
|
8
|
+
SignUpAccountFormOutput,
|
9
|
+
} from '../components/sign-up-account-form'
|
10
|
+
import { SignUpDisclaimer } from '../components/sign-up-disclaimer'
|
11
|
+
|
12
|
+
export type SignUpViewProps = {
|
13
|
+
stepName?: (step: number, total: number) => ReactNode
|
14
|
+
stepTitle?: (step: number, total: number) => ReactNode
|
15
|
+
|
16
|
+
links?: LinkDefinition[]
|
17
|
+
onSignUp: (data: {
|
18
|
+
username: string
|
19
|
+
password: string
|
20
|
+
extra?: Record<string, string>
|
21
|
+
}) => void | PromiseLike<void>
|
22
|
+
onBack?: () => void
|
23
|
+
}
|
24
|
+
|
25
|
+
export function SignUpView({
|
26
|
+
stepName = (step, total) => `Step ${step} of ${total}`,
|
27
|
+
stepTitle = (step, total) => {
|
28
|
+
switch (step) {
|
29
|
+
case 1:
|
30
|
+
return 'Your account'
|
31
|
+
default:
|
32
|
+
return null
|
33
|
+
}
|
34
|
+
},
|
35
|
+
|
36
|
+
links,
|
37
|
+
|
38
|
+
onSignUp,
|
39
|
+
onBack,
|
40
|
+
}: SignUpViewProps) {
|
41
|
+
const [_credentials, setCredentials] =
|
42
|
+
useState<null | SignUpAccountFormOutput>(null)
|
43
|
+
const [step, setStep] = useState<1 | 2>(1)
|
44
|
+
|
45
|
+
const stepCount = 2
|
46
|
+
|
47
|
+
const doSubmitAccount = useCallback(
|
48
|
+
(credentials: SignUpAccountFormOutput) => {
|
49
|
+
setCredentials(credentials)
|
50
|
+
setStep(2)
|
51
|
+
},
|
52
|
+
[onSignUp, setCredentials, setStep],
|
53
|
+
)
|
54
|
+
|
55
|
+
return (
|
56
|
+
<LayoutTitlePage
|
57
|
+
title="Create Account"
|
58
|
+
subtitle="We're so excited to have you join us!"
|
59
|
+
>
|
60
|
+
<div className="max-w-lg w-full flex flex-col">
|
61
|
+
<p className="mt-4 text-slate-400 dark:text-slate-600">
|
62
|
+
{stepName(step, stepCount)}
|
63
|
+
</p>
|
64
|
+
<h2 className="font-medium text-xl mb-4">
|
65
|
+
{stepTitle(step, stepCount)}
|
66
|
+
</h2>
|
67
|
+
|
68
|
+
{step === 1 && (
|
69
|
+
<SignUpAccountForm
|
70
|
+
className="flex-grow"
|
71
|
+
onSubmit={doSubmitAccount}
|
72
|
+
onCancel={onBack}
|
73
|
+
cancelLabel="Back"
|
74
|
+
>
|
75
|
+
<SignUpDisclaimer links={links} />
|
76
|
+
</SignUpAccountForm>
|
77
|
+
)}
|
78
|
+
|
79
|
+
{step === 2 && (
|
80
|
+
<button
|
81
|
+
type="button"
|
82
|
+
className="inline-flex items-center px-4 py-2 border border-transparent text-sm font-medium rounded-md text-slate-700 bg-slate-100 hover:bg-slate-200 focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-slate-500"
|
83
|
+
onClick={() => setStep(1)}
|
84
|
+
>
|
85
|
+
Back
|
86
|
+
</button>
|
87
|
+
)}
|
88
|
+
|
89
|
+
<HelpCard className="mb-4" links={links} />
|
90
|
+
</div>
|
91
|
+
</LayoutTitlePage>
|
92
|
+
)
|
93
|
+
}
|
@@ -0,0 +1,61 @@
|
|
1
|
+
import { LayoutWelcome, LayoutWelcomeProps } from '../components/layout-welcome'
|
2
|
+
import { clsx } from '../lib/clsx'
|
3
|
+
|
4
|
+
export type WelcomeViewParams = LayoutWelcomeProps & {
|
5
|
+
onSignIn?: () => void
|
6
|
+
signInLabel?: string
|
7
|
+
|
8
|
+
onSignUp?: () => void
|
9
|
+
signUpLabel?: string
|
10
|
+
|
11
|
+
onCancel?: () => void
|
12
|
+
cancelLabel?: string
|
13
|
+
}
|
14
|
+
|
15
|
+
export function WelcomeView({
|
16
|
+
onSignUp,
|
17
|
+
signUpLabel = 'Create a new account',
|
18
|
+
onSignIn,
|
19
|
+
signInLabel = 'Sign in',
|
20
|
+
onCancel,
|
21
|
+
cancelLabel = 'Cancel',
|
22
|
+
|
23
|
+
...props
|
24
|
+
}: WelcomeViewParams) {
|
25
|
+
return (
|
26
|
+
<LayoutWelcome {...props}>
|
27
|
+
{onSignUp && (
|
28
|
+
<button
|
29
|
+
className={clsx(
|
30
|
+
'm-1 w-60 max-w-full text-white py-2 px-4 rounded-full truncate',
|
31
|
+
onSignIn ? 'bg-primary' : 'bg-slate-400',
|
32
|
+
)}
|
33
|
+
onClick={onSignUp}
|
34
|
+
>
|
35
|
+
{signUpLabel}
|
36
|
+
</button>
|
37
|
+
)}
|
38
|
+
|
39
|
+
{onSignIn && (
|
40
|
+
<button
|
41
|
+
className={clsx(
|
42
|
+
'm-1 w-60 max-w-full py-2 px-4 rounded-full truncate',
|
43
|
+
onSignUp ? 'bg-slate-100 dark:bg-slate-700' : 'bg-primary',
|
44
|
+
)}
|
45
|
+
onClick={onSignIn}
|
46
|
+
>
|
47
|
+
{signInLabel}
|
48
|
+
</button>
|
49
|
+
)}
|
50
|
+
|
51
|
+
{onCancel && (
|
52
|
+
<button
|
53
|
+
className="m-1 w-60 max-w-full bg-transparent text-primary py-2 px-4 rounded-full truncate font-light"
|
54
|
+
onClick={onCancel}
|
55
|
+
>
|
56
|
+
{cancelLabel}
|
57
|
+
</button>
|
58
|
+
)}
|
59
|
+
</LayoutWelcome>
|
60
|
+
)
|
61
|
+
}
|