File size: 864 Bytes
4d59f18
 
 
dc9c85b
 
 
 
 
4d59f18
dc9c85b
4d59f18
 
 
dc9c85b
 
 
 
 
e18662a
dc9c85b
e18662a
4d59f18
dc9c85b
4d59f18
dc9c85b
4d59f18
 
dc9c85b
4d59f18
 
dc9c85b
4d59f18
 
 
dc9c85b
e18662a
dc9c85b
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
from fastapi import Header, HTTPException
import time

# Demo API keys (later move to DB)
API_KEYS = {
    "free_key_123": {"plan": "free", "limit": 100},
    "pro_key_456": {"plan": "pro", "limit": 10000},
}

request_log = {}


def verify_api_key(x_api_key: str = Header(...)):
    if x_api_key not in API_KEYS:
        raise HTTPException(
            status_code=401,
            detail="Invalid API Key"
        )

    key_data = API_KEYS[x_api_key]

    now = int(time.time())
    window = 60  # 1 minute window

    logs = request_log.get(x_api_key, [])
    logs = [t for t in logs if now - t < window]

    if len(logs) >= key_data["limit"]:
        raise HTTPException(
            status_code=429,
            detail=f"Rate limit exceeded for {key_data['plan']} plan"
        )

    logs.append(now)
    request_log[x_api_key] = logs

    return key_data