mirror of
https://github.com/Sea-Haven-Industries/procurement-ingest.git
synced 2026-10-07 16:08:54 +00:00
Log Secrets Manager failures in web UI auth token fetch
The web UI auth gate correctly fails closed when the shared token cannot be read, but _get_auth_token() swallowed every exception silently. A Secrets Manager permission or config error then made every request 401 with no operational signal, leaving an outage indistinguishable from ordinary unauthenticated traffic. Add a module-level logger to both web_ui handlers and log the fetch failure with logger.exception() in the except block before returning None. Behavior is unchanged (still fails closed); the failure is now visible in CloudWatch. The secret value is never logged. The two handlers stay byte-consistent in the mirrored _get_auth_token() region. The companion finding on the CDK import of the shared procurement-ingest/web-ui-auth-token secret was evaluated and left as-is: the token is a single secret shared by both the PO and WO stacks, so from_secret_name_v2 (which scopes grant_read via the standard 6-char suffix wildcard) is correct; making it a CDK-managed Secret in both stacks would collide the two stacks on the same explicit secret name at deploy time. Refs: INFRA-74
This commit is contained in:
parent
2802d04368
commit
2c2cfcc538
2 changed files with 24 additions and 0 deletions
|
|
@ -7,6 +7,7 @@ Accessed via Lambda Function URL.
|
|||
|
||||
import hmac
|
||||
import json
|
||||
import logging
|
||||
import os
|
||||
import time
|
||||
from decimal import Decimal
|
||||
|
|
@ -14,6 +15,9 @@ from html import escape as esc
|
|||
|
||||
import boto3
|
||||
|
||||
logger = logging.getLogger()
|
||||
logger.setLevel(logging.INFO)
|
||||
|
||||
dynamodb = boto3.resource("dynamodb")
|
||||
|
||||
PO_TABLE = os.environ.get("PO_TABLE", "purchase-orders")
|
||||
|
|
@ -58,6 +62,14 @@ def _get_auth_token() -> str | None:
|
|||
_auth_token_cached_at = now
|
||||
return _auth_token_cache
|
||||
except Exception:
|
||||
# Fail closed (return None -> caller 401s) but surface the failure: a
|
||||
# Secrets Manager permission/config error would otherwise make every
|
||||
# request 401 with no operational signal. The secret value is never
|
||||
# logged.
|
||||
logger.exception(
|
||||
"Failed to fetch web UI auth token from Secrets Manager; "
|
||||
"denying request (failing closed)"
|
||||
)
|
||||
return None
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -7,12 +7,16 @@ Accessed via Lambda Function URL.
|
|||
|
||||
import hmac
|
||||
import json
|
||||
import logging
|
||||
import os
|
||||
import time
|
||||
from html import escape as esc
|
||||
|
||||
import boto3
|
||||
|
||||
logger = logging.getLogger()
|
||||
logger.setLevel(logging.INFO)
|
||||
|
||||
dynamodb = boto3.resource("dynamodb")
|
||||
|
||||
WORK_ORDERS_TABLE = os.environ.get("WORK_ORDERS_TABLE", "WorkOrders")
|
||||
|
|
@ -57,6 +61,14 @@ def _get_auth_token() -> str | None:
|
|||
_auth_token_cached_at = now
|
||||
return _auth_token_cache
|
||||
except Exception:
|
||||
# Fail closed (return None -> caller 401s) but surface the failure: a
|
||||
# Secrets Manager permission/config error would otherwise make every
|
||||
# request 401 with no operational signal. The secret value is never
|
||||
# logged.
|
||||
logger.exception(
|
||||
"Failed to fetch web UI auth token from Secrets Manager; "
|
||||
"denying request (failing closed)"
|
||||
)
|
||||
return None
|
||||
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue