Skip to content

Commit 589b0d2

Browse files
authored
[resotolib][fix] Compare origin to host in cookie based JWT auth (#1306)
1 parent a8ae7c3 commit 589b0d2

File tree

1 file changed

+10
-1
lines changed
  • resotolib/resotolib/asynchronous/web

1 file changed

+10
-1
lines changed

resotolib/resotolib/asynchronous/web/auth.py

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
from contextvars import ContextVar
44
from re import RegexFlag
55
from typing import Any, Dict, Optional, Set
6+
from urllib.parse import urlparse
67

78
from aiohttp import web
89
from aiohttp.web import Request, StreamResponse
@@ -38,10 +39,18 @@ def always_allowed(request: Request) -> bool:
3839

3940
@middleware
4041
async def valid_jwt_handler(request: Request, handler: RequestHandler) -> StreamResponse:
41-
auth_header = request.headers.get("authorization") or request.cookies.get("resoto_authorization")
42+
auth_header = request.headers.get("Authorization") or request.cookies.get("resoto_authorization")
4243
if always_allowed(request):
4344
return await handler(request)
4445
elif auth_header:
46+
origin: Optional[str] = urlparse(request.headers.get("Origin")).hostname
47+
host: Optional[str] = request.headers.get("Host")
48+
if host is not None and origin is not None:
49+
if ":" in host:
50+
host = host.split(":")[0]
51+
if origin.lower() != host.lower():
52+
log.warning(f"Origin {origin} is not allowed in request from {request.remote} to {request.path}")
53+
raise web.HTTPForbidden()
4554
try:
4655
# note: the expiration is already checked by this function
4756
jwt = ck_jwt.decode_jwt_from_header_value(auth_header, psk)

0 commit comments

Comments
 (0)