Coverage for src / mysingle / auth / deps / kong.py: 0%
24 statements
« prev ^ index » next coverage.py v7.12.0, created at 2025-12-02 00:58 +0900
« prev ^ index » next coverage.py v7.12.0, created at 2025-12-02 00:58 +0900
1from typing import Optional
3from fastapi import Request
5from mysingle.constants import (
6 HEADER_CORRELATION_ID,
7 HEADER_KONG_REQUEST_ID,
8 HEADER_KONG_USER_ID,
9 HEADER_USER_ID,
10)
13def _get_header(request: Request, key: str) -> Optional[str]:
14 """Case-insensitive, trimmed header getter.
16 Starlette's Headers mapping is case-insensitive, so we can use a single
17 canonical lowercase key. Returns None for missing or empty values.
18 """
19 val = request.headers.get(key)
20 if val is None:
21 return None
22 val = val.strip()
23 return val or None
26def get_kong_user_id(request: Request) -> Optional[str]:
27 """
28 애플리케이션 최종 사용자 ID.
30 Kong Gateway에서 JWT 플러그인을 통해 주입하는 헤더:
31 - X-Consumer-Custom-ID: JWT의 sub 클레임 값 (원본)
32 - X-User-Id: 다운스트림 서비스로 전파되는 표준 헤더
34 우선순위:
35 1. X-User-Id (서비스 간 전파 표준)
36 2. X-Consumer-Custom-ID (Kong JWT 플러그인 원본)
37 """
38 # 우선순위 1: 서비스 간 전파 표준 헤더
39 user_id = _get_header(request, HEADER_USER_ID.lower())
40 if user_id:
41 return user_id
43 # 우선순위 2: Kong JWT 플러그인 원본 헤더
44 return _get_header(request, HEADER_KONG_USER_ID.lower())
47def is_kong_authenticated(request: Request) -> bool:
48 """Kong 헤더가 존재하면 인증된 것으로 판단"""
49 return bool(get_kong_user_id(request))
52def get_kong_correlation_id(request: Request) -> Optional[str]:
53 """
54 Correlation ID 추출
56 X-Correlation-Id 헤더를 우선 사용하며, 없으면 대체 헤더 확인
57 """
58 return _get_header(request, HEADER_CORRELATION_ID.lower()) or _get_header(
59 request, "correlation-id"
60 )
63def get_kong_request_id(request: Request) -> Optional[str]:
64 """
65 Kong Request ID 추출
67 X-Kong-Request-Id 헤더를 우선 사용하며, 없으면 대체 헤더 확인
68 """
69 return _get_header(request, HEADER_KONG_REQUEST_ID.lower()) or _get_header(
70 request, "x-request-id"
71 )
74def get_kong_upstream_latency(request: Request) -> Optional[str]:
75 """업스트림 지연시간(ms)"""
76 return _get_header(request, "x-kong-upstream-latency")
79def get_kong_proxy_latency(request: Request) -> Optional[str]:
80 """프록시 지연시간(ms)"""
81 return _get_header(request, "x-kong-proxy-latency")