31 lines
786 B
Python
31 lines
786 B
Python
from dataclasses import dataclass
|
|
from hashlib import sha256
|
|
|
|
from fastapi import Request
|
|
|
|
|
|
@dataclass(frozen=True)
|
|
class AgentCredential:
|
|
key_hash: str
|
|
key_fingerprint: str
|
|
|
|
|
|
def hash_agent_key(token: str) -> str:
|
|
return sha256(token.encode("utf-8")).hexdigest()
|
|
|
|
|
|
def fingerprint_from_hash(key_hash: str) -> str:
|
|
return key_hash[:16]
|
|
|
|
|
|
def credential_from_token(token: str) -> AgentCredential:
|
|
key_hash = hash_agent_key(token)
|
|
return AgentCredential(key_hash=key_hash, key_fingerprint=fingerprint_from_hash(key_hash))
|
|
|
|
|
|
def get_agent_credential(request: Request) -> AgentCredential:
|
|
cred = getattr(request.state, "agent_credential", None)
|
|
if not isinstance(cred, AgentCredential):
|
|
raise RuntimeError("agent credential missing")
|
|
return cred
|