Source code for simdb.remote.core.auth.keycloak
from typing import Optional
from flask import Request
from keycloak import (
KeycloakError,
KeycloakOpenID,
)
from simdb.config import Config
from ._authenticator import Authenticator
from ._exceptions import AuthenticationError
from ._user import User
[docs]
class KeyCloakAuthenticator(Authenticator):
TOKEN_HEADER_NAME = "KeyCloak-Token"
Name = "KeyCloak"
[docs]
def authenticate(self, config: Config, request: Request) -> Optional[User]:
sever_url = config.get_string_option("authentication.sever_url")
realm_name = config.get_string_option("authentication.realm_name")
client_id = config.get_string_option("authentication.client_id")
token = request.headers.get(KeyCloakAuthenticator.TOKEN_HEADER_NAME, "")
try:
oid = KeycloakOpenID(
server_url=sever_url, client_id=realm_name, realm_name=client_id
)
decoded = oid.decode_token(token)
name = decoded.get("name", None)
email = decoded.get("email", None)
return User(name, email)
except KeycloakError as err:
raise AuthenticationError("Keycloak authentication error") from err