|
19 | 19 | ### Third-party packages ### |
20 | 20 | from itsdangerous import BadData, SignatureExpired, URLSafeTimedSerializer |
21 | 21 | from pydantic import create_model |
22 | | -from starlette.datastructures import Headers |
| 22 | +from starlette.datastructures import Headers, UploadFile |
23 | 23 | from starlette.requests import Request |
24 | 24 | from starlette.responses import Response |
25 | 25 |
|
@@ -174,7 +174,15 @@ async def validate_csrf( |
174 | 174 | time_limit = time_limit or self._max_age |
175 | 175 | token: Optional[str] = self.get_csrf_from_headers(request.headers) |
176 | 176 | if not token: |
177 | | - token = self.get_csrf_from_body(await request.body()) |
| 177 | + if hasattr(request, "_json") and request._json is not None: |
| 178 | + token = request._json.get(self._token_key, "") |
| 179 | + elif hasattr(request, "_form") and request._form is not None: |
| 180 | + form_data: Union[None, UploadFile, str] = request._form.get(self._token_key) |
| 181 | + if not form_data or isinstance(form_data, UploadFile): |
| 182 | + raise MissingTokenError("Form data must be of type string") |
| 183 | + token = form_data |
| 184 | + else: |
| 185 | + token = self.get_csrf_from_body(await request.body()) |
178 | 186 | serializer = URLSafeTimedSerializer(secret_key, salt="fastapi-csrf-token") |
179 | 187 | try: |
180 | 188 | signature: str = serializer.loads(signed_token, max_age=time_limit) |
|
0 commit comments