"""Utility functions for getting an Auth0 bearer token.""" from dataclasses import dataclass import requests from secrets_manager.python_ext import PythonSecretsManager from abacus_state import config APPLICATION = 'ows-abacus-state-test' READONLY_USER = 'ows-abacus-readonly-tester@theorchard.io' READONLY_USER_UNAUTHORIZED = 'ows-abacus-readonly-tester-unauthorized@theorchard.io' READONLY_USER_PASSWORD_SECRET_NAME = 'AUTH0_ABACUS_READONLY_USER_PASSWORD' AUTH0_CLIENT_ID_SECRET_NAME = 'AUTH0_ABACUS_APP_CLIENT_ID' AUTH0_CLIENT_SECRET_SECRET_NAME = 'AUTH0_ABACUS_APP_CLIENT_SECRET' AUTH_AUDIENCE = 'https://workstation.qaorch.com/api' @dataclass class LoginSecrets: """Holds secrets for integration tests.""" auth_client_id: str auth_client_secret: str password: str @dataclass class LoginInfo(LoginSecrets): """Extends LoginSecrets and adds a username.""" username: str def login_from_secrets_manager( password_secret_name: str, auth_client_id_secret_name: str, auth_client_secret_secret_name: str, ) -> LoginSecrets: """Fetch Auth0 secrets from AWS Secret Manager.""" secrets_manager_client = PythonSecretsManager( environment=config.Config.QA_ENVIRONMENT, service_name=APPLICATION ) password = secrets_manager_client.get_cred(password_secret_name) auth_client_id = secrets_manager_client.get_cred(auth_client_id_secret_name) auth_client_secret = secrets_manager_client.get_cred(auth_client_secret_secret_name) return LoginSecrets( password=password, auth_client_id=auth_client_id, auth_client_secret=auth_client_secret, ) def generate_auth_token(login_info: LoginInfo) -> str: """Generate Auth0 token for settings test user.""" data = { 'grant_type': 'password', 'username': login_info.username, 'password': login_info.password, 'audience': AUTH_AUDIENCE, 'scope': '', 'client_id': login_info.auth_client_id, 'client_secret': login_info.auth_client_secret, } r = requests.post('https://qa-orchard.auth0.com/oauth/token', data=data) resp = r.json() if 'error' in resp: raise ValueError(f'Auth0 error occurred: {resp}') return resp['access_token']