aboutsummaryrefslogtreecommitdiff
path: root/jb
diff options
context:
space:
mode:
authorMax Nanis2026-09-10 19:47:53 -0700
committerMax Nanis2026-09-10 19:47:53 -0700
commit2759f4cdfd1450cb891dfa806dc93d1101533d96 (patch)
tree380fbde9cded5dfba93886e4478ecb4205c7215a /jb
parented201936813d9a720b51e6cb40a05267b94e7314 (diff)
downloadamt-jb-2759f4cdfd1450cb891dfa806dc93d1101533d96.tar.gz
amt-jb-2759f4cdfd1450cb891dfa806dc93d1101533d96.zip
Simple Magic Link tests (just to use redis_config param)
Diffstat (limited to 'jb')
-rw-r--r--jb/api/magic_token.py39
1 files changed, 30 insertions, 9 deletions
diff --git a/jb/api/magic_token.py b/jb/api/magic_token.py
index 7b6c1aa..910dc12 100644
--- a/jb/api/magic_token.py
+++ b/jb/api/magic_token.py
@@ -2,8 +2,9 @@ import hashlib
import secrets
from fastapi import HTTPException, status
+from generalresearch.redis_helper import RedisConfig
-from jb.decorators import get_redis
+from jb.decorators import get_redis_config
from jb.models.auth import AmtAccountLink
MAGIC_TOKEN_PREFIX = "auth:magic:"
@@ -17,7 +18,7 @@ def redis_token_key(token: str, prefix: str = MAGIC_TOKEN_PREFIX) -> str:
return f"{prefix}{digest}"
-def create_magic_token(user_email: str) -> str:
+def create_magic_token(user_email: str, redis_config: RedisConfig | None = None) -> str:
"""Create a short-lived, single-use token for a user.
The raw token can then be sent by email.
"""
@@ -25,7 +26,12 @@ def create_magic_token(user_email: str) -> str:
raise ValueError("user_email must not be empty")
token = secrets.token_urlsafe(32)
- redis_client = get_redis()
+
+ if redis_config is None:
+ redis_config = get_redis_config()
+
+ redis_client = redis_config.create_redis_client()
+
redis_client.set(
redis_token_key(token),
user_email,
@@ -34,8 +40,12 @@ def create_magic_token(user_email: str) -> str:
return token
-def consume_magic_token(token: str) -> str:
- redis_client = get_redis()
+def consume_magic_token(token: str, redis_config: RedisConfig | None = None) -> str:
+ if redis_config is None:
+ redis_config = get_redis_config()
+
+ redis_client = redis_config.create_redis_client()
+
user_email = redis_client.getdel(redis_token_key(token))
if user_email is None:
raise HTTPException(
@@ -45,9 +55,15 @@ def consume_magic_token(token: str) -> str:
return str(user_email)
-def create_amt_account_link_token(email: str, amt_worker_id: str) -> str:
+def create_amt_account_link_token(
+ email: str, amt_worker_id: str, redis_config: RedisConfig | None = None
+) -> str:
"""Bind an email and AMT worker ID to an opaque, short-lived token."""
- redis_client = get_redis()
+ if redis_config is None:
+ redis_config = get_redis_config()
+
+ redis_client = redis_config.create_redis_client()
+
data = AmtAccountLink(
email=email,
amt_worker_id=amt_worker_id,
@@ -61,9 +77,14 @@ def create_amt_account_link_token(email: str, amt_worker_id: str) -> str:
return token
-def consume_amt_account_link_token(token: str) -> AmtAccountLink:
+def consume_amt_account_link_token(
+ token: str, redis_config: RedisConfig | None = None
+) -> AmtAccountLink:
"""Atomically consume and validate an AMT account-link token."""
- redis_client = get_redis()
+ if redis_config is None:
+ redis_config = get_redis_config()
+ redis_client = redis_config.create_redis_client()
+
raw_data = redis_client.getdel(
redis_token_key(token, AMT_ACCOUNT_LINK_TOKEN_PREFIX)
)