Spaces:
Running
Running
sync: 167 file da Baida98/AI@10cc1cf7 (2026-08-22 08:20 UTC) (#53)
Browse files- sync: 167 file da Baida98/AI@10cc1cf7 (2026-08-22 08:20 UTC) (e169361ac7aea85fe2f6b7e0a2891ee384c66f6c)
- api/auth_guard.py +8 -4
api/auth_guard.py
CHANGED
|
@@ -201,6 +201,7 @@ def _get_token(env_var: str) -> str:
|
|
| 201 |
|
| 202 |
async def _resolve_role(
|
| 203 |
x_internal_token: Optional[str] = Header(None, alias="X-Internal-Token"),
|
|
|
|
| 204 |
x_operator_token: Optional[str] = Header(None, alias="X-Operator-Token"),
|
| 205 |
x_admin_token: Optional[str] = Header(None, alias="X-Admin-Token"),
|
| 206 |
) -> AuthRole:
|
|
@@ -218,9 +219,11 @@ async def _resolve_role(
|
|
| 218 |
logger.debug("auth: OPERATOR role granted")
|
| 219 |
return AuthRole.OPERATOR
|
| 220 |
|
| 221 |
-
# MACHINE
|
| 222 |
-
|
| 223 |
-
|
|
|
|
|
|
|
| 224 |
logger.debug("auth: MACHINE role granted")
|
| 225 |
return AuthRole.MACHINE
|
| 226 |
|
|
@@ -280,7 +283,8 @@ def require_role(min_role: AuthRole):
|
|
| 280 |
_token_hdr = (
|
| 281 |
request.headers.get('X-Admin-Token') or
|
| 282 |
request.headers.get('X-Operator-Token') or
|
| 283 |
-
request.headers.get('X-Internal-Token')
|
|
|
|
| 284 |
)
|
| 285 |
# GAP-AUTH-FIX: estrai IP reale (Railway/HF dietro proxy → X-Forwarded-For)
|
| 286 |
_client_ip: str | None = (
|
|
|
|
| 201 |
|
| 202 |
async def _resolve_role(
|
| 203 |
x_internal_token: Optional[str] = Header(None, alias="X-Internal-Token"),
|
| 204 |
+
x_machine_token: Optional[str] = Header(None, alias="X-Machine-Token"),
|
| 205 |
x_operator_token: Optional[str] = Header(None, alias="X-Operator-Token"),
|
| 206 |
x_admin_token: Optional[str] = Header(None, alias="X-Admin-Token"),
|
| 207 |
) -> AuthRole:
|
|
|
|
| 219 |
logger.debug("auth: OPERATOR role granted")
|
| 220 |
return AuthRole.OPERATOR
|
| 221 |
|
| 222 |
+
# MACHINE: supporta entrambi gli header per compatibilità tra runner e backend.
|
| 223 |
+
# Il valore resta confrontato esclusivamente con il secret server-side.
|
| 224 |
+
int_tok = _get_token("INTERNAL_TOKEN") or _get_token("MACHINE_TOKEN")
|
| 225 |
+
machine_header = x_internal_token or x_machine_token
|
| 226 |
+
if int_tok and machine_header and _sec_comp.compare_digest(machine_header, int_tok):
|
| 227 |
logger.debug("auth: MACHINE role granted")
|
| 228 |
return AuthRole.MACHINE
|
| 229 |
|
|
|
|
| 283 |
_token_hdr = (
|
| 284 |
request.headers.get('X-Admin-Token') or
|
| 285 |
request.headers.get('X-Operator-Token') or
|
| 286 |
+
request.headers.get('X-Internal-Token') or
|
| 287 |
+
request.headers.get('X-Machine-Token')
|
| 288 |
)
|
| 289 |
# GAP-AUTH-FIX: estrai IP reale (Railway/HF dietro proxy → X-Forwarded-For)
|
| 290 |
_client_ip: str | None = (
|