This minimal client shows how to:
- Check auth state and retrieve a CSRF token
- Build a login URL for manual redirection (useful in non-browser contexts)
- Send CSRF-protected requests
- Refresh the session
- Log out
Sessions use HttpOnly cookies, persisted by
requests.Session().
fromtypingimportOptional, Dict, Anyfromurllib.parseimporturlencodeimportrequestsclassAuthClient:
def__init__(self, base_url: str="http://localhost:8000"):
self.base_url=base_url.rstrip("/")
self.session=requests.Session()
self.csrf_token: Optional[str] =Nonedefme(self) ->Dict[str, Any]:
r=self.session.get(f"{self.base_url}/auth/web/me")
r.raise_for_status()
data=r.json()
self.csrf_token=data.get("csrf_token")
returndatadeflogin_url(self, provider: str="default", return_to: Optional[str] =None) ->str:
params= {}
ifprovider!="default":
params["provider"] =providerifreturn_to:
params["return_to"] =return_to# relative path recommendedqs=f"?{urlencode(params)}"ifparamselse""returnf"{self.base_url}/auth/web/login{qs}"defrequest(self, path: str, method: str="GET", **kwargs) ->requests.Response:
ifmethod.upper() in {"POST", "PUT", "PATCH", "DELETE"}:
ifnotself.csrf_token:
self.me()
headers=kwargs.get("headers", {})
ifself.csrf_token:
headers["X-CSRF-Token"] =self.csrf_tokenheaders.setdefault("Origin", self.base_url)
kwargs["headers"] =headersreturnself.session.request(method, f"{self.base_url}{path}", **kwargs)
defrefresh(self) ->bool:
r=self.request("/auth/web/refresh", method="POST")
ifr.ok:
data=r.json()
self.csrf_token=data.get("csrf_token", self.csrf_token)
returnTruereturnFalsedeflogout(self) ->bool:
r=self.request("/auth/web/logout", method="POST")
ifnotr.ok:
returnFalseself.csrf_token=None# Optionally inspect r.json().get("provider_logout_url")returnTrueclient=AuthClient()
state=client.me()
ifnotstate.get("authenticated"):
print("Open this URL in a browser:", client.login_url("default", "/dashboard"))
else:
r=client.request("/api/v1/protected", method="POST", json={"hello": "world"})
print(r.status_code, r.text)