hazo_auth 6.0.0 → 7.0.1
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 +233 -8
- package/SETUP_CHECKLIST.md +240 -0
- package/cli-src/cli/validate.ts +4 -0
- package/cli-src/lib/auth/nextauth_config.ts +101 -1
- package/cli-src/lib/cookies_config.server.ts +1 -0
- package/cli-src/lib/email_verification_config.server.ts +0 -34
- package/cli-src/lib/forgot_password_config.server.ts +0 -34
- package/cli-src/lib/login_config.server.ts +14 -31
- package/cli-src/lib/my_settings_config.server.ts +0 -3
- package/cli-src/lib/oauth_config.server.ts +58 -0
- package/cli-src/lib/otp_config.server.ts +91 -0
- package/cli-src/lib/register_config.server.ts +11 -31
- package/cli-src/lib/reset_password_config.server.ts +0 -31
- package/cli-src/lib/services/email_service.ts +3 -1
- package/cli-src/lib/services/email_template_manifest.ts +17 -0
- package/cli-src/lib/services/email_templates/otp_signin_code.html +13 -0
- package/cli-src/lib/services/email_templates/otp_signin_code.txt +5 -0
- package/cli-src/lib/services/index.ts +8 -2
- package/cli-src/lib/services/oauth_service.ts +197 -0
- package/cli-src/lib/services/otp_service.ts +295 -0
- package/cli-src/lib/services/session_token_service.ts +4 -1
- package/config/hazo_auth_config.example.ini +76 -41
- package/dist/cli/validate.d.ts.map +1 -1
- package/dist/cli/validate.js +4 -0
- package/dist/client.d.ts +2 -0
- package/dist/client.d.ts.map +1 -1
- package/dist/client.js +1 -0
- package/dist/components/layouts/create_firm/index.d.ts +4 -8
- package/dist/components/layouts/create_firm/index.d.ts.map +1 -1
- package/dist/components/layouts/create_firm/index.js +3 -3
- package/dist/components/layouts/email_verification/index.d.ts +4 -5
- package/dist/components/layouts/email_verification/index.d.ts.map +1 -1
- package/dist/components/layouts/email_verification/index.js +4 -4
- package/dist/components/layouts/forgot_password/index.d.ts +4 -5
- package/dist/components/layouts/forgot_password/index.d.ts.map +1 -1
- package/dist/components/layouts/forgot_password/index.js +2 -2
- package/dist/components/layouts/login/index.d.ts +19 -9
- package/dist/components/layouts/login/index.d.ts.map +1 -1
- package/dist/components/layouts/login/index.js +12 -6
- package/dist/components/layouts/otp/index.d.ts +17 -0
- package/dist/components/layouts/otp/index.d.ts.map +1 -0
- package/dist/components/layouts/otp/index.js +16 -0
- package/dist/components/layouts/register/index.d.ts +11 -7
- package/dist/components/layouts/register/index.d.ts.map +1 -1
- package/dist/components/layouts/register/index.js +8 -4
- package/dist/components/layouts/reset_password/index.d.ts +4 -5
- package/dist/components/layouts/reset_password/index.d.ts.map +1 -1
- package/dist/components/layouts/reset_password/index.js +5 -5
- package/dist/components/layouts/shared/components/already_logged_in_guard.d.ts +3 -5
- package/dist/components/layouts/shared/components/already_logged_in_guard.d.ts.map +1 -1
- package/dist/components/layouts/shared/components/already_logged_in_guard.js +2 -2
- package/dist/components/layouts/shared/components/facebook_sign_in_button.d.ts +25 -0
- package/dist/components/layouts/shared/components/facebook_sign_in_button.d.ts.map +1 -0
- package/dist/components/layouts/shared/components/facebook_sign_in_button.js +49 -0
- package/dist/components/layouts/shared/components/sidebar_layout_wrapper.d.ts.map +1 -1
- package/dist/components/layouts/shared/components/sidebar_layout_wrapper.js +8 -3
- package/dist/components/layouts/shared/components/two_column_auth_layout.d.ts +3 -6
- package/dist/components/layouts/shared/components/two_column_auth_layout.d.ts.map +1 -1
- package/dist/components/layouts/shared/components/two_column_auth_layout.js +8 -5
- package/dist/components/otp/OTPRequestForm.d.ts +11 -0
- package/dist/components/otp/OTPRequestForm.d.ts.map +1 -0
- package/dist/components/otp/OTPRequestForm.js +42 -0
- package/dist/components/otp/OTPVerifyForm.d.ts +16 -0
- package/dist/components/otp/OTPVerifyForm.d.ts.map +1 -0
- package/dist/components/otp/OTPVerifyForm.js +75 -0
- package/dist/components/otp/index.d.ts +5 -0
- package/dist/components/otp/index.d.ts.map +1 -0
- package/dist/components/otp/index.js +2 -0
- package/dist/components/ui/input-otp.d.ts +35 -0
- package/dist/components/ui/input-otp.d.ts.map +1 -0
- package/dist/components/ui/input-otp.js +44 -0
- package/dist/consent/consent_state.d.ts +18 -0
- package/dist/consent/consent_state.d.ts.map +1 -0
- package/dist/consent/consent_state.js +29 -0
- package/dist/consent/cookie_consent_banner.d.ts +11 -0
- package/dist/consent/cookie_consent_banner.d.ts.map +1 -0
- package/dist/consent/cookie_consent_banner.js +40 -0
- package/dist/consent/gtm_mapping.d.ts +13 -0
- package/dist/consent/gtm_mapping.d.ts.map +1 -0
- package/dist/consent/gtm_mapping.js +30 -0
- package/dist/consent/index.d.ts +7 -0
- package/dist/consent/index.d.ts.map +1 -0
- package/dist/consent/index.js +7 -0
- package/dist/consent/manage_modal.d.ts +2 -0
- package/dist/consent/manage_modal.d.ts.map +1 -0
- package/dist/consent/manage_modal.js +33 -0
- package/dist/consent/read_consent.d.ts +15 -0
- package/dist/consent/read_consent.d.ts.map +1 -0
- package/dist/consent/read_consent.js +23 -0
- package/dist/consent/use_consent.d.ts +7 -0
- package/dist/consent/use_consent.d.ts.map +1 -0
- package/dist/consent/use_consent.js +55 -0
- package/dist/lib/auth/nextauth_config.d.ts +10 -0
- package/dist/lib/auth/nextauth_config.d.ts.map +1 -1
- package/dist/lib/auth/nextauth_config.js +80 -2
- package/dist/lib/cookies_config.server.d.ts +1 -0
- package/dist/lib/cookies_config.server.d.ts.map +1 -1
- package/dist/lib/cookies_config.server.js +1 -0
- package/dist/lib/email_verification_config.server.d.ts +0 -3
- package/dist/lib/email_verification_config.server.d.ts.map +1 -1
- package/dist/lib/email_verification_config.server.js +0 -15
- package/dist/lib/forgot_password_config.server.d.ts +0 -3
- package/dist/lib/forgot_password_config.server.d.ts.map +1 -1
- package/dist/lib/forgot_password_config.server.js +0 -15
- package/dist/lib/login_config.server.d.ts +6 -3
- package/dist/lib/login_config.server.d.ts.map +1 -1
- package/dist/lib/login_config.server.js +7 -13
- package/dist/lib/my_settings_config.server.d.ts +0 -1
- package/dist/lib/my_settings_config.server.d.ts.map +1 -1
- package/dist/lib/my_settings_config.server.js +0 -2
- package/dist/lib/oauth_config.server.d.ts +17 -0
- package/dist/lib/oauth_config.server.d.ts.map +1 -1
- package/dist/lib/oauth_config.server.js +25 -0
- package/dist/lib/otp_config.server.d.ts +49 -0
- package/dist/lib/otp_config.server.d.ts.map +1 -0
- package/dist/lib/otp_config.server.js +48 -0
- package/dist/lib/register_config.server.d.ts +2 -3
- package/dist/lib/register_config.server.d.ts.map +1 -1
- package/dist/lib/register_config.server.js +4 -13
- package/dist/lib/reset_password_config.server.d.ts +0 -3
- package/dist/lib/reset_password_config.server.d.ts.map +1 -1
- package/dist/lib/reset_password_config.server.js +0 -13
- package/dist/lib/services/email_service.d.ts +1 -1
- package/dist/lib/services/email_service.d.ts.map +1 -1
- package/dist/lib/services/email_service.js +2 -0
- package/dist/lib/services/email_template_manifest.d.ts.map +1 -1
- package/dist/lib/services/email_template_manifest.js +17 -0
- package/dist/lib/services/email_templates/otp_signin_code.html +13 -0
- package/dist/lib/services/email_templates/otp_signin_code.txt +5 -0
- package/dist/lib/services/index.d.ts +2 -0
- package/dist/lib/services/index.d.ts.map +1 -1
- package/dist/lib/services/index.js +1 -0
- package/dist/lib/services/oauth_service.d.ts +24 -0
- package/dist/lib/services/oauth_service.d.ts.map +1 -1
- package/dist/lib/services/oauth_service.js +155 -0
- package/dist/lib/services/otp_service.d.ts +46 -0
- package/dist/lib/services/otp_service.d.ts.map +1 -0
- package/dist/lib/services/otp_service.js +238 -0
- package/dist/lib/services/session_token_service.d.ts +3 -1
- package/dist/lib/services/session_token_service.d.ts.map +1 -1
- package/dist/lib/services/session_token_service.js +4 -2
- package/dist/page_components/create_firm.d.ts +13 -1
- package/dist/page_components/create_firm.d.ts.map +1 -1
- package/dist/page_components/create_firm.js +10 -6
- package/dist/page_components/forgot_password.d.ts +1 -4
- package/dist/page_components/forgot_password.d.ts.map +1 -1
- package/dist/page_components/forgot_password.js +2 -6
- package/dist/page_components/login.d.ts +1 -4
- package/dist/page_components/login.d.ts.map +1 -1
- package/dist/page_components/login.js +2 -6
- package/dist/page_components/otp.d.ts +4 -0
- package/dist/page_components/otp.d.ts.map +1 -0
- package/dist/page_components/otp.js +5 -0
- package/dist/page_components/register.d.ts +1 -4
- package/dist/page_components/register.d.ts.map +1 -1
- package/dist/page_components/register.js +2 -6
- package/dist/page_components/reset_password.d.ts +1 -4
- package/dist/page_components/reset_password.d.ts.map +1 -1
- package/dist/page_components/reset_password.js +2 -6
- package/dist/page_components/verify_email.d.ts +1 -4
- package/dist/page_components/verify_email.d.ts.map +1 -1
- package/dist/page_components/verify_email.js +2 -6
- package/dist/server/routes/index.d.ts +3 -0
- package/dist/server/routes/index.d.ts.map +1 -1
- package/dist/server/routes/index.js +4 -0
- package/dist/server/routes/me.d.ts.map +1 -1
- package/dist/server/routes/me.js +43 -1
- package/dist/server/routes/oauth_facebook_callback.d.ts +8 -0
- package/dist/server/routes/oauth_facebook_callback.d.ts.map +1 -0
- package/dist/server/routes/oauth_facebook_callback.js +157 -0
- package/dist/server/routes/oauth_google_callback.js +1 -1
- package/dist/server/routes/otp/request.d.ts +3 -0
- package/dist/server/routes/otp/request.d.ts.map +1 -0
- package/dist/server/routes/otp/request.js +33 -0
- package/dist/server/routes/otp/verify.d.ts +3 -0
- package/dist/server/routes/otp/verify.d.ts.map +1 -0
- package/dist/server/routes/otp/verify.js +58 -0
- package/dist/server-lib.d.ts +3 -0
- package/dist/server-lib.d.ts.map +1 -1
- package/dist/server-lib.js +2 -0
- package/dist/server_pages/forgot_password.d.ts +13 -17
- package/dist/server_pages/forgot_password.d.ts.map +1 -1
- package/dist/server_pages/forgot_password.js +12 -8
- package/dist/server_pages/forgot_password_client_wrapper.d.ts +7 -6
- package/dist/server_pages/forgot_password_client_wrapper.d.ts.map +1 -1
- package/dist/server_pages/forgot_password_client_wrapper.js +2 -2
- package/dist/server_pages/login.d.ts +22 -21
- package/dist/server_pages/login.d.ts.map +1 -1
- package/dist/server_pages/login.js +15 -19
- package/dist/server_pages/login_client_wrapper.d.ts +10 -6
- package/dist/server_pages/login_client_wrapper.d.ts.map +1 -1
- package/dist/server_pages/login_client_wrapper.js +2 -2
- package/dist/server_pages/my_settings.d.ts +2 -0
- package/dist/server_pages/my_settings.d.ts.map +1 -1
- package/dist/server_pages/my_settings.js +8 -2
- package/dist/server_pages/otp.d.ts +56 -0
- package/dist/server_pages/otp.d.ts.map +1 -0
- package/dist/server_pages/otp.js +45 -0
- package/dist/server_pages/register.d.ts +19 -16
- package/dist/server_pages/register.d.ts.map +1 -1
- package/dist/server_pages/register.js +15 -12
- package/dist/server_pages/register_client_wrapper.d.ts +10 -6
- package/dist/server_pages/register_client_wrapper.d.ts.map +1 -1
- package/dist/server_pages/register_client_wrapper.js +2 -2
- package/dist/server_pages/reset_password.d.ts +11 -16
- package/dist/server_pages/reset_password.d.ts.map +1 -1
- package/dist/server_pages/reset_password.js +11 -9
- package/dist/server_pages/reset_password_client_wrapper.d.ts +7 -6
- package/dist/server_pages/reset_password_client_wrapper.d.ts.map +1 -1
- package/dist/server_pages/reset_password_client_wrapper.js +2 -2
- package/dist/server_pages/verify_email.d.ts +11 -17
- package/dist/server_pages/verify_email.d.ts.map +1 -1
- package/dist/server_pages/verify_email.js +11 -8
- package/dist/server_pages/verify_email_client_wrapper.d.ts +7 -6
- package/dist/server_pages/verify_email_client_wrapper.d.ts.map +1 -1
- package/dist/server_pages/verify_email_client_wrapper.js +2 -2
- package/dist/strings/default_strings.d.ts +47 -0
- package/dist/strings/default_strings.d.ts.map +1 -0
- package/dist/strings/default_strings.js +18 -0
- package/dist/strings/index.d.ts +4 -0
- package/dist/strings/index.d.ts.map +1 -0
- package/dist/strings/index.js +3 -0
- package/dist/strings/strings_context.d.ts +12 -0
- package/dist/strings/strings_context.d.ts.map +1 -0
- package/dist/strings/strings_context.js +23 -0
- package/dist/strings/strings_provider.d.ts +26 -0
- package/dist/strings/strings_provider.d.ts.map +1 -0
- package/dist/strings/strings_provider.js +45 -0
- package/dist/theme/create_theme.d.ts +7 -0
- package/dist/theme/create_theme.d.ts.map +1 -0
- package/dist/theme/create_theme.js +97 -0
- package/dist/theme/hex_to_hsl.d.ts +16 -0
- package/dist/theme/hex_to_hsl.d.ts.map +1 -0
- package/dist/theme/hex_to_hsl.js +110 -0
- package/dist/theme/index.d.ts +4 -0
- package/dist/theme/index.d.ts.map +1 -0
- package/dist/theme/index.js +3 -0
- package/dist/theme/luminance.d.ts +11 -0
- package/dist/theme/luminance.d.ts.map +1 -0
- package/dist/theme/luminance.js +45 -0
- package/dist/theme/theme_provider.d.ts +14 -0
- package/dist/theme/theme_provider.d.ts.map +1 -0
- package/dist/theme/theme_provider.js +23 -0
- package/dist/theme/theme_types.d.ts +36 -0
- package/dist/theme/theme_types.d.ts.map +1 -0
- package/dist/theme/theme_types.js +1 -0
- package/dist/themes/index.d.ts +3 -0
- package/dist/themes/index.d.ts.map +1 -0
- package/dist/themes/index.js +2 -0
- package/dist/themes/preset_indigo_sunset.d.ts +3 -0
- package/dist/themes/preset_indigo_sunset.d.ts.map +1 -0
- package/dist/themes/preset_indigo_sunset.js +20 -0
- package/dist/themes/preset_neutral.d.ts +3 -0
- package/dist/themes/preset_neutral.d.ts.map +1 -0
- package/dist/themes/preset_neutral.js +14 -0
- package/package.json +36 -2
|
@@ -21,10 +21,6 @@ import { useEffect, useState } from "react";
|
|
|
21
21
|
import login_layout from "../components/layouts/login/index.js";
|
|
22
22
|
import { createLayoutDataClient } from "../components/layouts/shared/data/layout_data_client.js";
|
|
23
23
|
import { create_sqlite_hazo_connect } from "../lib/hazo_connect_setup.js";
|
|
24
|
-
// section: constants
|
|
25
|
-
const DEFAULT_IMAGE_SRC = "/hazo_auth/images/login_default.jpg";
|
|
26
|
-
const DEFAULT_IMAGE_ALT = "Illustration of a globe representing secure authentication workflows";
|
|
27
|
-
const DEFAULT_IMAGE_BG = "#f1f5f9";
|
|
28
24
|
// section: component
|
|
29
25
|
/**
|
|
30
26
|
* Zero-config login page component
|
|
@@ -32,7 +28,7 @@ const DEFAULT_IMAGE_BG = "#f1f5f9";
|
|
|
32
28
|
* @param props - Optional configuration overrides
|
|
33
29
|
* @returns Login page component
|
|
34
30
|
*/
|
|
35
|
-
export function LoginPage({ redirectRoute, successMessage = "Successfully logged in", alreadyLoggedInMessage = "You are already logged in", showLogoutButton = true, showReturnHomeButton = false, returnHomeButtonLabel = "Return home", returnHomePath = "/", forgotPasswordPath = "/hazo_auth/forgot_password", forgotPasswordLabel = "Forgot password?", createAccountPath = "/hazo_auth/register", createAccountLabel = "Create account", urlOnLogon,
|
|
31
|
+
export function LoginPage({ redirectRoute, successMessage = "Successfully logged in", alreadyLoggedInMessage = "You are already logged in", showLogoutButton = true, showReturnHomeButton = false, returnHomeButtonLabel = "Return home", returnHomePath = "/", forgotPasswordPath = "/hazo_auth/forgot_password", forgotPasswordLabel = "Forgot password?", createAccountPath = "/hazo_auth/register", createAccountLabel = "Create account", urlOnLogon, } = {}) {
|
|
36
32
|
const [dataClient, setDataClient] = useState(null);
|
|
37
33
|
useEffect(() => {
|
|
38
34
|
// Initialize hazo_connect on client side
|
|
@@ -45,6 +41,6 @@ export function LoginPage({ redirectRoute, successMessage = "Successfully logged
|
|
|
45
41
|
return (_jsx("div", { className: "cls_login_page_loading flex items-center justify-center min-h-screen", children: _jsx("div", { className: "text-slate-600 animate-pulse", children: "Loading..." }) }));
|
|
46
42
|
}
|
|
47
43
|
const LoginLayout = login_layout;
|
|
48
|
-
return (_jsx(LoginLayout, {
|
|
44
|
+
return (_jsx(LoginLayout, { data_client: dataClient, redirectRoute: redirectRoute, successMessage: successMessage, alreadyLoggedInMessage: alreadyLoggedInMessage, showLogoutButton: showLogoutButton, showReturnHomeButton: showReturnHomeButton, returnHomeButtonLabel: returnHomeButtonLabel, returnHomePath: returnHomePath, forgot_password_path: forgotPasswordPath, forgot_password_label: forgotPasswordLabel, create_account_path: createAccountPath, create_account_label: createAccountLabel, urlOnLogon: urlOnLogon }));
|
|
49
45
|
}
|
|
50
46
|
export default LoginPage;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"otp.d.ts","sourceRoot":"","sources":["../../src/page_components/otp.tsx"],"names":[],"mappings":"AAEA,OAAO,aAAa,CAAC;AAGrB,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;AACvD,YAAY,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC"}
|
|
@@ -10,9 +10,6 @@ export type RegisterPageProps = {
|
|
|
10
10
|
signInPath?: string;
|
|
11
11
|
signInLabel?: string;
|
|
12
12
|
urlOnLogon?: string;
|
|
13
|
-
imageSrc?: string;
|
|
14
|
-
imageAlt?: string;
|
|
15
|
-
imageBackgroundColor?: string;
|
|
16
13
|
};
|
|
17
14
|
/**
|
|
18
15
|
* Zero-config register page component
|
|
@@ -20,6 +17,6 @@ export type RegisterPageProps = {
|
|
|
20
17
|
* @param props - Optional configuration overrides
|
|
21
18
|
* @returns Register page component
|
|
22
19
|
*/
|
|
23
|
-
export declare function RegisterPage({ showNameField, passwordRequirements, alreadyLoggedInMessage, showLogoutButton, showReturnHomeButton, returnHomeButtonLabel, returnHomePath, signInPath, signInLabel, urlOnLogon,
|
|
20
|
+
export declare function RegisterPage({ showNameField, passwordRequirements, alreadyLoggedInMessage, showLogoutButton, showReturnHomeButton, returnHomeButtonLabel, returnHomePath, signInPath, signInLabel, urlOnLogon, }?: RegisterPageProps): import("react/jsx-runtime").JSX.Element;
|
|
24
21
|
export default RegisterPage;
|
|
25
22
|
//# sourceMappingURL=register.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"register.d.ts","sourceRoot":"","sources":["../../src/page_components/register.tsx"],"names":[],"mappings":"AAwBA,OAAO,KAAK,EAAE,4BAA4B,EAAE,MAAM,0DAA0D,CAAC;
|
|
1
|
+
{"version":3,"file":"register.d.ts","sourceRoot":"","sources":["../../src/page_components/register.tsx"],"names":[],"mappings":"AAwBA,OAAO,KAAK,EAAE,4BAA4B,EAAE,MAAM,0DAA0D,CAAC;AAW7G,MAAM,MAAM,iBAAiB,GAAG;IAC9B,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,oBAAoB,CAAC,EAAE,4BAA4B,CAAC;IACpD,sBAAsB,CAAC,EAAE,MAAM,CAAC;IAChC,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,oBAAoB,CAAC,EAAE,OAAO,CAAC;IAC/B,qBAAqB,CAAC,EAAE,MAAM,CAAC;IAC/B,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB,CAAC;AAGF;;;;;GAKG;AACH,wBAAgB,YAAY,CAAC,EAC3B,aAAoB,EACpB,oBAAoD,EACpD,sBAAoD,EACpD,gBAAuB,EACvB,oBAA4B,EAC5B,qBAAqC,EACrC,cAAoB,EACpB,UAA+B,EAC/B,WAAuB,EACvB,UAAU,GACX,GAAE,iBAAsB,2CAqCxB;AAED,eAAe,YAAY,CAAC"}
|
|
@@ -21,10 +21,6 @@ import { useEffect, useState } from "react";
|
|
|
21
21
|
import register_layout from "../components/layouts/register/index.js";
|
|
22
22
|
import { createLayoutDataClient } from "../components/layouts/shared/data/layout_data_client.js";
|
|
23
23
|
import { create_sqlite_hazo_connect } from "../lib/hazo_connect_setup.js";
|
|
24
|
-
// section: constants
|
|
25
|
-
const DEFAULT_IMAGE_SRC = "/hazo_auth/images/register_default.jpg";
|
|
26
|
-
const DEFAULT_IMAGE_ALT = "Illustration of a globe representing secure authentication workflows";
|
|
27
|
-
const DEFAULT_IMAGE_BG = "#e2e8f0";
|
|
28
24
|
const DEFAULT_PASSWORD_REQUIREMENTS = {
|
|
29
25
|
minimum_length: 8,
|
|
30
26
|
require_uppercase: true,
|
|
@@ -39,7 +35,7 @@ const DEFAULT_PASSWORD_REQUIREMENTS = {
|
|
|
39
35
|
* @param props - Optional configuration overrides
|
|
40
36
|
* @returns Register page component
|
|
41
37
|
*/
|
|
42
|
-
export function RegisterPage({ showNameField = true, passwordRequirements = DEFAULT_PASSWORD_REQUIREMENTS, alreadyLoggedInMessage = "You are already logged in", showLogoutButton = true, showReturnHomeButton = false, returnHomeButtonLabel = "Return home", returnHomePath = "/", signInPath = "/hazo_auth/login", signInLabel = "Sign in", urlOnLogon,
|
|
38
|
+
export function RegisterPage({ showNameField = true, passwordRequirements = DEFAULT_PASSWORD_REQUIREMENTS, alreadyLoggedInMessage = "You are already logged in", showLogoutButton = true, showReturnHomeButton = false, returnHomeButtonLabel = "Return home", returnHomePath = "/", signInPath = "/hazo_auth/login", signInLabel = "Sign in", urlOnLogon, } = {}) {
|
|
43
39
|
const [dataClient, setDataClient] = useState(null);
|
|
44
40
|
useEffect(() => {
|
|
45
41
|
// Initialize hazo_connect on client side
|
|
@@ -52,6 +48,6 @@ export function RegisterPage({ showNameField = true, passwordRequirements = DEFA
|
|
|
52
48
|
return (_jsx("div", { className: "cls_register_page_loading flex items-center justify-center min-h-screen", children: _jsx("div", { className: "text-slate-600 animate-pulse", children: "Loading..." }) }));
|
|
53
49
|
}
|
|
54
50
|
const RegisterLayout = register_layout;
|
|
55
|
-
return (_jsx(RegisterLayout, {
|
|
51
|
+
return (_jsx(RegisterLayout, { password_requirements: passwordRequirements, show_name_field: showNameField, data_client: dataClient, alreadyLoggedInMessage: alreadyLoggedInMessage, showLogoutButton: showLogoutButton, showReturnHomeButton: showReturnHomeButton, returnHomeButtonLabel: returnHomeButtonLabel, returnHomePath: returnHomePath, signInPath: signInPath, signInLabel: signInLabel, urlOnLogon: urlOnLogon }));
|
|
56
52
|
}
|
|
57
53
|
export default RegisterPage;
|
|
@@ -10,9 +10,6 @@ export type ResetPasswordPageProps = {
|
|
|
10
10
|
showReturnHomeButton?: boolean;
|
|
11
11
|
returnHomeButtonLabel?: string;
|
|
12
12
|
returnHomePath?: string;
|
|
13
|
-
imageSrc?: string;
|
|
14
|
-
imageAlt?: string;
|
|
15
|
-
imageBackgroundColor?: string;
|
|
16
13
|
};
|
|
17
14
|
/**
|
|
18
15
|
* Zero-config reset password page component
|
|
@@ -20,6 +17,6 @@ export type ResetPasswordPageProps = {
|
|
|
20
17
|
* @param props - Optional configuration overrides
|
|
21
18
|
* @returns Reset password page component
|
|
22
19
|
*/
|
|
23
|
-
export declare function ResetPasswordPage({ errorMessage, successMessage, loginPath, forgotPasswordPath, passwordRequirements, alreadyLoggedInMessage, showLogoutButton, showReturnHomeButton, returnHomeButtonLabel, returnHomePath,
|
|
20
|
+
export declare function ResetPasswordPage({ errorMessage, successMessage, loginPath, forgotPasswordPath, passwordRequirements, alreadyLoggedInMessage, showLogoutButton, showReturnHomeButton, returnHomeButtonLabel, returnHomePath, }?: ResetPasswordPageProps): import("react/jsx-runtime").JSX.Element;
|
|
24
21
|
export default ResetPasswordPage;
|
|
25
22
|
//# sourceMappingURL=reset_password.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"reset_password.d.ts","sourceRoot":"","sources":["../../src/page_components/reset_password.tsx"],"names":[],"mappings":"AAwBA,OAAO,KAAK,EAAE,4BAA4B,EAAE,MAAM,0DAA0D,CAAC;
|
|
1
|
+
{"version":3,"file":"reset_password.d.ts","sourceRoot":"","sources":["../../src/page_components/reset_password.tsx"],"names":[],"mappings":"AAwBA,OAAO,KAAK,EAAE,4BAA4B,EAAE,MAAM,0DAA0D,CAAC;AAW7G,MAAM,MAAM,sBAAsB,GAAG;IACnC,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,oBAAoB,CAAC,EAAE,4BAA4B,CAAC;IACpD,sBAAsB,CAAC,EAAE,MAAM,CAAC;IAChC,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,oBAAoB,CAAC,EAAE,OAAO,CAAC;IAC/B,qBAAqB,CAAC,EAAE,MAAM,CAAC;IAC/B,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB,CAAC;AAGF;;;;;GAKG;AACH,wBAAgB,iBAAiB,CAAC,EAChC,YAAmE,EACnE,cAAwF,EACxF,SAA8B,EAC9B,kBAAiD,EACjD,oBAAoD,EACpD,sBAAoD,EACpD,gBAAuB,EACvB,oBAA4B,EAC5B,qBAAqC,EACrC,cAAoB,GACrB,GAAE,sBAA2B,2CAmC7B;AAED,eAAe,iBAAiB,CAAC"}
|
|
@@ -21,10 +21,6 @@ import { useEffect, useState } from "react";
|
|
|
21
21
|
import reset_password_layout from "../components/layouts/reset_password/index.js";
|
|
22
22
|
import { createLayoutDataClient } from "../components/layouts/shared/data/layout_data_client.js";
|
|
23
23
|
import { create_sqlite_hazo_connect } from "../lib/hazo_connect_setup.js";
|
|
24
|
-
// section: constants
|
|
25
|
-
const DEFAULT_IMAGE_SRC = "/hazo_auth/images/reset_password_default.jpg";
|
|
26
|
-
const DEFAULT_IMAGE_ALT = "Illustration of a globe representing secure authentication workflows";
|
|
27
|
-
const DEFAULT_IMAGE_BG = "#f1f5f9";
|
|
28
24
|
const DEFAULT_PASSWORD_REQUIREMENTS = {
|
|
29
25
|
minimum_length: 8,
|
|
30
26
|
require_uppercase: true,
|
|
@@ -39,7 +35,7 @@ const DEFAULT_PASSWORD_REQUIREMENTS = {
|
|
|
39
35
|
* @param props - Optional configuration overrides
|
|
40
36
|
* @returns Reset password page component
|
|
41
37
|
*/
|
|
42
|
-
export function ResetPasswordPage({ errorMessage = "Your password reset link has expired or is invalid", successMessage = "Password reset successful! You can now log in with your new password.", loginPath = "/hazo_auth/login", forgotPasswordPath = "/hazo_auth/forgot_password", passwordRequirements = DEFAULT_PASSWORD_REQUIREMENTS, alreadyLoggedInMessage = "You are already logged in", showLogoutButton = true, showReturnHomeButton = false, returnHomeButtonLabel = "Return home", returnHomePath = "/",
|
|
38
|
+
export function ResetPasswordPage({ errorMessage = "Your password reset link has expired or is invalid", successMessage = "Password reset successful! You can now log in with your new password.", loginPath = "/hazo_auth/login", forgotPasswordPath = "/hazo_auth/forgot_password", passwordRequirements = DEFAULT_PASSWORD_REQUIREMENTS, alreadyLoggedInMessage = "You are already logged in", showLogoutButton = true, showReturnHomeButton = false, returnHomeButtonLabel = "Return home", returnHomePath = "/", } = {}) {
|
|
43
39
|
const [dataClient, setDataClient] = useState(null);
|
|
44
40
|
useEffect(() => {
|
|
45
41
|
// Initialize hazo_connect on client side
|
|
@@ -52,6 +48,6 @@ export function ResetPasswordPage({ errorMessage = "Your password reset link has
|
|
|
52
48
|
return (_jsx("div", { className: "cls_reset_password_page_loading flex items-center justify-center min-h-screen", children: _jsx("div", { className: "text-slate-600 animate-pulse", children: "Loading..." }) }));
|
|
53
49
|
}
|
|
54
50
|
const ResetPasswordLayout = reset_password_layout;
|
|
55
|
-
return (_jsx(ResetPasswordLayout, {
|
|
51
|
+
return (_jsx(ResetPasswordLayout, { data_client: dataClient, errorMessage: errorMessage, successMessage: successMessage, password_requirements: passwordRequirements, alreadyLoggedInMessage: alreadyLoggedInMessage, showLogoutButton: showLogoutButton, showReturnHomeButton: showReturnHomeButton, returnHomeButtonLabel: returnHomeButtonLabel, returnHomePath: returnHomePath }));
|
|
56
52
|
}
|
|
57
53
|
export default ResetPasswordPage;
|
|
@@ -6,9 +6,6 @@ export type VerifyEmailPageProps = {
|
|
|
6
6
|
returnHomePath?: string;
|
|
7
7
|
redirectDelay?: number;
|
|
8
8
|
loginPath?: string;
|
|
9
|
-
imageSrc?: string;
|
|
10
|
-
imageAlt?: string;
|
|
11
|
-
imageBackgroundColor?: string;
|
|
12
9
|
};
|
|
13
10
|
/**
|
|
14
11
|
* Zero-config verify email page component
|
|
@@ -16,6 +13,6 @@ export type VerifyEmailPageProps = {
|
|
|
16
13
|
* @param props - Optional configuration overrides
|
|
17
14
|
* @returns Verify email page component
|
|
18
15
|
*/
|
|
19
|
-
export declare function VerifyEmailPage({ alreadyLoggedInMessage, showLogoutButton, showReturnHomeButton, returnHomeButtonLabel, returnHomePath, redirectDelay, loginPath,
|
|
16
|
+
export declare function VerifyEmailPage({ alreadyLoggedInMessage, showLogoutButton, showReturnHomeButton, returnHomeButtonLabel, returnHomePath, redirectDelay, loginPath, }?: VerifyEmailPageProps): import("react/jsx-runtime").JSX.Element;
|
|
20
17
|
export default VerifyEmailPage;
|
|
21
18
|
//# sourceMappingURL=verify_email.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"verify_email.d.ts","sourceRoot":"","sources":["../../src/page_components/verify_email.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"verify_email.d.ts","sourceRoot":"","sources":["../../src/page_components/verify_email.tsx"],"names":[],"mappings":"AA0BA,MAAM,MAAM,oBAAoB,GAAG;IACjC,sBAAsB,CAAC,EAAE,MAAM,CAAC;IAChC,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,oBAAoB,CAAC,EAAE,OAAO,CAAC;IAC/B,qBAAqB,CAAC,EAAE,MAAM,CAAC;IAC/B,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,CAAC;AAGF;;;;;GAKG;AACH,wBAAgB,eAAe,CAAC,EAC9B,sBAAoD,EACpD,gBAAuB,EACvB,oBAA4B,EAC5B,qBAAqC,EACrC,cAAoB,EACpB,aAAoB,EACpB,SAA8B,GAC/B,GAAE,oBAAyB,2CAkC3B;AAED,eAAe,eAAe,CAAC"}
|
|
@@ -21,10 +21,6 @@ import { useEffect, useState } from "react";
|
|
|
21
21
|
import email_verification_layout from "../components/layouts/email_verification/index.js";
|
|
22
22
|
import { createLayoutDataClient } from "../components/layouts/shared/data/layout_data_client.js";
|
|
23
23
|
import { create_sqlite_hazo_connect } from "../lib/hazo_connect_setup.js";
|
|
24
|
-
// section: constants
|
|
25
|
-
const DEFAULT_IMAGE_SRC = "/hazo_auth/images/verify_email_default.jpg";
|
|
26
|
-
const DEFAULT_IMAGE_ALT = "Illustration of a globe representing secure authentication workflows";
|
|
27
|
-
const DEFAULT_IMAGE_BG = "#f1f5f9";
|
|
28
24
|
// section: component
|
|
29
25
|
/**
|
|
30
26
|
* Zero-config verify email page component
|
|
@@ -32,7 +28,7 @@ const DEFAULT_IMAGE_BG = "#f1f5f9";
|
|
|
32
28
|
* @param props - Optional configuration overrides
|
|
33
29
|
* @returns Verify email page component
|
|
34
30
|
*/
|
|
35
|
-
export function VerifyEmailPage({ alreadyLoggedInMessage = "You are already logged in", showLogoutButton = true, showReturnHomeButton = false, returnHomeButtonLabel = "Return home", returnHomePath = "/", redirectDelay = 3000, loginPath = "/hazo_auth/login",
|
|
31
|
+
export function VerifyEmailPage({ alreadyLoggedInMessage = "You are already logged in", showLogoutButton = true, showReturnHomeButton = false, returnHomeButtonLabel = "Return home", returnHomePath = "/", redirectDelay = 3000, loginPath = "/hazo_auth/login", } = {}) {
|
|
36
32
|
const [dataClient, setDataClient] = useState(null);
|
|
37
33
|
useEffect(() => {
|
|
38
34
|
// Initialize hazo_connect on client side
|
|
@@ -45,6 +41,6 @@ export function VerifyEmailPage({ alreadyLoggedInMessage = "You are already logg
|
|
|
45
41
|
return (_jsx("div", { className: "cls_verify_email_page_loading flex items-center justify-center min-h-screen", children: _jsx("div", { className: "text-slate-600 animate-pulse", children: "Loading..." }) }));
|
|
46
42
|
}
|
|
47
43
|
const EmailVerificationLayout = email_verification_layout;
|
|
48
|
-
return (_jsx(EmailVerificationLayout, {
|
|
44
|
+
return (_jsx(EmailVerificationLayout, { data_client: dataClient, already_logged_in_message: alreadyLoggedInMessage, showLogoutButton: showLogoutButton, showReturnHomeButton: showReturnHomeButton, returnHomeButtonLabel: returnHomeButtonLabel, returnHomePath: returnHomePath, redirect_delay: redirectDelay, login_path: loginPath }));
|
|
49
45
|
}
|
|
50
46
|
export default VerifyEmailPage;
|
|
@@ -8,6 +8,8 @@ export { POST as changePasswordPOST } from "./change_password.js";
|
|
|
8
8
|
export { GET as validateResetTokenGET } from "./validate_reset_token.js";
|
|
9
9
|
export { GET as verifyEmailGET } from "./verify_email.js";
|
|
10
10
|
export { POST as resendVerificationPOST } from "./resend_verification.js";
|
|
11
|
+
export { otpRequestPOST } from "./otp/request.js";
|
|
12
|
+
export { otpVerifyPOST } from "./otp/verify.js";
|
|
11
13
|
export { PATCH as updateUserPATCH } from "./update_user.js";
|
|
12
14
|
export { POST as uploadProfilePicturePOST } from "./upload_profile_picture.js";
|
|
13
15
|
export { DELETE as removeProfilePictureDELETE } from "./remove_profile_picture.js";
|
|
@@ -26,6 +28,7 @@ export { GET as invitationsGET, POST as invitationsPOST, PATCH as invitationsPAT
|
|
|
26
28
|
export { POST as createFirmPOST } from "./create_firm.js";
|
|
27
29
|
export { GET as nextauthGET, POST as nextauthPOST } from "./nextauth.js";
|
|
28
30
|
export { GET as oauthGoogleCallbackGET } from "./oauth_google_callback.js";
|
|
31
|
+
export { facebookCallbackGET } from "./oauth_facebook_callback.js";
|
|
29
32
|
export { POST as setPasswordPOST } from "./set_password.js";
|
|
30
33
|
export { GET as relationshipsGET, POST as relationshipsPOST, PATCH as relationshipsPATCH, DELETE as relationshipsDELETE } from "./relationships.js";
|
|
31
34
|
export { POST as relationshipSelfPOST } from "./relationship_self.js";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/server/routes/index.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/server/routes/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -13,6 +13,9 @@ export { GET as validateResetTokenGET } from "./validate_reset_token.js";
|
|
|
13
13
|
// Email verification routes
|
|
14
14
|
export { GET as verifyEmailGET } from "./verify_email.js";
|
|
15
15
|
export { POST as resendVerificationPOST } from "./resend_verification.js";
|
|
16
|
+
// OTP routes (one-time password via email)
|
|
17
|
+
export { otpRequestPOST } from "./otp/request.js";
|
|
18
|
+
export { otpVerifyPOST } from "./otp/verify.js";
|
|
16
19
|
// User profile routes
|
|
17
20
|
export { PATCH as updateUserPATCH } from "./update_user.js";
|
|
18
21
|
export { POST as uploadProfilePicturePOST } from "./upload_profile_picture.js";
|
|
@@ -38,6 +41,7 @@ export { POST as createFirmPOST } from "./create_firm.js";
|
|
|
38
41
|
// OAuth routes
|
|
39
42
|
export { GET as nextauthGET, POST as nextauthPOST } from "./nextauth.js";
|
|
40
43
|
export { GET as oauthGoogleCallbackGET } from "./oauth_google_callback.js";
|
|
44
|
+
export { facebookCallbackGET } from "./oauth_facebook_callback.js";
|
|
41
45
|
export { POST as setPasswordPOST } from "./set_password.js";
|
|
42
46
|
// Relationship routes (managed sub-profiles)
|
|
43
47
|
export { GET as relationshipsGET, POST as relationshipsPOST, PATCH as relationshipsPATCH, DELETE as relationshipsDELETE } from "./relationships.js";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"me.d.ts","sourceRoot":"","sources":["../../../src/server/routes/me.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"me.d.ts","sourceRoot":"","sources":["../../../src/server/routes/me.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AA+BxD;;;;;GAKG;AACH,wBAAsB,GAAG,CAAC,OAAO,EAAE,WAAW;;IAqJ7C"}
|
package/dist/server/routes/me.js
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
// file_description: API route handler to get current authenticated user information with permissions
|
|
2
2
|
// section: imports
|
|
3
3
|
import { NextResponse } from "next/server";
|
|
4
|
+
import { jwtVerify } from "jose";
|
|
4
5
|
import { hazo_get_auth } from "../../lib/auth/hazo_get_auth.server.js";
|
|
5
6
|
import { get_hazo_connect_instance } from "../../lib/hazo_connect_instance.server.js";
|
|
6
7
|
import { createCrudService } from "hazo_connect/server";
|
|
@@ -8,6 +9,9 @@ import { map_db_source_to_ui } from "../../lib/services/profile_picture_source_m
|
|
|
8
9
|
import { create_app_logger } from "../../lib/app_logger.js";
|
|
9
10
|
import { get_filename, get_line_number } from "../../lib/utils/api_route_helpers.js";
|
|
10
11
|
import { is_user_types_enabled, get_user_type_by_key, } from "../../lib/user_types_config.server.js";
|
|
12
|
+
import { get_cookie_name, get_cookie_options, BASE_COOKIE_NAMES, } from "../../lib/cookies_config.server.js";
|
|
13
|
+
import { create_session_token } from "../../lib/services/session_token_service.js";
|
|
14
|
+
import { get_otp_config, hazo_auth_otp_session_ttl_seconds, } from "../../lib/otp_config.server.js";
|
|
11
15
|
// section: helpers
|
|
12
16
|
function strip_sentinel_email(email) {
|
|
13
17
|
if (!email)
|
|
@@ -24,6 +28,7 @@ function strip_sentinel_email(email) {
|
|
|
24
28
|
* Always returns the same format to prevent downstream variations.
|
|
25
29
|
*/
|
|
26
30
|
export async function GET(request) {
|
|
31
|
+
var _a, _b, _c, _d, _e, _f;
|
|
27
32
|
const logger = create_app_logger();
|
|
28
33
|
try {
|
|
29
34
|
// Use hazo_get_auth to get user with permissions
|
|
@@ -70,7 +75,7 @@ export async function GET(request) {
|
|
|
70
75
|
}
|
|
71
76
|
// Return unified format with all fields
|
|
72
77
|
const profile_pic = auth_result.user.profile_picture_url;
|
|
73
|
-
|
|
78
|
+
const response = NextResponse.json({
|
|
74
79
|
authenticated: true,
|
|
75
80
|
// Top-level fields for backward compatibility
|
|
76
81
|
user_id: auth_result.user.id,
|
|
@@ -100,6 +105,43 @@ export async function GET(request) {
|
|
|
100
105
|
permission_ok: auth_result.permission_ok,
|
|
101
106
|
missing_permissions: auth_result.missing_permissions,
|
|
102
107
|
}, { status: 200 });
|
|
108
|
+
// --- OTP sliding-session hook ---
|
|
109
|
+
const session_kind = (_a = request.cookies.get(get_cookie_name(BASE_COOKIE_NAMES.SESSION_KIND))) === null || _a === void 0 ? void 0 : _a.value;
|
|
110
|
+
if (session_kind === "otp") {
|
|
111
|
+
try {
|
|
112
|
+
const session_cookie = (_b = request.cookies.get(get_cookie_name(BASE_COOKIE_NAMES.SESSION))) === null || _b === void 0 ? void 0 : _b.value;
|
|
113
|
+
if (session_cookie) {
|
|
114
|
+
const secret = new TextEncoder().encode((_c = process.env.JWT_SECRET) !== null && _c !== void 0 ? _c : "");
|
|
115
|
+
const { payload } = await jwtVerify(session_cookie, secret);
|
|
116
|
+
const exp = Number((_d = payload.exp) !== null && _d !== void 0 ? _d : 0);
|
|
117
|
+
const now_seconds = Math.floor(Date.now() / 1000);
|
|
118
|
+
const otp_cfg = get_otp_config();
|
|
119
|
+
const seconds_until_exp = exp - now_seconds;
|
|
120
|
+
if (seconds_until_exp > 0 && seconds_until_exp < otp_cfg.slide_when_within_seconds) {
|
|
121
|
+
const ttl_seconds = hazo_auth_otp_session_ttl_seconds();
|
|
122
|
+
const user_id = String((_e = payload.user_id) !== null && _e !== void 0 ? _e : "");
|
|
123
|
+
const user_email = String((_f = payload.email) !== null && _f !== void 0 ? _f : "");
|
|
124
|
+
const new_token = await create_session_token(user_id, user_email, undefined, ttl_seconds);
|
|
125
|
+
const cookie_options = get_cookie_options({
|
|
126
|
+
httpOnly: true,
|
|
127
|
+
secure: process.env.NODE_ENV === "production",
|
|
128
|
+
sameSite: "lax",
|
|
129
|
+
path: "/",
|
|
130
|
+
maxAge: ttl_seconds,
|
|
131
|
+
});
|
|
132
|
+
response.cookies.set(get_cookie_name(BASE_COOKIE_NAMES.SESSION), new_token, cookie_options);
|
|
133
|
+
response.cookies.set(get_cookie_name(BASE_COOKIE_NAMES.USER_ID), user_id, cookie_options);
|
|
134
|
+
response.cookies.set(get_cookie_name(BASE_COOKIE_NAMES.USER_EMAIL), user_email, cookie_options);
|
|
135
|
+
response.cookies.set(get_cookie_name(BASE_COOKIE_NAMES.SESSION_KIND), "otp", cookie_options);
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
catch (slide_err) {
|
|
140
|
+
// Slide is best-effort — never break /me for this
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
// --- end OTP sliding-session hook ---
|
|
144
|
+
return response;
|
|
103
145
|
}
|
|
104
146
|
catch (error) {
|
|
105
147
|
const error_message = error instanceof Error ? error.message : "Unknown error";
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { NextRequest, NextResponse } from "next/server";
|
|
2
|
+
/**
|
|
3
|
+
* Handles the OAuth callback after Facebook sign-in
|
|
4
|
+
* The user creation/linking is done in NextAuth signIn callback
|
|
5
|
+
* This route just sets the hazo_auth session cookies
|
|
6
|
+
*/
|
|
7
|
+
export declare function facebookCallbackGET(original_request: NextRequest): Promise<NextResponse<unknown>>;
|
|
8
|
+
//# sourceMappingURL=oauth_facebook_callback.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"oauth_facebook_callback.d.ts","sourceRoot":"","sources":["../../../src/server/routes/oauth_facebook_callback.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAuBxD;;;;GAIG;AACH,wBAAsB,mBAAmB,CAAC,gBAAgB,EAAE,WAAW,kCAoKtE"}
|
|
@@ -0,0 +1,157 @@
|
|
|
1
|
+
// file_description: Custom OAuth callback handler that creates hazo_auth session after Facebook sign-in
|
|
2
|
+
// section: imports
|
|
3
|
+
import { NextResponse } from "next/server";
|
|
4
|
+
import { getToken } from "next-auth/jwt";
|
|
5
|
+
import { create_app_logger } from "../../lib/app_logger.js";
|
|
6
|
+
import { create_session_token } from "../../lib/services/session_token_service.js";
|
|
7
|
+
import { get_filename, get_line_number } from "../../lib/utils/api_route_helpers.js";
|
|
8
|
+
import { get_login_config } from "../../lib/login_config.server.js";
|
|
9
|
+
import { get_cookie_name, get_cookie_options, BASE_COOKIE_NAMES } from "../../lib/cookies_config.server.js";
|
|
10
|
+
import { get_hazo_connect_instance } from "../../lib/hazo_connect_instance.server.js";
|
|
11
|
+
import { get_post_login_redirect } from "../../lib/services/post_verification_service.js";
|
|
12
|
+
import { get_oauth_config } from "../../lib/oauth_config.server.js";
|
|
13
|
+
import { rewrite_request_for_proxy } from "../../lib/utils/proxy_request.js";
|
|
14
|
+
// section: api_handler
|
|
15
|
+
/**
|
|
16
|
+
* Handles the OAuth callback after Facebook sign-in
|
|
17
|
+
* The user creation/linking is done in NextAuth signIn callback
|
|
18
|
+
* This route just sets the hazo_auth session cookies
|
|
19
|
+
*/
|
|
20
|
+
export async function facebookCallbackGET(original_request) {
|
|
21
|
+
// Rewrite request.url to public origin when behind a reverse proxy.
|
|
22
|
+
const request = rewrite_request_for_proxy(original_request);
|
|
23
|
+
const logger = create_app_logger();
|
|
24
|
+
// Detect if request came through HTTPS proxy (Cloudflare tunnel, etc.)
|
|
25
|
+
const is_secure = original_request.headers.get("x-forwarded-proto") === "https" ||
|
|
26
|
+
request.url.startsWith("https://");
|
|
27
|
+
// Resolve the configured sign-in page up-front so early error redirects
|
|
28
|
+
// honour [hazo_auth__oauth] sign_in_page just like the success path.
|
|
29
|
+
const sign_in_page = get_oauth_config().sign_in_page;
|
|
30
|
+
try {
|
|
31
|
+
// Get the NextAuth token from the session
|
|
32
|
+
const token = (await getToken({
|
|
33
|
+
req: request,
|
|
34
|
+
secureCookie: is_secure,
|
|
35
|
+
}));
|
|
36
|
+
logger.debug("facebook_callback_token_received", {
|
|
37
|
+
filename: get_filename(),
|
|
38
|
+
line_number: get_line_number(),
|
|
39
|
+
has_token: !!token,
|
|
40
|
+
has_email: !!(token === null || token === void 0 ? void 0 : token.email),
|
|
41
|
+
has_hazo_user_id: !!(token === null || token === void 0 ? void 0 : token.hazo_user_id),
|
|
42
|
+
});
|
|
43
|
+
if (!token) {
|
|
44
|
+
logger.warn("facebook_callback_no_token", {
|
|
45
|
+
filename: get_filename(),
|
|
46
|
+
line_number: get_line_number(),
|
|
47
|
+
note: "No NextAuth token found - user may not have completed Facebook sign-in",
|
|
48
|
+
});
|
|
49
|
+
const login_url = new URL(sign_in_page, request.url);
|
|
50
|
+
login_url.searchParams.set("error", "oauth_failed");
|
|
51
|
+
return NextResponse.redirect(login_url.toString());
|
|
52
|
+
}
|
|
53
|
+
// Validate we have the required data
|
|
54
|
+
if (!token.email || !token.hazo_user_id) {
|
|
55
|
+
logger.warn("facebook_callback_missing_data", {
|
|
56
|
+
filename: get_filename(),
|
|
57
|
+
line_number: get_line_number(),
|
|
58
|
+
has_email: !!token.email,
|
|
59
|
+
has_hazo_user_id: !!token.hazo_user_id,
|
|
60
|
+
});
|
|
61
|
+
const login_url = new URL(sign_in_page, request.url);
|
|
62
|
+
login_url.searchParams.set("error", "oauth_incomplete");
|
|
63
|
+
return NextResponse.redirect(login_url.toString());
|
|
64
|
+
}
|
|
65
|
+
const user_id = token.hazo_user_id;
|
|
66
|
+
const email = token.email;
|
|
67
|
+
logger.debug("facebook_callback_success", {
|
|
68
|
+
filename: get_filename(),
|
|
69
|
+
line_number: get_line_number(),
|
|
70
|
+
user_id,
|
|
71
|
+
email,
|
|
72
|
+
});
|
|
73
|
+
// Get redirect URL based on user's scope/invitation status
|
|
74
|
+
const loginConfig = get_login_config();
|
|
75
|
+
const oauthConfig = get_oauth_config();
|
|
76
|
+
// Per-request override: same `?next=` pattern as Google callback.
|
|
77
|
+
const raw_next = request.nextUrl.searchParams.get("next");
|
|
78
|
+
const safe_next = raw_next &&
|
|
79
|
+
raw_next.startsWith("/") &&
|
|
80
|
+
!raw_next.startsWith("//") &&
|
|
81
|
+
!/^[a-z][a-z0-9+.\-]*:/i.test(raw_next)
|
|
82
|
+
? raw_next
|
|
83
|
+
: null;
|
|
84
|
+
// Check if user needs onboarding
|
|
85
|
+
const hazoConnect = get_hazo_connect_instance();
|
|
86
|
+
const { redirect_url: determined_redirect, needs_onboarding, invitation_check_skipped, invitation_table_error, } = await get_post_login_redirect(hazoConnect, user_id, email, {
|
|
87
|
+
default_redirect: safe_next || oauthConfig.default_redirect || loginConfig.redirectRoute || "/",
|
|
88
|
+
create_firm_url: oauthConfig.create_firm_url,
|
|
89
|
+
skip_invitation_check: oauthConfig.skip_invitation_check,
|
|
90
|
+
no_scope_redirect: safe_next || oauthConfig.no_scope_redirect,
|
|
91
|
+
});
|
|
92
|
+
// Log warning if invitation table is missing
|
|
93
|
+
if (invitation_table_error) {
|
|
94
|
+
logger.warn("invitation_table_missing", {
|
|
95
|
+
filename: get_filename(),
|
|
96
|
+
line_number: get_line_number(),
|
|
97
|
+
user_id,
|
|
98
|
+
email,
|
|
99
|
+
note: "hazo_invitations table does not exist - run migration or set skip_invitation_check=true in [hazo_auth__oauth]",
|
|
100
|
+
});
|
|
101
|
+
}
|
|
102
|
+
logger.debug("facebook_callback_post_login_redirect", {
|
|
103
|
+
filename: get_filename(),
|
|
104
|
+
line_number: get_line_number(),
|
|
105
|
+
user_id,
|
|
106
|
+
email,
|
|
107
|
+
redirect_url: determined_redirect,
|
|
108
|
+
needs_onboarding,
|
|
109
|
+
invitation_check_skipped,
|
|
110
|
+
invitation_table_error,
|
|
111
|
+
});
|
|
112
|
+
// Create redirect response
|
|
113
|
+
const redirect_url = new URL(determined_redirect, request.url);
|
|
114
|
+
const response = NextResponse.redirect(redirect_url.toString());
|
|
115
|
+
// Set authentication cookies
|
|
116
|
+
const base_cookie_options = {
|
|
117
|
+
httpOnly: true,
|
|
118
|
+
secure: process.env.NODE_ENV === "production" || is_secure,
|
|
119
|
+
sameSite: "lax",
|
|
120
|
+
path: "/",
|
|
121
|
+
maxAge: 60 * 60 * 24 * 30, // 30 days
|
|
122
|
+
};
|
|
123
|
+
const cookie_options = get_cookie_options(base_cookie_options);
|
|
124
|
+
response.cookies.set(get_cookie_name(BASE_COOKIE_NAMES.USER_ID), user_id, cookie_options);
|
|
125
|
+
response.cookies.set(get_cookie_name(BASE_COOKIE_NAMES.USER_EMAIL), email, cookie_options);
|
|
126
|
+
// Create and set JWT session token
|
|
127
|
+
try {
|
|
128
|
+
const session_token = await create_session_token(user_id, email);
|
|
129
|
+
response.cookies.set(get_cookie_name(BASE_COOKIE_NAMES.SESSION), session_token, cookie_options);
|
|
130
|
+
}
|
|
131
|
+
catch (token_error) {
|
|
132
|
+
const token_error_message = token_error instanceof Error ? token_error.message : "Unknown error";
|
|
133
|
+
logger.warn("facebook_callback_session_token_creation_failed", {
|
|
134
|
+
filename: get_filename(),
|
|
135
|
+
line_number: get_line_number(),
|
|
136
|
+
user_id,
|
|
137
|
+
email,
|
|
138
|
+
error: token_error_message,
|
|
139
|
+
note: "OAuth login succeeded but session token creation failed - using legacy cookies",
|
|
140
|
+
});
|
|
141
|
+
}
|
|
142
|
+
return response;
|
|
143
|
+
}
|
|
144
|
+
catch (error) {
|
|
145
|
+
const error_message = error instanceof Error ? error.message : "Unknown error";
|
|
146
|
+
const error_stack = error instanceof Error ? error.stack : undefined;
|
|
147
|
+
logger.error("facebook_callback_error", {
|
|
148
|
+
filename: get_filename(),
|
|
149
|
+
line_number: get_line_number(),
|
|
150
|
+
error_message,
|
|
151
|
+
error_stack,
|
|
152
|
+
});
|
|
153
|
+
const login_url = new URL(sign_in_page, request.url);
|
|
154
|
+
login_url.searchParams.set("error", "oauth_error");
|
|
155
|
+
return NextResponse.redirect(login_url.toString());
|
|
156
|
+
}
|
|
157
|
+
}
|
|
@@ -172,7 +172,7 @@ export async function GET(original_request) {
|
|
|
172
172
|
error_message,
|
|
173
173
|
error_stack,
|
|
174
174
|
});
|
|
175
|
-
const login_url = new URL(
|
|
175
|
+
const login_url = new URL(sign_in_page, request.url);
|
|
176
176
|
login_url.searchParams.set("error", "oauth_error");
|
|
177
177
|
return NextResponse.redirect(login_url.toString());
|
|
178
178
|
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"request.d.ts","sourceRoot":"","sources":["../../../../src/server/routes/otp/request.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAYxD,wBAAsB,cAAc,CAAC,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,YAAY,CAAC,CAsBhF"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
// file_description: API route handler for OTP request (sends OTP email to user)
|
|
2
|
+
// section: imports
|
|
3
|
+
import { NextResponse } from "next/server";
|
|
4
|
+
import { z } from "zod";
|
|
5
|
+
import { request_email_otp } from "../../../lib/services/otp_service.js";
|
|
6
|
+
import { get_client_ip } from "../../../lib/auth/hazo_get_auth.server.js";
|
|
7
|
+
import { create_app_logger } from "../../../lib/app_logger.js";
|
|
8
|
+
// section: validation
|
|
9
|
+
const RequestSchema = z.object({
|
|
10
|
+
email: z.string().email().max(254),
|
|
11
|
+
});
|
|
12
|
+
// section: api_handler
|
|
13
|
+
export async function otpRequestPOST(request) {
|
|
14
|
+
const logger = create_app_logger();
|
|
15
|
+
try {
|
|
16
|
+
const body_raw = await request.json().catch(() => ({}));
|
|
17
|
+
const parsed = RequestSchema.safeParse(body_raw);
|
|
18
|
+
if (!parsed.success) {
|
|
19
|
+
return NextResponse.json({ ok: false, error: "invalid_email" }, { status: 400 });
|
|
20
|
+
}
|
|
21
|
+
const ip = get_client_ip(request);
|
|
22
|
+
const result = await request_email_otp({ email: parsed.data.email, ip });
|
|
23
|
+
if (result.ok === false && result.error === "rate_limited") {
|
|
24
|
+
return NextResponse.json(result, { status: 429 });
|
|
25
|
+
}
|
|
26
|
+
return NextResponse.json({ ok: true }, { status: 200 });
|
|
27
|
+
}
|
|
28
|
+
catch (err) {
|
|
29
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
30
|
+
logger.error("otp_request_route_error", { error: msg });
|
|
31
|
+
return NextResponse.json({ ok: false, error: "server_error" }, { status: 500 });
|
|
32
|
+
}
|
|
33
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"verify.d.ts","sourceRoot":"","sources":["../../../../src/server/routes/otp/verify.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAmBxD,wBAAsB,aAAa,CAAC,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,YAAY,CAAC,CAmD/E"}
|