Coverage for /usr/local/lib/python3.10/site-packages/opal_server-0.0.0-py3.10.egg/opal_server/security/api.py: 89%
17 statements
« prev ^ index » next coverage.py v7.15.2, created at 2026-10-10 11:54 +0000
« prev ^ index » next coverage.py v7.15.2, created at 2026-10-10 11:54 +0000
1from datetime import datetime
3from fastapi import APIRouter, Depends, HTTPException, status
4from opal_common.authentication.deps import StaticBearerAuthenticator
5from opal_common.authentication.signer import JWTSigner
6from opal_common.logger import logger
7from opal_common.schemas.security import AccessToken, AccessTokenRequest, TokenDetails
10def init_security_router(signer: JWTSigner, authenticator: StaticBearerAuthenticator):
11 router = APIRouter()
13 @router.post(
14 "/token",
15 status_code=status.HTTP_200_OK,
16 response_model=AccessToken,
17 dependencies=[Depends(authenticator)],
18 )
19 async def generate_new_access_token(req: AccessTokenRequest):
20 if not signer.enabled: 20 ↛ 21line 20 didn't jump to line 21 because the condition on line 20 was never true
21 raise HTTPException(
22 status_code=status.HTTP_503_SERVICE_UNAVAILABLE,
23 detail="opal server was not configured with security, cannot generate tokens!",
24 )
26 claims = {"peer_type": req.type.value, **req.claims}
27 token = signer.sign(sub=req.id, token_lifetime=req.ttl, custom_claims=claims)
28 logger.info(f"Generated opal token: peer_type={req.type.value}")
29 return AccessToken(
30 token=token,
31 details=TokenDetails(
32 id=req.id,
33 type=req.type,
34 expired=datetime.utcnow() + req.ttl,
35 claims=claims,
36 ),
37 )
39 return router