def __init__(self, tokens=None): """Create a CfdeClient. Keyword Arguments: service_instance (str): The instance of the Globus Automate Flow and/or the DERIVA ingest Action Provider to use. Unless directed otherwise, this should be left to the default. **Default**: ``prod``. tokens (dict): A dict keyed by scope, of active Globus Tokens. token keys MUST be a subset of self.scopes. Each token value must contain an additional dict, and have an active "access_token". setting tokens=None will require .login() to be called instead. **Default**: ``None``. """ self.__service_instance = os.getenv("CFDE_SUBMIT_SERVICE_INSTANCE", "prod") self.__remote_config = {} # managed by property self.__tokens = {} self.__flow_client = None self.local_config = fair_research_login.ConfigParserTokenStorage( filename=self.config_filename ) cli_message = ('Starting login with Globus Auth, ' 'press ^C twice to cancel or once to manually authenticate') code_handlers = [ fair_research_login.LocalServerCodeHandler(cli_message=cli_message), fair_research_login.InputCodeHandler(), ] self.__native_client = fair_research_login.NativeClient(client_id=self.client_id, app_name=self.app_name, token_storage=self.local_config, code_handlers=code_handlers,) self.last_flow_run = {} # Fetch dynamic config info self.tokens = tokens or {} # Set to true when self.check() passes self.ready = False
def __init__(self, *args, **kwargs): self.SCOPES = [self.CONCIERGE_SCOPE] env = os.getenv('CONCIERGE_ENV', 'production') kwargs['base_url'] = kwargs.get('base_url', self.ENVIRONMENTS[env]) kwargs.update(dict(client_id=self.CLIENT_ID, app_name=self.APP_NAME)) super().__init__('Concierge Client App', *args, **kwargs) self.native_client = fair_research_login.NativeClient( app_name=self.app_name, client_id=self.CLIENT_ID, default_scopes=self.SCOPES, )
def get_native_client(self): """ :returns an instance of fair_research_login.NativeClient """ if getattr(self, 'client_id', None) is None: raise gladier.exc.AuthException( 'Gladier client must be instantiated with a ' '"client_id" to use "login()!') secrets_cfg = fair_research_login.ConfigParserTokenStorage( filename=self.secret_config_filename) return fair_research_login.NativeClient(client_id=self.client_id, app_name=self.app_name, token_storage=secrets_cfg)
def deploy_client_config(): cli = fair_research_login.NativeClient(client_id=native_app_id) scope = "https://auth.globus.org/scopes/d1e360d2-3b83-4039-bd82-f38f5bf2c394/https" cli.login(requested_scopes=scope) headers = { "Authorization": f"Bearer {cli.load_tokens_by_scope()[scope]['access_token']}" } url = ( "https://g-5cf005.aa98d.08cc.data.globus.org/submission_dynamic_config/" "cfde_client_config.json") put_res = requests.put(url, json=load_client_config(), headers=headers) put_res.raise_for_status() click.secho(f"Client Config Deployed: '{url}'", fg="green")
def get_remote_config(): cli = fair_research_login.NativeClient(client_id=native_app_id) scope = "https://auth.globus.org/scopes/d1e360d2-3b83-4039-bd82-f38f5bf2c394/https" cli.login(requested_scopes=scope) headers = { "Authorization": f"Bearer {cli.load_tokens_by_scope()[scope]['access_token']}", "X-Requested-With": "XMLHttpRequest" } url = ( "https://g-5cf005.aa98d.08cc.data.globus.org/submission_dynamic_config/" "cfde_client_config.json") resp = requests.get(url, headers=headers) resp.raise_for_status() return resp.json()
def get_native_client(self): """ fair_research_login.NativeClient is used when ``authorizers`` are not provided to __init__. This enables local login to the Globus Automate Client, FuncX, and any other Globus Resource Server. :return: an instance of fair_research_login.NativeClient """ if getattr(self, 'client_id', None) is None: raise gladier.exc.AuthException( 'Gladier client must be instantiated with a ' '"client_id" to use "login()!') secrets_cfg = fair_research_login.ConfigParserTokenStorage( filename=self.secret_config_filename) return fair_research_login.NativeClient(client_id=self.client_id, app_name=self.app_name, token_storage=secrets_cfg)
def __init__(self, authorizer=None, app_name=None, native_client=None, config=None, base_url='https://identifiers.fair-research.org/'): self.app_name = app_name or self.NAME self.config = config or self.CONFIG self.base_url = base_url self._authorizer = authorizer if native_client is None: storage = fair_research_login.ConfigParserTokenStorage( filename=self.config, section='tokens') self.native_client = fair_research_login.NativeClient( app_name=self.app_name, client_id=self.CLIENT_ID, default_scopes=self.SCOPES, token_storage=storage)
def __init__(self, tokens=None): """Create a CfdeClient. Keyword Arguments: tokens (dict): A dict keyed by scope, of active Globus Tokens. token keys MUST be a subset of self.scopes. Each token value must contain an additional dict, and have an active "access_token". setting tokens=None will require .login() to be called instead. **Default**: ``None``. """ try: with open(self.config_filename) as f: config_data = f.readlines() if any(x for x in config_data if x.startswith('flows_automated_tests')): os.unlink(self.config_filename) except FileNotFoundError: pass self.__service_instance = os.getenv("CFDE_SUBMIT_SERVICE_INSTANCE", "prod") self.__remote_config = {} # managed by property self.__tokens = {} self.__flow_client = None self.__transfer_client = None self.transfer_scope = CONFIG["TRANSFER_SCOPE"] self.local_config = fair_research_login.ConfigParserTokenStorage( filename=self.config_filename ) cli_message = ('Starting login with Globus Auth, ' 'press ^C twice to cancel or once to manually authenticate') code_handlers = [ fair_research_login.LocalServerCodeHandler(cli_message=cli_message), fair_research_login.InputCodeHandler(), ] self.__native_client = fair_research_login.NativeClient(client_id=self.client_id, app_name=self.app_name, token_storage=self.local_config, code_handlers=code_handlers, ) self.last_flow_run = {} # Fetch dynamic config info self.tokens = tokens or {} # Set to true when self.check() passes self.ready = False
from flow import full_submission_flow_def native_app_id = "417301b1-5101-456a-8a27-423e71a2ae26" # Premade native app ID deriva_aps = { "dev": "https://ap-dev.nih-cfde.org/", "staging": "https://ap-staging.nih-cfde.org/", "prod": "https://ap.nih-cfde.org/" } client_config_filename = os.path.join(os.path.dirname(__file__), "cfde_client_config.json") old_flows_filename = os.path.join(os.path.dirname(__file__), "old_flows.txt") DERIVA_SCOPE = 'https://auth.globus.org/scopes/app.nih-cfde.org/deriva_all' TRANSFER_SCOPE = 'urn:globus:auth:scope:transfer.api.globus.org:all' CFDE_NATIVE_APP = '417301b1-5101-456a-8a27-423e71a2ae26' nc = fair_research_login.NativeClient(client_id=CFDE_NATIVE_APP) nc.login(requested_scopes=[DERIVA_SCOPE, TRANSFER_SCOPE]) transfer_token = get_app_token(CFDE_CONFIG["DEPENDENT_SCOPES"]['transfer']) auth = globus_sdk.AccessTokenAuthorizer(transfer_token) transfer_client = globus_sdk.TransferClient(authorizer=auth) def load_client_config(): with open(client_config_filename) as f: return json.JSONDecoder( object_pairs_hook=collections.OrderedDict).decode(f.read()) @click.group() def cli(): pass