Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 0 additions & 1 deletion apps/auth/__init__.py
Original file line number Diff line number Diff line change
@@ -1 +0,0 @@
default_app_config = "apps.auth.apps.OAuthConfig"
43 changes: 43 additions & 0 deletions apps/auth/services/__init__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
from apps.auth.services.flows import (
complete_signup,
initiate_auth,
login_with_password,
reset_password,
verify_callback,
verify_token_pwd,
)
from apps.auth.services.passwords import (
rate_password_strength,
validate_password_strength,
)
from apps.auth.services.questionnaire import (
get_latest_answer,
get_survey_details,
)
from apps.auth.services.tokens import TEMP_TOKEN_TIMEOUT
from apps.auth.services.types import (
AuthIntent,
CallbackVerification,
PasswordVerification,
ServiceError,
)
from apps.auth.services.users import create_user_session

__all__ = [
"AuthIntent",
"CallbackVerification",
"PasswordVerification",
"ServiceError",
"TEMP_TOKEN_TIMEOUT",
"complete_signup",
"create_user_session",
"get_latest_answer",
"get_survey_details",
"initiate_auth",
"login_with_password",
"rate_password_strength",
"reset_password",
"validate_password_strength",
"verify_callback",
"verify_token_pwd",
]
57 changes: 57 additions & 0 deletions apps/auth/services/captcha.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,57 @@
import logging

import httpx

from django.conf import settings

from apps.auth.services.types import ServiceError

logger = logging.getLogger(__name__)

AUTH_SETTINGS = settings.AUTH
OTP_TIMEOUT = AUTH_SETTINGS["OTP_TIMEOUT"]


async def verify_turnstile_token(
turnstile_token,
client_ip,
) -> tuple[bool, ServiceError | None]:
"""Helper function to verify Turnstile token with Cloudflare's API"""

try:
async with httpx.AsyncClient(timeout=OTP_TIMEOUT) as client:
response = await client.post(
"https://challenges.cloudflare.com/turnstile/v0/siteverify",
data={
"secret": settings.TURNSTILE_SECRET_KEY,
"response": turnstile_token,
"remoteip": client_ip,
},
)

response_data = response.json()
if not response_data.get("success"):
logger.warning("Turnstile verification failed: %s", response_data)

return False, ServiceError(
"Turnstile verification failed",
status=403,
)

return True, None

except httpx.TimeoutException:
logger.error("Turnstile verification timed out")

return False, ServiceError(
"Turnstile verification timed out",
status=504,
)

except Exception:
logger.exception("Turnstile verification error")

return False, ServiceError(
"Turnstile verification error",
status=500,
)
Loading
Loading