feat: implement local authentication mode and update related components
This commit is contained in:
@@ -21,6 +21,9 @@ class _FakeSession:
|
||||
async def test_get_auth_context_raises_401_when_clerk_signed_out(
|
||||
monkeypatch: pytest.MonkeyPatch,
|
||||
) -> None:
|
||||
monkeypatch.setattr(auth.settings, "auth_mode", "clerk")
|
||||
monkeypatch.setattr(auth.settings, "clerk_secret_key", "sk_test_dummy")
|
||||
|
||||
from clerk_backend_api.security.types import AuthStatus, RequestState
|
||||
|
||||
async def _fake_authenticate(_request: Any) -> RequestState:
|
||||
@@ -42,6 +45,9 @@ async def test_get_auth_context_raises_401_when_clerk_signed_out(
|
||||
async def test_get_auth_context_uses_request_state_payload_claims(
|
||||
monkeypatch: pytest.MonkeyPatch,
|
||||
) -> None:
|
||||
monkeypatch.setattr(auth.settings, "auth_mode", "clerk")
|
||||
monkeypatch.setattr(auth.settings, "clerk_secret_key", "sk_test_dummy")
|
||||
|
||||
from clerk_backend_api.security.types import AuthStatus, RequestState
|
||||
|
||||
async def _fake_authenticate(_request: Any) -> RequestState:
|
||||
@@ -82,6 +88,9 @@ async def test_get_auth_context_uses_request_state_payload_claims(
|
||||
async def test_get_auth_context_optional_returns_none_for_agent_token(
|
||||
monkeypatch: pytest.MonkeyPatch,
|
||||
) -> None:
|
||||
monkeypatch.setattr(auth.settings, "auth_mode", "clerk")
|
||||
monkeypatch.setattr(auth.settings, "clerk_secret_key", "sk_test_dummy")
|
||||
|
||||
async def _boom(_request: Any) -> Any: # pragma: no cover
|
||||
raise AssertionError("_authenticate_clerk_request should not be called")
|
||||
|
||||
@@ -93,3 +102,46 @@ async def test_get_auth_context_optional_returns_none_for_agent_token(
|
||||
session=_FakeSession(), # type: ignore[arg-type]
|
||||
)
|
||||
assert out is None
|
||||
|
||||
|
||||
@pytest.mark.asyncio
|
||||
async def test_get_auth_context_local_mode_requires_valid_bearer_token(
|
||||
monkeypatch: pytest.MonkeyPatch,
|
||||
) -> None:
|
||||
monkeypatch.setattr(auth.settings, "auth_mode", "local")
|
||||
monkeypatch.setattr(auth.settings, "local_auth_token", "expected-token")
|
||||
|
||||
async def _fake_local_user(_session: Any) -> User:
|
||||
return User(clerk_user_id="local-auth-user", email="local@localhost", name="Local User")
|
||||
|
||||
monkeypatch.setattr(auth, "_get_or_create_local_user", _fake_local_user)
|
||||
|
||||
ctx = await auth.get_auth_context( # type: ignore[arg-type]
|
||||
request=SimpleNamespace(headers={"Authorization": "Bearer expected-token"}),
|
||||
credentials=None,
|
||||
session=_FakeSession(), # type: ignore[arg-type]
|
||||
)
|
||||
|
||||
assert ctx.actor_type == "user"
|
||||
assert ctx.user is not None
|
||||
assert ctx.user.clerk_user_id == "local-auth-user"
|
||||
|
||||
|
||||
@pytest.mark.asyncio
|
||||
async def test_get_auth_context_optional_local_mode_returns_none_without_token(
|
||||
monkeypatch: pytest.MonkeyPatch,
|
||||
) -> None:
|
||||
monkeypatch.setattr(auth.settings, "auth_mode", "local")
|
||||
monkeypatch.setattr(auth.settings, "local_auth_token", "expected-token")
|
||||
|
||||
async def _boom(_session: Any) -> User: # pragma: no cover
|
||||
raise AssertionError("_get_or_create_local_user should not be called")
|
||||
|
||||
monkeypatch.setattr(auth, "_get_or_create_local_user", _boom)
|
||||
|
||||
out = await auth.get_auth_context_optional( # type: ignore[arg-type]
|
||||
request=SimpleNamespace(headers={}),
|
||||
credentials=None,
|
||||
session=_FakeSession(), # type: ignore[arg-type]
|
||||
)
|
||||
assert out is None
|
||||
|
||||
Reference in New Issue
Block a user