|
| 1 | +import logging |
| 2 | +import time |
| 3 | +from typing import Any, Optional |
1 | 4 | from urllib.parse import quote |
2 | 5 |
|
| 6 | +import jwt |
3 | 7 | 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, |
4 | 11 | FORWARD_USER_INFO_HEADER_USER_EMAIL, |
5 | 12 | FORWARD_USER_INFO_HEADER_USER_ID, |
6 | 13 | FORWARD_USER_INFO_HEADER_USER_NAME, |
7 | 14 | FORWARD_USER_INFO_HEADER_USER_ROLE, |
8 | 15 | ) |
9 | 16 |
|
| 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 | + ) |
10 | 52 |
|
11 | | -def include_user_info_headers(headers, user): |
12 | 53 | return { |
13 | 54 | **headers, |
14 | 55 | FORWARD_USER_INFO_HEADER_USER_NAME: quote(user.name, safe=' '), |
|
0 commit comments