Skip to content

Commit 10435b2

Browse files
committed
http-api: T8989: address Copilot review comments
- Remove fallback 'oidc-client' identity - tokens without sub/client_id are now rejected - Suppress OIDC validation error details from stdout - Cache discovered JWKS URI back to session to avoid per-request discovery - token_op now accepts X-API-Key header alongside form field - Reset REST/OIDC session attributes on SIGHUP reload to prevent stale config persisting after nodes are removed
1 parent f9df658 commit 10435b2

3 files changed

Lines changed: 12 additions & 5 deletions

File tree

src/services/api/rest/libs/token_auth.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,7 @@ def verify_oidc_token(token: str):
4646
disc_url = f"{state.oidc_issuer}/.well-known/openid-configuration"
4747
with _req.urlopen(disc_url, timeout=10) as r:
4848
jwks_uri = _json.loads(r.read())["jwks_uri"]
49+
state.oidc_jwks_uri = jwks_uri
4950
jwks_client = PyJWKClient(jwks_uri, cache_keys=True)
5051
signing_key = jwks_client.get_signing_key_from_jwt(token)
5152
decode_options = {"require": ["exp"]}
@@ -60,9 +61,8 @@ def verify_oidc_token(token: str):
6061
else:
6162
decode_options["verify_aud"] = False
6263
payload = jwt.decode(token, signing_key.key, **decode_kwargs)
63-
return payload.get("sub") or payload.get("client_id") or "oidc-client"
64-
except Exception as e:
65-
print(f"OIDC token validation failed: {e}", flush=True)
64+
return payload.get("sub") or payload.get("client_id")
65+
except Exception:
6666
return None
6767

6868

src/services/api/rest/routers.py

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1047,9 +1047,10 @@ def traceroute_op(data: TracerouteModel):
10471047

10481048

10491049
@router.post('/token')
1050-
def token_op(data: ApiModel):
1050+
def token_op(data: ApiModel, x_api_key: Optional[str] = Header(None)):
10511051
session = SessionState()
1052-
key_id = check_auth(session.keys, data.key)
1052+
key = data.key or x_api_key
1053+
key_id = check_auth(session.keys, key)
10531054
if not key_id:
10541055
raise HTTPException(status_code=401, detail='Valid API key is required')
10551056
return success(generate_token(key_id))

src/services/vyos-http-api-server

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -182,6 +182,12 @@ def initialization(session: SessionState, app: FastAPI = app):
182182
session.keys = flatten_keys(server_config)
183183

184184
rest_config = server_config.get('rest', {})
185+
# Reset REST auth settings on reload so removed config nodes don't persist in-memory
186+
session.rest_token_exp = None
187+
session.rest_secret_len = None
188+
session.oidc_issuer = None
189+
session.oidc_jwks_uri = None
190+
session.oidc_audience = None
185191
session.debug = bool('debug' in rest_config)
186192
session.strict = bool('strict' in rest_config)
187193
if isinstance(rest_config, dict):

0 commit comments

Comments
 (0)