Skip to content

Commit eebbc48

Browse files
tjbckjmleksan
andcommitted
refac
Co-Authored-By: Jacob Leksan <63938553+jmleksan@users.noreply.github.com>
1 parent cff51f0 commit eebbc48

2 files changed

Lines changed: 53 additions & 1 deletion

File tree

backend/open_webui/env.py

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -813,6 +813,17 @@ def parse_section(section):
813813
FORWARD_SESSION_INFO_HEADER_MESSAGE_ID = os.getenv('FORWARD_SESSION_INFO_HEADER_MESSAGE_ID', 'X-OpenWebUI-Message-Id')
814814
FORWARD_SESSION_INFO_HEADER_CHAT_ID = os.getenv('FORWARD_SESSION_INFO_HEADER_CHAT_ID', 'X-OpenWebUI-Chat-Id')
815815

816+
# If set while ENABLE_FORWARD_USER_INFO_HEADERS is True, send one signed HS256 JWT
817+
# (FORWARD_USER_INFO_HEADER_JWT) instead of separate X-OpenWebUI-User-* headers.
818+
FORWARD_USER_INFO_HEADER_JWT_SECRET = (os.environ.get('FORWARD_USER_INFO_HEADER_JWT_SECRET') or '').strip() or None
819+
FORWARD_USER_INFO_HEADER_JWT = os.environ.get('FORWARD_USER_INFO_HEADER_JWT', 'X-OpenWebUI-User-Jwt')
820+
try:
821+
FORWARD_USER_INFO_HEADER_JWT_EXPIRES_SECONDS = int(
822+
os.environ.get('FORWARD_USER_INFO_HEADER_JWT_EXPIRES_SECONDS', '300')
823+
)
824+
except ValueError:
825+
FORWARD_USER_INFO_HEADER_JWT_EXPIRES_SECONDS = 300
826+
816827
####################################
817828
# Progressive Web App
818829
####################################

backend/open_webui/utils/headers.py

Lines changed: 42 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,55 @@
1+
import logging
2+
import time
3+
from typing import Any, Optional
14
from urllib.parse import quote
25

6+
import jwt
37
from open_webui.env import (
8+
FORWARD_USER_INFO_HEADER_JWT,
9+
FORWARD_USER_INFO_HEADER_JWT_EXPIRES_SECONDS,
10+
FORWARD_USER_INFO_HEADER_JWT_SECRET,
411
FORWARD_USER_INFO_HEADER_USER_EMAIL,
512
FORWARD_USER_INFO_HEADER_USER_ID,
613
FORWARD_USER_INFO_HEADER_USER_NAME,
714
FORWARD_USER_INFO_HEADER_USER_ROLE,
815
)
916

17+
log = logging.getLogger(__name__)
18+
19+
20+
def _mint_forward_user_jwt(user: Any) -> str:
21+
now = int(time.time())
22+
payload = {
23+
'sub': str(user.id),
24+
'email': str(user.email),
25+
'name': str(user.name),
26+
'role': str(user.role),
27+
'iss': 'open-webui',
28+
'iat': now,
29+
'exp': now + FORWARD_USER_INFO_HEADER_JWT_EXPIRES_SECONDS,
30+
}
31+
return jwt.encode(payload, FORWARD_USER_INFO_HEADER_JWT_SECRET, algorithm='HS256')
32+
33+
34+
def include_user_info_headers(headers: dict, user: Optional[Any] = None) -> dict:
35+
"""
36+
Forward user identity to external backends: signed JWT in
37+
FORWARD_USER_INFO_HEADER_JWT if FORWARD_USER_INFO_HEADER_JWT_SECRET is set;
38+
otherwise the legacy X-OpenWebUI-User-* headers.
39+
"""
40+
if user is None:
41+
return headers
42+
43+
if FORWARD_USER_INFO_HEADER_JWT_SECRET:
44+
try:
45+
token = _mint_forward_user_jwt(user)
46+
return {**headers, FORWARD_USER_INFO_HEADER_JWT: token}
47+
except Exception:
48+
log.exception(
49+
'Failed to mint %s; falling back to plain user-info headers.',
50+
FORWARD_USER_INFO_HEADER_JWT,
51+
)
1052

11-
def include_user_info_headers(headers, user):
1253
return {
1354
**headers,
1455
FORWARD_USER_INFO_HEADER_USER_NAME: quote(user.name, safe=' '),

0 commit comments

Comments
 (0)