@ackplus/nest-auth 0.1.51 → 1.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +6 -513
- package/eslint.config.mjs +59 -0
- package/jest.config.ts +10 -0
- package/package.json +14 -44
- package/project.json +86 -0
- package/src/index.ts +30 -0
- package/src/lib/admin-console/admin-console.module.ts +62 -0
- package/src/lib/admin-console/controllers/admin-auth.controller.ts +339 -0
- package/src/lib/admin-console/controllers/admin-console.controller.ts +82 -0
- package/src/lib/admin-console/controllers/admin-permissions.controller.ts +180 -0
- package/src/lib/admin-console/controllers/admin-roles.controller.ts +89 -0
- package/src/lib/admin-console/controllers/admin-tenants.controller.ts +68 -0
- package/src/lib/admin-console/controllers/admin-users.controller.ts +379 -0
- package/src/lib/admin-console/decorators/current-admin.decorator.ts +9 -0
- package/src/lib/admin-console/dto/admin-permission.dto.ts +106 -0
- package/src/lib/admin-console/dto/admin-role.dto.ts +45 -0
- package/src/lib/admin-console/dto/admin-tenant.dto.ts +43 -0
- package/src/lib/admin-console/dto/admin-user.dto.ts +87 -0
- package/src/lib/admin-console/dto/create-dashboard-admin.dto.ts +34 -0
- package/src/lib/admin-console/dto/login.dto.ts +10 -0
- package/src/lib/admin-console/dto/reset-password.dto.ts +21 -0
- package/src/lib/admin-console/dto/setup-admin.dto.ts +23 -0
- package/src/lib/admin-console/dto/signup.dto.ts +51 -0
- package/src/lib/admin-console/entities/admin-user.entity.ts +74 -0
- package/src/lib/admin-console/guards/admin-session.guard.ts +47 -0
- package/src/lib/admin-console/services/admin-auth.service.ts +82 -0
- package/src/lib/admin-console/services/admin-console-config.service.ts +62 -0
- package/src/lib/admin-console/services/admin-session.service.ts +106 -0
- package/src/lib/admin-console/services/admin-user.service.ts +96 -0
- package/src/lib/admin-console/static/index.html +771 -0
- package/src/lib/auth/auth.module.ts +58 -0
- package/src/lib/auth/controllers/auth.controller.ts +393 -0
- package/src/lib/auth/controllers/mfa.controller.ts +200 -0
- package/src/lib/auth/dto/credentials/email-credentials.dto.ts +24 -0
- package/src/lib/auth/dto/credentials/phone-credentials.dto.ts +24 -0
- package/src/lib/auth/dto/credentials/social-credentials.dto.ts +15 -0
- package/src/lib/auth/dto/index.ts +1 -0
- package/src/lib/auth/dto/requests/change-password.request.dto.ts +34 -0
- package/src/lib/auth/dto/requests/forgot-password.request.dto.ts +30 -0
- package/src/lib/auth/dto/requests/initialize-admin.request.dto.ts +51 -0
- package/src/lib/auth/dto/requests/login.request.dto.ts +65 -0
- package/src/lib/auth/dto/requests/refresh-token.request.dto.ts +12 -0
- package/src/lib/auth/dto/requests/reset-password-with-token.request.dto.ts +22 -0
- package/src/lib/auth/dto/requests/reset-password.request.dto.ts +50 -0
- package/src/lib/auth/dto/requests/send-email-verification.request.dto.ts +12 -0
- package/src/lib/auth/dto/requests/send-mfa-code.request.dto.ts +19 -0
- package/src/lib/auth/dto/requests/signup.request.dto.ts +42 -0
- package/src/lib/auth/dto/requests/toggle-mfa.request.dto.ts +12 -0
- package/src/lib/auth/dto/requests/verify-2fa.request.dto.ts +24 -0
- package/src/lib/auth/dto/requests/verify-email.request.dto.ts +22 -0
- package/src/lib/auth/dto/requests/verify-forgot-password-otp-request-dto.ts +41 -0
- package/src/lib/auth/dto/requests/verify-totp-setup.request.dto.ts +22 -0
- package/src/lib/auth/dto/responses/auth-cookie.response.dto.ts +58 -0
- package/src/lib/auth/dto/responses/auth-success.response.dto.ts +58 -0
- package/src/lib/auth/dto/responses/auth.response.dto.ts +99 -0
- package/src/lib/auth/dto/responses/client-config.response.dto.ts +153 -0
- package/src/lib/auth/dto/responses/initialize-admin.response.dto.ts +22 -0
- package/src/lib/auth/dto/responses/mfa-code-response.dto.ts +27 -0
- package/src/lib/auth/dto/responses/mfa-status.response.dto.ts +89 -0
- package/src/lib/auth/dto/responses/verify-otp.response.dto.ts +9 -0
- package/src/lib/auth/entities/mfa-secret.entity.ts +33 -0
- package/src/lib/auth/entities/otp.entity.ts +33 -0
- package/src/lib/auth/events/{logged-out-all.event.d.ts → logged-out-all.event.ts} +6 -3
- package/src/lib/auth/events/{logged-out.event.d.ts → logged-out.event.ts} +5 -3
- package/src/lib/auth/events/{password-reset-requested.event.d.ts → password-reset-requested.event.ts} +6 -3
- package/src/lib/auth/events/{password-reset.event.d.ts → password-reset.event.ts} +6 -3
- package/src/lib/auth/events/{user-2fa-verified.event.d.ts → user-2fa-verified.event.ts} +6 -3
- package/src/lib/auth/events/{user-logged-in.event.d.ts → user-logged-in.event.ts} +7 -3
- package/src/lib/auth/events/{user-refresh-token.event.d.ts → user-refresh-token.event.ts} +6 -3
- package/src/lib/auth/events/{user-registered.event.d.ts → user-registered.event.ts} +7 -3
- package/src/lib/auth/guards/auth.guard.ts +386 -0
- package/src/lib/auth/{index.d.ts → index.ts} +28 -1
- package/src/lib/auth/interceptors/refresh-token.interceptor.ts +117 -0
- package/src/lib/auth/services/auth.service.ts +947 -0
- package/src/lib/auth/services/client-config.service.ts +157 -0
- package/src/lib/auth/services/cookie.service.ts +43 -0
- package/src/lib/auth/services/mfa.service.ts +391 -0
- package/src/lib/auth.constants.ts +63 -0
- package/src/lib/core/core.module.ts +50 -0
- package/src/lib/core/decorators/auth.decorator.ts +38 -0
- package/src/lib/core/decorators/permissions.decorator.ts +17 -0
- package/src/lib/core/decorators/public.decorator.ts +33 -0
- package/src/lib/core/decorators/role.decorator.ts +12 -0
- package/src/lib/core/decorators/skip-mfa.decorator.ts +4 -0
- package/src/lib/core/dto/message.response.dto.ts +6 -0
- package/src/lib/core/{entities.d.ts → entities.ts} +18 -1
- package/src/lib/core/{index.d.ts → index.ts} +17 -0
- package/src/lib/core/interfaces/auth-module-options.interface.ts +211 -0
- package/src/lib/core/interfaces/mfa-options.interface.ts +46 -0
- package/src/lib/core/interfaces/otp.interface.ts +6 -0
- package/src/lib/core/interfaces/session-options.interface.ts +19 -0
- package/src/lib/core/interfaces/{token-payload.interface.d.ts → token-payload.interface.ts} +4 -1
- package/src/lib/core/providers/apple-auth.provider.ts +61 -0
- package/src/lib/core/providers/base-auth.provider.ts +74 -0
- package/src/lib/core/providers/email-auth.provider.ts +71 -0
- package/src/lib/core/providers/facebook-auth.provider.ts +55 -0
- package/src/lib/core/providers/github-auth.provider.ts +79 -0
- package/src/lib/core/providers/google-auth.provider.ts +61 -0
- package/src/lib/core/providers/jwt-auth.provider.ts +50 -0
- package/src/lib/core/providers/phone-auth.provider.ts +45 -0
- package/src/lib/core/services/auth-config.service.ts +184 -0
- package/src/lib/core/services/auth-provider-registry.service.ts +93 -0
- package/src/lib/core/services/{debug-logger.service.js → debug-logger.service.ts} +92 -59
- package/src/lib/core/services/initialization.service.ts +29 -0
- package/src/lib/core/services/jwt.service.ts +137 -0
- package/src/lib/nest-auth.module.ts +152 -0
- package/src/lib/permission/entities/permission.entity.ts +56 -0
- package/src/lib/permission/index.ts +4 -0
- package/src/lib/permission/permission.module.ts +14 -0
- package/src/lib/permission/services/permission.service.ts +233 -0
- package/src/lib/request-context/index.ts +2 -0
- package/src/lib/request-context/request-context.middleware.ts +13 -0
- package/src/lib/request-context/{request-context.js → request-context.ts} +51 -27
- package/src/lib/role/entities/role.entity.ts +103 -0
- package/src/lib/role/{index.d.ts → index.ts} +2 -0
- package/src/lib/role/role.module.ts +15 -0
- package/src/lib/role/services/{role.service.js → role.service.ts} +117 -52
- package/src/lib/session/entities/session.entity.ts +54 -0
- package/src/lib/session/index.ts +20 -0
- package/src/lib/session/interfaces/session-repository.interface.ts +58 -0
- package/src/lib/session/repositories/base-session.repository.ts +74 -0
- package/src/lib/session/repositories/memory-session.repository.ts +153 -0
- package/src/lib/session/repositories/redis-session.repository.ts +171 -0
- package/src/lib/session/repositories/typeorm-session.repository.ts +86 -0
- package/src/lib/session/services/session-manager.service.ts +261 -0
- package/src/lib/session/session.module.ts +102 -0
- package/src/lib/session/utils/session.util.ts +166 -0
- package/src/lib/tenant/entities/tenant.entity.ts +40 -0
- package/src/lib/tenant/events/tenant-created.event.ts +9 -0
- package/src/lib/tenant/events/tenant-deleted.event.ts +11 -0
- package/src/lib/tenant/events/{tenant-updated.event.d.ts → tenant-updated.event.ts} +6 -3
- package/src/lib/tenant/index.ts +9 -0
- package/src/lib/tenant/services/tenant.service.ts +336 -0
- package/src/lib/tenant/tenant.module.ts +19 -0
- package/src/lib/types/express.d.ts +14 -0
- package/src/lib/user/dto/requests/update-user.dto.ts +15 -0
- package/src/lib/user/entities/access-key.entity.ts +53 -0
- package/src/lib/user/entities/identity.entity.ts +31 -0
- package/src/lib/user/entities/user.entity.ts +212 -0
- package/src/lib/user/events/{user-created.event.d.ts → user-created.event.ts} +4 -3
- package/src/lib/user/events/{user-deleted.event.d.ts → user-deleted.event.ts} +6 -3
- package/src/lib/user/events/{user-updated.event.d.ts → user-updated.event.ts} +6 -3
- package/src/lib/user/index.ts +11 -0
- package/src/lib/user/services/access-key.service.ts +145 -0
- package/src/lib/user/services/{user.service.js → user.service.ts} +199 -95
- package/src/lib/user/user.module.ts +26 -0
- package/src/lib/utils/database.utils.ts +6 -0
- package/src/lib/utils/date.util.ts +106 -0
- package/src/lib/utils/device.util.ts +111 -0
- package/src/lib/utils/index.ts +6 -0
- package/src/lib/utils/otp.ts +3 -0
- package/src/lib/utils/security.util.ts +27 -0
- package/src/lib/utils/slug.util.ts +58 -0
- package/src/types/ms.d.ts +1 -0
- package/test/access-key.service.spec.ts +204 -0
- package/test/auth.service.spec.ts +541 -0
- package/test/mfa.service.spec.ts +359 -0
- package/test/role.service.spec.ts +418 -0
- package/test/tenant.service.spec.ts +218 -0
- package/test/test.setup.ts +66 -0
- package/test/user.service.spec.ts +374 -0
- package/tsconfig.json +17 -0
- package/tsconfig.lib.json +15 -0
- package/tsconfig.spec.json +15 -0
- package/tsconfig.tsbuildinfo +1 -1
- package/ui/.env +1 -0
- package/ui/.env.example +1 -0
- package/ui/.eslintignore +7 -0
- package/ui/README.md +288 -0
- package/ui/index.html +17 -0
- package/ui/package.json +34 -0
- package/ui/postcss.config.js +6 -0
- package/ui/src/App.tsx +245 -0
- package/ui/src/components/AuthGuard.tsx +59 -0
- package/ui/src/components/AuthProvider.tsx +76 -0
- package/ui/src/components/Button.tsx +37 -0
- package/ui/src/components/Card.tsx +37 -0
- package/ui/src/components/ErrorMessage.tsx +15 -0
- package/ui/src/components/FormDialog.tsx +61 -0
- package/ui/src/components/FormFooter.tsx +37 -0
- package/ui/src/components/Layout.tsx +112 -0
- package/ui/src/components/LoadingMessage.tsx +11 -0
- package/ui/src/components/Modal.tsx +97 -0
- package/ui/src/components/MultiSelect.tsx +145 -0
- package/ui/src/components/PageHeader.tsx +42 -0
- package/ui/src/components/PanelHeader.tsx +28 -0
- package/ui/src/components/PermissionInput.tsx +473 -0
- package/ui/src/components/SearchInput.tsx +69 -0
- package/ui/src/components/Select.tsx +51 -0
- package/ui/src/components/SwaggerUIWrapper.tsx +316 -0
- package/ui/src/components/Table.tsx +207 -0
- package/ui/src/components/Tag.tsx +9 -0
- package/ui/src/components/TagsInput.tsx +96 -0
- package/ui/src/components/admin/AdminForm.tsx +170 -0
- package/ui/src/components/admin/CreateAdminDialog.tsx +38 -0
- package/ui/src/components/auth/LoginFooter.tsx +17 -0
- package/ui/src/components/auth/LoginHeader.tsx +14 -0
- package/ui/src/components/auth/components/CodeBlock.tsx +43 -0
- package/ui/src/components/auth/components/CreateAccountCodeExamples.tsx +60 -0
- package/ui/src/components/auth/components/PasswordRequirements.tsx +16 -0
- package/ui/src/components/auth/components/PasswordStrengthIndicator.tsx +48 -0
- package/ui/src/components/auth/components/ResetPasswordCodeExamples.tsx +76 -0
- package/ui/src/components/auth/components/Tabs.tsx +32 -0
- package/ui/src/components/auth/dialogs/CreateAccountDialog.tsx +79 -0
- package/ui/src/components/auth/dialogs/ForgotPasswordDialog.tsx +79 -0
- package/ui/src/components/auth/forms/CreateAccountForm.tsx +226 -0
- package/ui/src/components/auth/forms/LoginForm.tsx +149 -0
- package/ui/src/components/auth/forms/ResetPasswordForm.tsx +202 -0
- package/ui/src/components/auth/types.ts +17 -0
- package/ui/src/components/auth/utils/security.ts +82 -0
- package/ui/src/components/auth/utils/utils.ts +25 -0
- package/ui/src/components/form/EmailField.tsx +25 -0
- package/ui/src/components/form/FormField.tsx +102 -0
- package/ui/src/components/form/FormMultiSelect.tsx +46 -0
- package/ui/src/components/form/FormSelect.tsx +60 -0
- package/ui/src/components/form/FormTagsInput.tsx +42 -0
- package/ui/src/components/form/FormTextarea.tsx +42 -0
- package/ui/src/components/form/PasswordField.tsx +93 -0
- package/ui/src/components/form/SecretKeyField.tsx +49 -0
- package/ui/src/components/permission/CreatePermissionDialog.tsx +44 -0
- package/ui/src/components/permission/EditPermissionDialog.tsx +55 -0
- package/ui/src/components/permission/PermissionForm.tsx +251 -0
- package/ui/src/components/role/CreateRoleDialog.tsx +45 -0
- package/ui/src/components/role/EditRoleDialog.tsx +55 -0
- package/ui/src/components/role/RoleDialog.tsx +252 -0
- package/ui/src/components/role/RoleForm.tsx +246 -0
- package/ui/src/components/tenant/CreateTenantDialog.tsx +41 -0
- package/ui/src/components/tenant/EditTenantDialog.tsx +52 -0
- package/ui/src/components/tenant/TenantForm.tsx +160 -0
- package/ui/src/components/user/CreateUserDialog.tsx +45 -0
- package/ui/src/components/user/UserDetailModal.tsx +815 -0
- package/ui/src/components/user/UserForm.tsx +191 -0
- package/ui/src/data/nest-auth.json +1687 -0
- package/ui/src/hooks/useApi.ts +69 -0
- package/ui/src/hooks/useAuth.ts +100 -0
- package/ui/src/hooks/useConfirm.tsx +105 -0
- package/ui/src/hooks/useFormFooter.tsx +42 -0
- package/ui/src/hooks/usePagination.ts +69 -0
- package/ui/src/index.css +59 -0
- package/ui/src/main.tsx +13 -0
- package/ui/src/pages/AdminsPage.tsx +178 -0
- package/ui/src/pages/ApiPage.tsx +89 -0
- package/ui/src/pages/DashboardPage.tsx +281 -0
- package/ui/src/pages/LoginPage.tsx +39 -0
- package/ui/src/pages/PermissionsPage.tsx +376 -0
- package/ui/src/pages/RolesPage.tsx +274 -0
- package/ui/src/pages/TenantsPage.tsx +221 -0
- package/ui/src/pages/UsersPage.tsx +387 -0
- package/ui/src/services/api.ts +115 -0
- package/ui/src/types/index.ts +136 -0
- package/ui/src/vite-env.d.ts +9 -0
- package/ui/tailwind.config.js +45 -0
- package/ui/tsconfig.json +24 -0
- package/ui/tsconfig.node.json +10 -0
- package/ui/vite.config.ts +37 -0
- package/ui/yarn.lock +3137 -0
- package/src/index.d.ts +0 -11
- package/src/index.js +0 -18
- package/src/index.js.map +0 -1
- package/src/lib/auth/auth.module.d.ts +0 -2
- package/src/lib/auth/auth.module.js +0 -54
- package/src/lib/auth/auth.module.js.map +0 -1
- package/src/lib/auth/controllers/auth.controller.d.ts +0 -29
- package/src/lib/auth/controllers/auth.controller.js +0 -206
- package/src/lib/auth/controllers/auth.controller.js.map +0 -1
- package/src/lib/auth/controllers/mfa.controller.d.ts +0 -23
- package/src/lib/auth/controllers/mfa.controller.js +0 -131
- package/src/lib/auth/controllers/mfa.controller.js.map +0 -1
- package/src/lib/auth/dto/index.d.ts +0 -0
- package/src/lib/auth/dto/index.js +0 -1
- package/src/lib/auth/dto/index.js.map +0 -1
- package/src/lib/auth/dto/requests/forgot-password.request.dto.d.ts +0 -5
- package/src/lib/auth/dto/requests/forgot-password.request.dto.js +0 -30
- package/src/lib/auth/dto/requests/forgot-password.request.dto.js.map +0 -1
- package/src/lib/auth/dto/requests/login.request.dto.d.ts +0 -6
- package/src/lib/auth/dto/requests/login.request.dto.js +0 -38
- package/src/lib/auth/dto/requests/login.request.dto.js.map +0 -1
- package/src/lib/auth/dto/requests/refresh-token.request.dto.d.ts +0 -3
- package/src/lib/auth/dto/requests/refresh-token.request.dto.js +0 -15
- package/src/lib/auth/dto/requests/refresh-token.request.dto.js.map +0 -1
- package/src/lib/auth/dto/requests/reset-password.request.dto.d.ts +0 -7
- package/src/lib/auth/dto/requests/reset-password.request.dto.js +0 -42
- package/src/lib/auth/dto/requests/reset-password.request.dto.js.map +0 -1
- package/src/lib/auth/dto/requests/send-mfa-code.request.dto.d.ts +0 -4
- package/src/lib/auth/dto/requests/send-mfa-code.request.dto.js +0 -16
- package/src/lib/auth/dto/requests/send-mfa-code.request.dto.js.map +0 -1
- package/src/lib/auth/dto/requests/signup.request.dto.d.ts +0 -7
- package/src/lib/auth/dto/requests/signup.request.dto.js +0 -37
- package/src/lib/auth/dto/requests/signup.request.dto.js.map +0 -1
- package/src/lib/auth/dto/requests/social-login.request.dto.d.ts +0 -3
- package/src/lib/auth/dto/requests/social-login.request.dto.js +0 -16
- package/src/lib/auth/dto/requests/social-login.request.dto.js.map +0 -1
- package/src/lib/auth/dto/requests/verify-2fa.request.dto.d.ts +0 -5
- package/src/lib/auth/dto/requests/verify-2fa.request.dto.js +0 -21
- package/src/lib/auth/dto/requests/verify-2fa.request.dto.js.map +0 -1
- package/src/lib/auth/dto/requests/verify-forgot-password-otp-request-dto.d.ts +0 -6
- package/src/lib/auth/dto/requests/verify-forgot-password-otp-request-dto.js +0 -35
- package/src/lib/auth/dto/requests/verify-forgot-password-otp-request-dto.js.map +0 -1
- package/src/lib/auth/dto/requests/verify-totp-setup.request.dto.d.ts +0 -4
- package/src/lib/auth/dto/requests/verify-totp-setup.request.dto.js +0 -20
- package/src/lib/auth/dto/requests/verify-totp-setup.request.dto.js.map +0 -1
- package/src/lib/auth/dto/responses/auth.response.dto.d.ts +0 -16
- package/src/lib/auth/dto/responses/auth.response.dto.js +0 -50
- package/src/lib/auth/dto/responses/auth.response.dto.js.map +0 -1
- package/src/lib/auth/entities/mfa-secret.entity.d.ts +0 -12
- package/src/lib/auth/entities/mfa-secret.entity.js +0 -50
- package/src/lib/auth/entities/mfa-secret.entity.js.map +0 -1
- package/src/lib/auth/entities/otp.entity.d.ts +0 -13
- package/src/lib/auth/entities/otp.entity.js +0 -50
- package/src/lib/auth/entities/otp.entity.js.map +0 -1
- package/src/lib/auth/events/logged-out-all.event.js +0 -10
- package/src/lib/auth/events/logged-out-all.event.js.map +0 -1
- package/src/lib/auth/events/logged-out.event.js +0 -10
- package/src/lib/auth/events/logged-out.event.js.map +0 -1
- package/src/lib/auth/events/password-reset-requested.event.js +0 -10
- package/src/lib/auth/events/password-reset-requested.event.js.map +0 -1
- package/src/lib/auth/events/password-reset.event.js +0 -10
- package/src/lib/auth/events/password-reset.event.js.map +0 -1
- package/src/lib/auth/events/user-2fa-verified.event.js +0 -10
- package/src/lib/auth/events/user-2fa-verified.event.js.map +0 -1
- package/src/lib/auth/events/user-logged-in.event.js +0 -10
- package/src/lib/auth/events/user-logged-in.event.js.map +0 -1
- package/src/lib/auth/events/user-refresh-token.event.js +0 -10
- package/src/lib/auth/events/user-refresh-token.event.js.map +0 -1
- package/src/lib/auth/events/user-registered.event.js +0 -10
- package/src/lib/auth/events/user-registered.event.js.map +0 -1
- package/src/lib/auth/guards/auth.guard.d.ts +0 -28
- package/src/lib/auth/guards/auth.guard.js +0 -304
- package/src/lib/auth/guards/auth.guard.js.map +0 -1
- package/src/lib/auth/index.js +0 -31
- package/src/lib/auth/index.js.map +0 -1
- package/src/lib/auth/services/auth.service.d.ts +0 -53
- package/src/lib/auth/services/auth.service.js +0 -522
- package/src/lib/auth/services/auth.service.js.map +0 -1
- package/src/lib/auth/services/cookie.service.d.ts +0 -9
- package/src/lib/auth/services/cookie.service.js +0 -43
- package/src/lib/auth/services/cookie.service.js.map +0 -1
- package/src/lib/auth/services/mfa.service.d.ts +0 -38
- package/src/lib/auth/services/mfa.service.js +0 -254
- package/src/lib/auth/services/mfa.service.js.map +0 -1
- package/src/lib/auth.constants.d.ts +0 -39
- package/src/lib/auth.constants.js +0 -43
- package/src/lib/auth.constants.js.map +0 -1
- package/src/lib/core/core.module.d.ts +0 -2
- package/src/lib/core/core.module.js +0 -53
- package/src/lib/core/core.module.js.map +0 -1
- package/src/lib/core/decorators/auth.decorator.d.ts +0 -1
- package/src/lib/core/decorators/auth.decorator.js +0 -8
- package/src/lib/core/decorators/auth.decorator.js.map +0 -1
- package/src/lib/core/decorators/permissions.decorator.d.ts +0 -2
- package/src/lib/core/decorators/permissions.decorator.js +0 -14
- package/src/lib/core/decorators/permissions.decorator.js.map +0 -1
- package/src/lib/core/decorators/role.decorator.d.ts +0 -3
- package/src/lib/core/decorators/role.decorator.js +0 -14
- package/src/lib/core/decorators/role.decorator.js.map +0 -1
- package/src/lib/core/decorators/skip-mfa.decorator.d.ts +0 -2
- package/src/lib/core/decorators/skip-mfa.decorator.js +0 -8
- package/src/lib/core/decorators/skip-mfa.decorator.js.map +0 -1
- package/src/lib/core/dto/message.response.dto.d.ts +0 -3
- package/src/lib/core/dto/message.response.dto.js +0 -13
- package/src/lib/core/dto/message.response.dto.js.map +0 -1
- package/src/lib/core/entities.js +0 -31
- package/src/lib/core/entities.js.map +0 -1
- package/src/lib/core/index.js +0 -27
- package/src/lib/core/index.js.map +0 -1
- package/src/lib/core/interfaces/auth-module-options.interface.d.ts +0 -62
- package/src/lib/core/interfaces/auth-module-options.interface.js +0 -3
- package/src/lib/core/interfaces/auth-module-options.interface.js.map +0 -1
- package/src/lib/core/interfaces/mfa-options.interface.d.ts +0 -25
- package/src/lib/core/interfaces/mfa-options.interface.js +0 -10
- package/src/lib/core/interfaces/mfa-options.interface.js.map +0 -1
- package/src/lib/core/interfaces/otp.interface.d.ts +0 -5
- package/src/lib/core/interfaces/otp.interface.js +0 -10
- package/src/lib/core/interfaces/otp.interface.js.map +0 -1
- package/src/lib/core/interfaces/session-options.interface.d.ts +0 -12
- package/src/lib/core/interfaces/session-options.interface.js +0 -9
- package/src/lib/core/interfaces/session-options.interface.js.map +0 -1
- package/src/lib/core/interfaces/token-payload.interface.js +0 -3
- package/src/lib/core/interfaces/token-payload.interface.js.map +0 -1
- package/src/lib/core/providers/apple-auth.provider.d.ts +0 -18
- package/src/lib/core/providers/apple-auth.provider.js +0 -57
- package/src/lib/core/providers/apple-auth.provider.js.map +0 -1
- package/src/lib/core/providers/base-auth.provider.d.ts +0 -26
- package/src/lib/core/providers/base-auth.provider.js +0 -43
- package/src/lib/core/providers/base-auth.provider.js.map +0 -1
- package/src/lib/core/providers/email-auth.provider.d.ts +0 -17
- package/src/lib/core/providers/email-auth.provider.js +0 -40
- package/src/lib/core/providers/email-auth.provider.js.map +0 -1
- package/src/lib/core/providers/facebook-auth.provider.d.ts +0 -18
- package/src/lib/core/providers/facebook-auth.provider.js +0 -56
- package/src/lib/core/providers/facebook-auth.provider.js.map +0 -1
- package/src/lib/core/providers/google-auth.provider.d.ts +0 -21
- package/src/lib/core/providers/google-auth.provider.js +0 -58
- package/src/lib/core/providers/google-auth.provider.js.map +0 -1
- package/src/lib/core/providers/jwt-auth.provider.d.ts +0 -33
- package/src/lib/core/providers/jwt-auth.provider.js +0 -50
- package/src/lib/core/providers/jwt-auth.provider.js.map +0 -1
- package/src/lib/core/providers/phone-auth.provider.d.ts +0 -18
- package/src/lib/core/providers/phone-auth.provider.js +0 -43
- package/src/lib/core/providers/phone-auth.provider.js.map +0 -1
- package/src/lib/core/services/auth-config.service.d.ts +0 -12
- package/src/lib/core/services/auth-config.service.js +0 -79
- package/src/lib/core/services/auth-config.service.js.map +0 -1
- package/src/lib/core/services/auth-provider-registry.service.d.ts +0 -24
- package/src/lib/core/services/auth-provider-registry.service.js +0 -71
- package/src/lib/core/services/auth-provider-registry.service.js.map +0 -1
- package/src/lib/core/services/debug-logger.service.d.ts +0 -38
- package/src/lib/core/services/debug-logger.service.js.map +0 -1
- package/src/lib/core/services/initialization.service.d.ts +0 -10
- package/src/lib/core/services/initialization.service.js +0 -34
- package/src/lib/core/services/initialization.service.js.map +0 -1
- package/src/lib/core/services/jwt.service.d.ts +0 -14
- package/src/lib/core/services/jwt.service.js +0 -92
- package/src/lib/core/services/jwt.service.js.map +0 -1
- package/src/lib/nest-auth.module.d.ts +0 -11
- package/src/lib/nest-auth.module.js +0 -177
- package/src/lib/nest-auth.module.js.map +0 -1
- package/src/lib/request-context/request-context.d.ts +0 -22
- package/src/lib/request-context/request-context.js.map +0 -1
- package/src/lib/request-context/request-context.middleware.d.ts +0 -4
- package/src/lib/request-context/request-context.middleware.js +0 -16
- package/src/lib/request-context/request-context.middleware.js.map +0 -1
- package/src/lib/role/entities/role.entity.d.ts +0 -20
- package/src/lib/role/entities/role.entity.js +0 -110
- package/src/lib/role/entities/role.entity.js.map +0 -1
- package/src/lib/role/index.js +0 -5
- package/src/lib/role/index.js.map +0 -1
- package/src/lib/role/role.module.d.ts +0 -2
- package/src/lib/role/role.module.js +0 -23
- package/src/lib/role/role.module.js.map +0 -1
- package/src/lib/role/services/role.service.d.ts +0 -20
- package/src/lib/role/services/role.service.js.map +0 -1
- package/src/lib/session/entities/session.entity.d.ts +0 -16
- package/src/lib/session/entities/session.entity.js +0 -63
- package/src/lib/session/entities/session.entity.js.map +0 -1
- package/src/lib/session/index.d.ts +0 -3
- package/src/lib/session/index.js +0 -7
- package/src/lib/session/index.js.map +0 -1
- package/src/lib/session/services/base-session.service.d.ts +0 -23
- package/src/lib/session/services/base-session.service.js +0 -64
- package/src/lib/session/services/base-session.service.js.map +0 -1
- package/src/lib/session/services/database-session.service.d.ts +0 -17
- package/src/lib/session/services/database-session.service.js +0 -51
- package/src/lib/session/services/database-session.service.js.map +0 -1
- package/src/lib/session/services/redis-session.service.d.ts +0 -20
- package/src/lib/session/services/redis-session.service.js +0 -117
- package/src/lib/session/services/redis-session.service.js.map +0 -1
- package/src/lib/session/session.module.d.ts +0 -2
- package/src/lib/session/session.module.js +0 -33
- package/src/lib/session/session.module.js.map +0 -1
- package/src/lib/tenant/entities/tenant.entity.d.ts +0 -10
- package/src/lib/tenant/entities/tenant.entity.js +0 -44
- package/src/lib/tenant/entities/tenant.entity.js.map +0 -1
- package/src/lib/tenant/events/tenant-created.event.d.ts +0 -8
- package/src/lib/tenant/events/tenant-created.event.js +0 -10
- package/src/lib/tenant/events/tenant-created.event.js.map +0 -1
- package/src/lib/tenant/events/tenant-deleted.event.d.ts +0 -8
- package/src/lib/tenant/events/tenant-deleted.event.js +0 -10
- package/src/lib/tenant/events/tenant-deleted.event.js.map +0 -1
- package/src/lib/tenant/events/tenant-updated.event.js +0 -10
- package/src/lib/tenant/events/tenant-updated.event.js.map +0 -1
- package/src/lib/tenant/index.d.ts +0 -1
- package/src/lib/tenant/index.js +0 -5
- package/src/lib/tenant/index.js.map +0 -1
- package/src/lib/tenant/services/tenant.service.d.ts +0 -26
- package/src/lib/tenant/services/tenant.service.js +0 -200
- package/src/lib/tenant/services/tenant.service.js.map +0 -1
- package/src/lib/tenant/tenant.module.d.ts +0 -2
- package/src/lib/tenant/tenant.module.js +0 -27
- package/src/lib/tenant/tenant.module.js.map +0 -1
- package/src/lib/user/dto/requests/update-user.dto.d.ts +0 -5
- package/src/lib/user/dto/requests/update-user.dto.js +0 -24
- package/src/lib/user/dto/requests/update-user.dto.js.map +0 -1
- package/src/lib/user/entities/access-key.entity.d.ts +0 -16
- package/src/lib/user/entities/access-key.entity.js +0 -63
- package/src/lib/user/entities/access-key.entity.js.map +0 -1
- package/src/lib/user/entities/identity.entity.d.ts +0 -12
- package/src/lib/user/entities/identity.entity.js +0 -47
- package/src/lib/user/entities/identity.entity.js.map +0 -1
- package/src/lib/user/entities/user.entity.d.ts +0 -39
- package/src/lib/user/entities/user.entity.js +0 -201
- package/src/lib/user/entities/user.entity.js.map +0 -1
- package/src/lib/user/events/user-created.event.js +0 -10
- package/src/lib/user/events/user-created.event.js.map +0 -1
- package/src/lib/user/events/user-deleted.event.js +0 -10
- package/src/lib/user/events/user-deleted.event.js.map +0 -1
- package/src/lib/user/events/user-updated.event.js +0 -10
- package/src/lib/user/events/user-updated.event.js.map +0 -1
- package/src/lib/user/index.d.ts +0 -3
- package/src/lib/user/index.js +0 -7
- package/src/lib/user/index.js.map +0 -1
- package/src/lib/user/services/access-key.service.d.ts +0 -19
- package/src/lib/user/services/access-key.service.js +0 -119
- package/src/lib/user/services/access-key.service.js.map +0 -1
- package/src/lib/user/services/user.service.d.ts +0 -24
- package/src/lib/user/services/user.service.js.map +0 -1
- package/src/lib/user/user.module.d.ts +0 -2
- package/src/lib/user/user.module.js +0 -34
- package/src/lib/user/user.module.js.map +0 -1
- package/src/lib/utils/database.utils.d.ts +0 -2
- package/src/lib/utils/database.utils.js +0 -8
- package/src/lib/utils/database.utils.js.map +0 -1
- package/src/lib/utils/otp.d.ts +0 -1
- package/src/lib/utils/otp.js +0 -7
- package/src/lib/utils/otp.js.map +0 -1
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import { Module } from '@nestjs/common';
|
|
2
|
+
import { TypeOrmModule } from '@nestjs/typeorm';
|
|
3
|
+
import { AuthProviderRegistryService } from './services/auth-provider-registry.service';
|
|
4
|
+
import { AppleAuthProvider } from './providers/apple-auth.provider';
|
|
5
|
+
import { JwtAuthProvider } from './providers/jwt-auth.provider';
|
|
6
|
+
import { EmailAuthProvider } from './providers/email-auth.provider';
|
|
7
|
+
import { FacebookAuthProvider } from './providers/facebook-auth.provider';
|
|
8
|
+
import { GoogleAuthProvider } from './providers/google-auth.provider';
|
|
9
|
+
import { GitHubAuthProvider } from './providers/github-auth.provider';
|
|
10
|
+
import { PhoneAuthProvider } from './providers/phone-auth.provider';
|
|
11
|
+
import { JwtService } from './services/jwt.service';
|
|
12
|
+
import { AuthConfigService } from './services/auth-config.service';
|
|
13
|
+
import { InitializationService } from './services/initialization.service';
|
|
14
|
+
import { DebugLoggerService } from './services/debug-logger.service';
|
|
15
|
+
import { TenantModule } from '../tenant/tenant.module';
|
|
16
|
+
import { NestAuthUser } from '../user/entities/user.entity';
|
|
17
|
+
import { NestAuthIdentity } from '../user/entities/identity.entity';
|
|
18
|
+
|
|
19
|
+
/**
|
|
20
|
+
* CoreModule provides core authentication services and providers.
|
|
21
|
+
* Imports TypeOrmModule.forFeature to provide DataSource for auth providers.
|
|
22
|
+
*/
|
|
23
|
+
@Module({
|
|
24
|
+
imports: [
|
|
25
|
+
TypeOrmModule.forFeature([NestAuthUser, NestAuthIdentity]),
|
|
26
|
+
TenantModule
|
|
27
|
+
],
|
|
28
|
+
providers: [
|
|
29
|
+
AuthConfigService,
|
|
30
|
+
DebugLoggerService,
|
|
31
|
+
JwtService,
|
|
32
|
+
AuthProviderRegistryService,
|
|
33
|
+
EmailAuthProvider,
|
|
34
|
+
PhoneAuthProvider,
|
|
35
|
+
JwtAuthProvider,
|
|
36
|
+
GoogleAuthProvider,
|
|
37
|
+
FacebookAuthProvider,
|
|
38
|
+
AppleAuthProvider,
|
|
39
|
+
GitHubAuthProvider,
|
|
40
|
+
InitializationService,
|
|
41
|
+
],
|
|
42
|
+
exports: [
|
|
43
|
+
JwtService,
|
|
44
|
+
AuthProviderRegistryService,
|
|
45
|
+
AuthConfigService,
|
|
46
|
+
DebugLoggerService,
|
|
47
|
+
InitializationService,
|
|
48
|
+
],
|
|
49
|
+
})
|
|
50
|
+
export class CoreModule { }
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import { UseGuards, applyDecorators, SetMetadata } from '@nestjs/common';
|
|
2
|
+
import { NestAuthAuthGuard, OPTIONAL_AUTH_KEY } from '../../auth/guards/auth.guard';
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* Flexible Authentication Decorator
|
|
6
|
+
*
|
|
7
|
+
* This decorator applies the NestAuthAuthGuard with configurable authentication mode:
|
|
8
|
+
*
|
|
9
|
+
* @param optional - If true, authentication becomes optional (no errors thrown for missing/invalid tokens)
|
|
10
|
+
*
|
|
11
|
+
* @example Required Authentication (default behavior):
|
|
12
|
+
* ```typescript
|
|
13
|
+
* @Get('protected')
|
|
14
|
+
* @Auth() // or @Auth(false)
|
|
15
|
+
* async getProtectedData(@Request() req) {
|
|
16
|
+
* const user = req.user; // Will always exist or request fails
|
|
17
|
+
* return this.getProtectedData(user.id);
|
|
18
|
+
* }
|
|
19
|
+
* ```
|
|
20
|
+
*
|
|
21
|
+
* @example Optional Authentication:
|
|
22
|
+
* ```typescript
|
|
23
|
+
* @Get('posts')
|
|
24
|
+
* @Auth(true) // Optional authentication
|
|
25
|
+
* async getPosts(@Request() req) {
|
|
26
|
+
* const user = req.user; // Will be null if not authenticated
|
|
27
|
+
* if (user) {
|
|
28
|
+
* return this.getPersonalizedPosts(user.id);
|
|
29
|
+
* } else {
|
|
30
|
+
* return this.getPublicPosts();
|
|
31
|
+
* }
|
|
32
|
+
* }
|
|
33
|
+
* ```
|
|
34
|
+
*/
|
|
35
|
+
export const Auth = (optional: boolean = false) => applyDecorators(
|
|
36
|
+
SetMetadata(OPTIONAL_AUTH_KEY, optional),
|
|
37
|
+
UseGuards(NestAuthAuthGuard)
|
|
38
|
+
);
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { SetMetadata } from '@nestjs/common';
|
|
2
|
+
|
|
3
|
+
export const PERMISSIONS_KEY = 'nest_auth_permissions';
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* Decorator to specify required permissions for a route
|
|
7
|
+
* @param permissions - Array of permission strings or single permission string
|
|
8
|
+
* @returns Decorator function
|
|
9
|
+
*/
|
|
10
|
+
export function NestAuthPermissions(permissions: string[] | string) {
|
|
11
|
+
return (target: any, key?: string, descriptor?: PropertyDescriptor) => {
|
|
12
|
+
if (descriptor) {
|
|
13
|
+
Reflect.defineMetadata(PERMISSIONS_KEY, permissions, descriptor.value);
|
|
14
|
+
}
|
|
15
|
+
return descriptor;
|
|
16
|
+
};
|
|
17
|
+
}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import { SetMetadata } from '@nestjs/common';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Key for public route metadata
|
|
5
|
+
* Used to mark routes that should skip authentication when global guard is enabled
|
|
6
|
+
*/
|
|
7
|
+
export const IS_PUBLIC_KEY = 'isPublic';
|
|
8
|
+
|
|
9
|
+
/**
|
|
10
|
+
* @Public decorator
|
|
11
|
+
*
|
|
12
|
+
* Use this decorator to skip authentication on specific routes when enableGlobalGuard is true.
|
|
13
|
+
*
|
|
14
|
+
* @example
|
|
15
|
+
* ```typescript
|
|
16
|
+
* @Controller('users')
|
|
17
|
+
* export class UsersController {
|
|
18
|
+
* // This route is public - no authentication required
|
|
19
|
+
* @Public()
|
|
20
|
+
* @Get('info')
|
|
21
|
+
* getPublicInfo() {
|
|
22
|
+
* return { info: 'public data' };
|
|
23
|
+
* }
|
|
24
|
+
*
|
|
25
|
+
* // This route requires authentication (protected by global guard)
|
|
26
|
+
* @Get('profile')
|
|
27
|
+
* getProfile(@Request() req) {
|
|
28
|
+
* return req.user;
|
|
29
|
+
* }
|
|
30
|
+
* }
|
|
31
|
+
* ```
|
|
32
|
+
*/
|
|
33
|
+
export const Public = () => SetMetadata(IS_PUBLIC_KEY, true);
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
|
|
2
|
+
export const ROLES_KEY = 'nest_auth_roles';
|
|
3
|
+
export const GUARD_KEY = 'nest_auth_guard';
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
export function NestAuthRoles(roles: string[] | string, guard?: string) {
|
|
7
|
+
return (target: any, key: string, descriptor: PropertyDescriptor) => {
|
|
8
|
+
Reflect.defineMetadata(ROLES_KEY, roles, descriptor.value);
|
|
9
|
+
Reflect.defineMetadata(GUARD_KEY, guard, descriptor.value);
|
|
10
|
+
return descriptor;
|
|
11
|
+
};
|
|
12
|
+
}
|
|
@@ -6,6 +6,9 @@ import { NestAuthRole } from '../role/entities/role.entity';
|
|
|
6
6
|
import { NestAuthMFASecret } from '../auth/entities/mfa-secret.entity';
|
|
7
7
|
import { NestAuthOTP } from '../auth/entities/otp.entity';
|
|
8
8
|
import { NestAuthSession } from '../session/entities/session.entity';
|
|
9
|
+
import { NestAuthPermission } from '../permission/entities/permission.entity';
|
|
10
|
+
import { AdminUser as NestAuthAdminUser } from '../admin-console/entities/admin-user.entity';
|
|
11
|
+
|
|
9
12
|
export * from '../user/entities/user.entity';
|
|
10
13
|
export * from '../user/entities/identity.entity';
|
|
11
14
|
export * from '../user/entities/access-key.entity';
|
|
@@ -14,4 +17,18 @@ export * from '../role/entities/role.entity';
|
|
|
14
17
|
export * from '../auth/entities/mfa-secret.entity';
|
|
15
18
|
export * from '../auth/entities/otp.entity';
|
|
16
19
|
export * from '../session/entities/session.entity';
|
|
17
|
-
export
|
|
20
|
+
export * from '../permission/entities/permission.entity';
|
|
21
|
+
export { AdminUser as NestAuthAdminUser } from '../admin-console/entities/admin-user.entity';
|
|
22
|
+
|
|
23
|
+
export const NestAuthEntities = [
|
|
24
|
+
NestAuthUser,
|
|
25
|
+
NestAuthIdentity,
|
|
26
|
+
NestAuthRole,
|
|
27
|
+
NestAuthTenant,
|
|
28
|
+
NestAuthMFASecret,
|
|
29
|
+
NestAuthSession,
|
|
30
|
+
NestAuthOTP,
|
|
31
|
+
NestAuthAccessKey,
|
|
32
|
+
NestAuthPermission,
|
|
33
|
+
NestAuthAdminUser,
|
|
34
|
+
];
|
|
@@ -1,23 +1,40 @@
|
|
|
1
|
+
// Decorators
|
|
1
2
|
export * from './decorators/role.decorator';
|
|
2
3
|
export * from './decorators/permissions.decorator';
|
|
3
4
|
export * from './decorators/skip-mfa.decorator';
|
|
4
5
|
export * from './decorators/auth.decorator';
|
|
6
|
+
|
|
7
|
+
// Interfaces
|
|
5
8
|
export * from './interfaces/auth-module-options.interface';
|
|
6
9
|
export * from './interfaces/mfa-options.interface';
|
|
7
10
|
export * from './interfaces/session-options.interface';
|
|
8
11
|
export * from './interfaces/token-payload.interface';
|
|
12
|
+
|
|
13
|
+
// Entities
|
|
9
14
|
export * from './entities';
|
|
15
|
+
|
|
16
|
+
// DTOs
|
|
10
17
|
export * from './dto/message.response.dto';
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
// Interface
|
|
11
21
|
export * from './interfaces/auth-module-options.interface';
|
|
12
22
|
export * from './interfaces/mfa-options.interface';
|
|
13
23
|
export * from './interfaces/session-options.interface';
|
|
14
24
|
export * from './interfaces/token-payload.interface';
|
|
15
25
|
export * from './interfaces/otp.interface';
|
|
26
|
+
|
|
27
|
+
// Providers
|
|
28
|
+
export * from './providers/base-auth.provider';
|
|
16
29
|
export * from './providers/email-auth.provider';
|
|
17
30
|
export * from './providers/phone-auth.provider';
|
|
18
31
|
export * from './providers/jwt-auth.provider';
|
|
19
32
|
export * from './providers/google-auth.provider';
|
|
20
33
|
export * from './providers/facebook-auth.provider';
|
|
21
34
|
export * from './providers/apple-auth.provider';
|
|
35
|
+
export * from './providers/github-auth.provider';
|
|
36
|
+
|
|
37
|
+
|
|
38
|
+
// Services
|
|
22
39
|
export * from './services/auth-provider-registry.service';
|
|
23
40
|
export * from './services/jwt.service';
|
|
@@ -0,0 +1,211 @@
|
|
|
1
|
+
import { Type } from '@nestjs/common';
|
|
2
|
+
import { MFAOptions } from './mfa-options.interface';
|
|
3
|
+
import { CookieOptions, SessionOptions } from './session-options.interface';
|
|
4
|
+
import { BaseAuthProvider } from '../providers/base-auth.provider';
|
|
5
|
+
import { DebugLogOptions } from '../services/debug-logger.service';
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* Default Tenant Options
|
|
9
|
+
*
|
|
10
|
+
* When configured, a default tenant will be automatically created on module initialization
|
|
11
|
+
* and used for all authentication operations when no tenantId is explicitly provided.
|
|
12
|
+
*
|
|
13
|
+
* This enables single-tenant mode where users don't need to pass tenantId in signup/login requests.
|
|
14
|
+
*/
|
|
15
|
+
export interface DefaultTenantOptions {
|
|
16
|
+
/** Name of the default tenant */
|
|
17
|
+
name: string;
|
|
18
|
+
|
|
19
|
+
/**
|
|
20
|
+
* Unique identifier/slug for the tenant
|
|
21
|
+
* Must be lowercase, no spaces, only letters, numbers, hyphens (-) and underscores (_)
|
|
22
|
+
* Examples: 'my-app', 'acme_corp', 'tenant123'
|
|
23
|
+
*/
|
|
24
|
+
slug: string;
|
|
25
|
+
|
|
26
|
+
/**
|
|
27
|
+
* @deprecated Use 'slug' instead. Will be removed in v2.0.0
|
|
28
|
+
* Unique domain identifier for the tenant (legacy field)
|
|
29
|
+
*/
|
|
30
|
+
domain?: string;
|
|
31
|
+
|
|
32
|
+
/** Optional description */
|
|
33
|
+
description?: string;
|
|
34
|
+
|
|
35
|
+
/** Optional metadata */
|
|
36
|
+
metadata?: Record<string, any>;
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
export interface RegistrationCollectProfileField {
|
|
40
|
+
id: string;
|
|
41
|
+
label: string;
|
|
42
|
+
required: boolean;
|
|
43
|
+
type: 'text' | 'email' | 'phone' | 'select' | 'checkbox' | 'password';
|
|
44
|
+
placeholder?: string;
|
|
45
|
+
options?: Array<{ label: string; value: string }>;
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
export interface AuthModuleOptions {
|
|
49
|
+
isGlobal?: boolean;
|
|
50
|
+
appName: string;
|
|
51
|
+
/**
|
|
52
|
+
* Enable automatic token refresh via global interceptor.
|
|
53
|
+
* When enabled, expired access tokens are automatically refreshed using refresh tokens.
|
|
54
|
+
*
|
|
55
|
+
* Default: true (automatic refresh enabled)
|
|
56
|
+
*/
|
|
57
|
+
enableAutoRefresh?: boolean;
|
|
58
|
+
accessTokenType?: 'header' | 'cookie';
|
|
59
|
+
cookieOptions?: CookieOptions;
|
|
60
|
+
jwt: {
|
|
61
|
+
secret: string;
|
|
62
|
+
accessTokenExpiresIn?: number | string; // expressed in seconds or a string describing a time span [zeit/ms](https://github.com/zeit/ms.js). Eg: 60, "2 days", "10h", "7d"
|
|
63
|
+
refreshTokenExpiresIn?: number | string; // expressed in seconds or a string describing a time span [zeit/ms](https://github.com/zeit/ms.js). Eg: 60, "2 days", "10h", "7d"
|
|
64
|
+
};
|
|
65
|
+
google?: {
|
|
66
|
+
clientId: string;
|
|
67
|
+
clientSecret: string;
|
|
68
|
+
redirectUri: string;
|
|
69
|
+
};
|
|
70
|
+
facebook?: {
|
|
71
|
+
appId: string;
|
|
72
|
+
appSecret: string;
|
|
73
|
+
redirectUri: string;
|
|
74
|
+
};
|
|
75
|
+
apple?: {
|
|
76
|
+
clientId: string;
|
|
77
|
+
teamId: string;
|
|
78
|
+
keyId: string;
|
|
79
|
+
privateKey: string;
|
|
80
|
+
privateKeyMethod?: string;
|
|
81
|
+
redirectUri: string;
|
|
82
|
+
};
|
|
83
|
+
github?: {
|
|
84
|
+
clientId: string;
|
|
85
|
+
clientSecret: string;
|
|
86
|
+
redirectUri: string;
|
|
87
|
+
};
|
|
88
|
+
phoneAuth?: {
|
|
89
|
+
enabled: boolean;
|
|
90
|
+
};
|
|
91
|
+
emailAuth?: {
|
|
92
|
+
enabled: boolean;
|
|
93
|
+
};
|
|
94
|
+
/**
|
|
95
|
+
* Registration configuration
|
|
96
|
+
* Controls user registration/signup behavior and profile fields
|
|
97
|
+
*/
|
|
98
|
+
registration?: {
|
|
99
|
+
enabled?: boolean;
|
|
100
|
+
requireInvitation?: boolean;
|
|
101
|
+
collectProfileFields?: Array<RegistrationCollectProfileField>;
|
|
102
|
+
};
|
|
103
|
+
/**
|
|
104
|
+
* Client configuration customization
|
|
105
|
+
* Allows extending/modifying the client-config endpoint response
|
|
106
|
+
*/
|
|
107
|
+
clientConfig?: {
|
|
108
|
+
/**
|
|
109
|
+
* Factory function to customize the client config response
|
|
110
|
+
* Receives the default config and can modify/return it
|
|
111
|
+
*/
|
|
112
|
+
factory?: (defaultConfig: any, context: { configService: any; tenantService: any }) => Promise<any> | any;
|
|
113
|
+
};
|
|
114
|
+
mfa?: MFAOptions;
|
|
115
|
+
session?: SessionOptions;
|
|
116
|
+
customAuthProviders?: BaseAuthProvider[];
|
|
117
|
+
passwordResetOtpExpiresIn?: number | string; // expressed in seconds or a string describing a time span [zeit/ms](https://github.com/zeit/ms.js). Eg: 60, "2 days", "10h", "7d"
|
|
118
|
+
passwordResetTokenExpiresIn?: number | string; // expressed in seconds or a string describing a time span [zeit/ms](https://github.com/zeit/ms.js). Eg: 60, "2 days", "10h", "7d"
|
|
119
|
+
/**
|
|
120
|
+
* Configure a default tenant for single-tenant applications.
|
|
121
|
+
* When set, tenantId becomes optional in all authentication requests.
|
|
122
|
+
* The default tenant is automatically created on module initialization.
|
|
123
|
+
*
|
|
124
|
+
* Example:
|
|
125
|
+
* ```typescript
|
|
126
|
+
* defaultTenant: {
|
|
127
|
+
* name: 'My App',
|
|
128
|
+
* slug: 'my-app' // lowercase, no spaces, only a-z0-9_-
|
|
129
|
+
* }
|
|
130
|
+
* ```
|
|
131
|
+
*
|
|
132
|
+
* Legacy (deprecated):
|
|
133
|
+
* ```typescript
|
|
134
|
+
* defaultTenant: {
|
|
135
|
+
* name: 'My App',
|
|
136
|
+
* domain: 'myapp' // Still supported but use 'slug' instead
|
|
137
|
+
* }
|
|
138
|
+
* ```
|
|
139
|
+
*/
|
|
140
|
+
defaultTenant?: DefaultTenantOptions;
|
|
141
|
+
/**
|
|
142
|
+
* Embedded admin console configuration.
|
|
143
|
+
* Provides a password-protected dashboard for managing users, roles, tenants, and system settings.
|
|
144
|
+
*
|
|
145
|
+
* The admin console secretKey is also used for admin signup via the /signup endpoint.
|
|
146
|
+
*/
|
|
147
|
+
adminConsole?: AdminConsoleOptions;
|
|
148
|
+
debug?: DebugLogOptions;
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
export interface AdminConsoleOptions {
|
|
152
|
+
/** Enable or disable the embedded admin console (default: true) */
|
|
153
|
+
enabled?: boolean;
|
|
154
|
+
/** Base path where the console is served (default: /auth/admin) */
|
|
155
|
+
basePath?: string;
|
|
156
|
+
/**
|
|
157
|
+
* Nest Auth Admin Console Secret Key used for security operations.
|
|
158
|
+
* This key is used for:
|
|
159
|
+
* - Signing admin dashboard sessions
|
|
160
|
+
* - Admin signup via /signup endpoint
|
|
161
|
+
* - Password reset operations
|
|
162
|
+
*
|
|
163
|
+
* You can set this to any value you prefer:
|
|
164
|
+
* - Hardcode: secretKey: 'your-secret-key-here'
|
|
165
|
+
* - Environment variable: secretKey: process.env.MY_SECRET_KEY (use any variable name)
|
|
166
|
+
*/
|
|
167
|
+
secretKey?: string;
|
|
168
|
+
/** Cookie name for admin dashboard sessions (default: nest_auth_admin) */
|
|
169
|
+
sessionCookieName?: string;
|
|
170
|
+
/** Session duration expressed in seconds or ms string (default: 2h) */
|
|
171
|
+
sessionDuration?: string | number;
|
|
172
|
+
/**
|
|
173
|
+
* @deprecated This option is no longer used. Admin users are created directly without role assignment.
|
|
174
|
+
* Role name for super admin created via /initialize endpoint (default: 'super-admin')
|
|
175
|
+
*/
|
|
176
|
+
superAdminRole?: string;
|
|
177
|
+
/**
|
|
178
|
+
* @deprecated This option is no longer used. The /signup endpoint is always available when secretKey is configured.
|
|
179
|
+
* Whether the /initialize endpoint is enabled for super admin creation (default: true if secretKey is available)
|
|
180
|
+
*/
|
|
181
|
+
initializeEnabled?: boolean;
|
|
182
|
+
/**
|
|
183
|
+
* Cookie options applied to the admin session cookie.
|
|
184
|
+
* httpOnly and sameSite default to true/'lax' respectively.
|
|
185
|
+
*/
|
|
186
|
+
cookie?: CookieOptions;
|
|
187
|
+
/**
|
|
188
|
+
* Allow managing other dashboard admins through the console UI (default: true).
|
|
189
|
+
*/
|
|
190
|
+
allowAdminManagement?: boolean;
|
|
191
|
+
}
|
|
192
|
+
|
|
193
|
+
export interface AuthModuleAsyncOptions {
|
|
194
|
+
isGlobal?: boolean;
|
|
195
|
+
/**
|
|
196
|
+
* Enable automatic token refresh via global interceptor.
|
|
197
|
+
* When enabled, expired access tokens are automatically refreshed using refresh tokens.
|
|
198
|
+
*
|
|
199
|
+
* Default: true (automatic refresh enabled)
|
|
200
|
+
*/
|
|
201
|
+
enableAutoRefresh?: boolean;
|
|
202
|
+
imports?: any[];
|
|
203
|
+
useFactory?: (...args: any[]) => Promise<AuthModuleOptions> | AuthModuleOptions;
|
|
204
|
+
inject?: any[];
|
|
205
|
+
useClass?: Type<AuthModuleOptionsFactory>;
|
|
206
|
+
useExisting?: Type<AuthModuleOptionsFactory>;
|
|
207
|
+
}
|
|
208
|
+
|
|
209
|
+
export interface AuthModuleOptionsFactory {
|
|
210
|
+
createAuthModuleOptions(): Promise<AuthModuleOptions> | AuthModuleOptions;
|
|
211
|
+
}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
|
|
2
|
+
export interface MFAOptions {
|
|
3
|
+
// Whether MFA is enabled for the application
|
|
4
|
+
enabled?: boolean;
|
|
5
|
+
|
|
6
|
+
// Whether MFA is required for all users
|
|
7
|
+
required?: boolean;
|
|
8
|
+
|
|
9
|
+
// Default enabled MFA methods
|
|
10
|
+
methods?: MFAMethodEnum[];
|
|
11
|
+
|
|
12
|
+
// OTP length
|
|
13
|
+
otpLength?: number;
|
|
14
|
+
|
|
15
|
+
// Default TOTP settings
|
|
16
|
+
totp?: {
|
|
17
|
+
issuer: string;
|
|
18
|
+
period: number;
|
|
19
|
+
};
|
|
20
|
+
|
|
21
|
+
// Default SMS settings
|
|
22
|
+
sms?: {
|
|
23
|
+
provider: string;
|
|
24
|
+
template: string;
|
|
25
|
+
};
|
|
26
|
+
|
|
27
|
+
// Default Email settings
|
|
28
|
+
email?: {
|
|
29
|
+
template: string;
|
|
30
|
+
};
|
|
31
|
+
|
|
32
|
+
// Whether users can enable/disable MFA
|
|
33
|
+
allowUserToggle?: boolean;
|
|
34
|
+
|
|
35
|
+
// Whether users can choose their MFA methods
|
|
36
|
+
allowMethodSelection?: boolean;
|
|
37
|
+
|
|
38
|
+
// OTP expiry time
|
|
39
|
+
otpExpiresIn?: string | number;
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
export enum MFAMethodEnum {
|
|
43
|
+
TOTP = 'totp',
|
|
44
|
+
SMS = 'sms',
|
|
45
|
+
EMAIL = 'email',
|
|
46
|
+
}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { CookieOptions as ExpressCookieOptions } from 'express';
|
|
2
|
+
|
|
3
|
+
export enum SessionStorageType {
|
|
4
|
+
REDIS = 'redis',
|
|
5
|
+
DATABASE = 'database',
|
|
6
|
+
MEMORY = 'memory'
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
export interface SessionOptions {
|
|
10
|
+
storageType: SessionStorageType;
|
|
11
|
+
redisUrl?: string;
|
|
12
|
+
sessionExpiry?: number | string; // expressed in seconds or a string describing a time span [zeit/ms](https://github.com/zeit/ms.js). Eg: 60, "2 days", "10h", "7d"
|
|
13
|
+
refreshTokenExpiry?: number | string; // expressed in seconds or a string describing a time span [zeit/ms](https://github.com/zeit/ms.js). Eg: 60, "2 days", "10h", "7d"
|
|
14
|
+
maxSessionsPerUser?: number; // Maximum number of active sessions per user (default: 10)
|
|
15
|
+
slidingExpiration?: boolean; // Whether to extend session on activity (default: true)
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
export type CookieOptions = Omit<ExpressCookieOptions, 'maxAge'>
|
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
import { NestAuthRole } from '../../role/entities/role.entity';
|
|
2
2
|
import { NestAuthUser } from '../../user/entities/user.entity';
|
|
3
|
+
|
|
3
4
|
export interface JWTTokenPayload {
|
|
4
5
|
id?: string;
|
|
5
|
-
sub?: string;
|
|
6
|
+
sub?: string; // user id
|
|
6
7
|
email?: string;
|
|
7
8
|
phone?: string;
|
|
8
9
|
isVerified?: boolean;
|
|
@@ -15,6 +16,7 @@ export interface JWTTokenPayload {
|
|
|
15
16
|
exp?: number;
|
|
16
17
|
iat?: number;
|
|
17
18
|
}
|
|
19
|
+
|
|
18
20
|
export interface SessionPayload {
|
|
19
21
|
id?: string;
|
|
20
22
|
userId?: string;
|
|
@@ -33,6 +35,7 @@ export interface SessionPayload {
|
|
|
33
35
|
createdAt?: Date;
|
|
34
36
|
updatedAt?: Date;
|
|
35
37
|
}
|
|
38
|
+
|
|
36
39
|
export interface TokenGenerationResponse {
|
|
37
40
|
accessToken: string;
|
|
38
41
|
refreshToken: string;
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
import AppleAuth from 'apple-auth';
|
|
2
|
+
import { Injectable, UnauthorizedException } from '@nestjs/common';
|
|
3
|
+
import { DataSource } from 'typeorm';
|
|
4
|
+
import { BaseAuthProvider } from './base-auth.provider';
|
|
5
|
+
import { APPLE_AUTH_PROVIDER } from '../../auth.constants';
|
|
6
|
+
import { NestAuthUser } from '../../user/entities/user.entity';
|
|
7
|
+
import { NestAuthIdentity } from '../../user/entities/identity.entity';
|
|
8
|
+
import { JwtService } from '../services/jwt.service';
|
|
9
|
+
|
|
10
|
+
@Injectable()
|
|
11
|
+
export class AppleAuthProvider extends BaseAuthProvider {
|
|
12
|
+
providerName = APPLE_AUTH_PROVIDER;
|
|
13
|
+
|
|
14
|
+
private appleAuth: AppleAuth;
|
|
15
|
+
|
|
16
|
+
constructor(
|
|
17
|
+
readonly dataSource: DataSource,
|
|
18
|
+
private readonly jwtService: JwtService,
|
|
19
|
+
) {
|
|
20
|
+
const userRepository = dataSource.getRepository(NestAuthUser);
|
|
21
|
+
const authIdentityRepository = dataSource.getRepository(NestAuthIdentity);
|
|
22
|
+
|
|
23
|
+
super(userRepository, authIdentityRepository);
|
|
24
|
+
|
|
25
|
+
const appleConfig = this.options.apple;
|
|
26
|
+
|
|
27
|
+
this.enabled = Boolean(this.options.apple);
|
|
28
|
+
|
|
29
|
+
if (this.enabled) {
|
|
30
|
+
this.appleAuth = new AppleAuth(
|
|
31
|
+
{
|
|
32
|
+
scope: 'email name',
|
|
33
|
+
redirect_uri: appleConfig.redirectUri,
|
|
34
|
+
team_id: appleConfig.teamId,
|
|
35
|
+
key_id: appleConfig.keyId,
|
|
36
|
+
client_id: appleConfig.clientId,
|
|
37
|
+
},
|
|
38
|
+
appleConfig.privateKey,
|
|
39
|
+
appleConfig.privateKeyMethod || 'text',
|
|
40
|
+
);
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
async validate(credentials: { accessToken: string }) {
|
|
45
|
+
try {
|
|
46
|
+
const response = await this.appleAuth.accessToken(credentials.accessToken);
|
|
47
|
+
const user = this.jwtService.decodeToken(response.id_token);
|
|
48
|
+
return {
|
|
49
|
+
userId: user.id,
|
|
50
|
+
email: user.email || '',
|
|
51
|
+
metadata: user,
|
|
52
|
+
};
|
|
53
|
+
} catch (error) {
|
|
54
|
+
throw new UnauthorizedException('Invalid Apple token');
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
getRequiredFields(): string[] {
|
|
59
|
+
return ['accessToken'];
|
|
60
|
+
}
|
|
61
|
+
}
|