from api import cache from auth0.v3.authentication import GetToken from auth0.v3.management import Auth0 import config import marshmallow_dataclass from auth.models import UserDataSchema from models.user import User from auth.auth0.models import Auth0UserData, Auth0AppMetadata from services.users_repository import UsersRepository from auth.auth0.constants import JWKS_CACHE_KEY_PREFIX import requests import simplejson as json from services.users_service import UsersService def get_auth0_management_token(): """Generate Auth0 management token. More on management tokens: https://auth0.com/docs/api/management/v2/tokens Returns: str: JWT token for Auth0 management API. Raises: Auth0Error: If request to Auth0 failed. It usually means that configuration is wrong. """ get_token = GetToken(config.AUTH0_DOMAIN) token = get_token.client_credentials( config.AUTH0_MANAGEMENT_CLIENT_ID, config.AUTH0_MANAGEMENT_CLIENT_SECRET, config.AUTH0_MANAGEMENT_API ) return token["access_token"] def sync_auth0_user(auth0_id) -> User: """Sync MCT user account with Auth0, create new MCT account if it does not exist. Args: auth0_id (str): Auth0 user ID. Returns: User: Instance of updated/created User object. Raises: Auth0Error: If request to Auth0 failed. It usually means that configuration is wrong. """ auth0 = Auth0(config.AUTH0_DOMAIN, get_auth0_management_token()) user_data_json = auth0.users.get(auth0_id) Schema = marshmallow_dataclass.class_schema(Auth0UserData) user_data = Schema().load(user_data_json) user_model = UserDataSchema( id=user_data.user_id, name=user_data.name, email=user_data.email ) users_repository = UsersRepository() user = users_repository.create_or_update_user(user_model) sync_app_metadata(user.id, user_data.app_metadata) return user def sync_app_metadata(user_id: int, app_metadata: Auth0AppMetadata): if app_metadata.mct is None: return users_service = UsersService() users_service.add_or_remove_labels_from_user(user_id, app_metadata.mct.user_labels) @cache.cached(timeout=config.JWKS_CACHE_TIMEOUT_SEC, key_prefix=JWKS_CACHE_KEY_PREFIX) def get_jwks(): """Fetch JSON Web Key Set (JWKS) from Auth0. More on JWKS: https://auth0.com/docs/jwks. Returns: dict: JSON response from Auth0 decoded to dictionary. The dictionary contains list of JSON Web Keys that can be used to verify the signature of authorization tokens. """ jwks_request = requests.get(config.AUTH0_JWKS_API) return json.loads(jwks_request.text)