@@ -192,7 +192,7 @@ class DICOMwebClient(object):
192192 def __init__ (self , url , username = None , password = None , ca_bundle = None ,
193193 cert = None , qido_url_prefix = None , wado_url_prefix = None ,
194194 stow_url_prefix = None , proxies = None , headers = None ,
195- callback = None , auth = None ):
195+ callback = None , auth = None , gcp_service_account_key_file = None ):
196196 '''
197197 Parameters
198198 ----------
@@ -225,10 +225,17 @@ def __init__(self, url, username=None, password=None, ca_bundle=None,
225225 (see `requests event hooks <http://docs.python-requests.org/en/master/user/advanced/#event-hooks>`_)
226226 auth: requests.auth.AuthBase, optional
227227 a subclassed instance of `requests.auth.AuthBase` to be used for authentication with the DICOMweb server
228+ gcp_service_account_key_file: str, optional
229+ path to a Google Cloud Platform (GCP) service account key file in
230+ JSON format
231+ (see `Google Cloud Healthcare API authentication <https://cloud.google.com/healthcare/docs/how-tos/authentication>`)
228232
229233 ''' # noqa
230234 logger .debug ('initialize HTTP session' )
231- self ._session = requests .Session ()
235+ if gcp_service_account_key_file is not None :
236+ self ._session = self ._get_gcp_session (gcp_service_account_key_file )
237+ else :
238+ self ._session = requests .Session ()
232239 self .base_url = url
233240 self .qido_url_prefix = qido_url_prefix
234241 self .wado_url_prefix = wado_url_prefix
@@ -286,19 +293,41 @@ def __init__(self, url, username=None, password=None, ca_bundle=None,
286293 self ._session .proxies = proxies
287294 if callback is not None :
288295 self ._session .hooks = {'response' : callback }
289- if auth is not None :
290- self ._session .auth = auth
291- if username or password :
292- logger .warning (
293- 'Auth object specified. '
294- 'Username and password ignored.'
295- )
296- if username is not None :
297- if not password :
298- raise ValueError (
299- 'No password provided for user "{0}".' .format (username )
296+ if gcp_service_account_key_file is not None :
297+ logger .warning (
298+ 'GCP service account key file specified. '
299+ 'Other authentication mechanisms ignored.'
300+ )
301+ else :
302+ if auth is not None :
303+ self ._session .auth = auth
304+ if username or password :
305+ logger .warning (
306+ 'Auth object specified. '
307+ 'Username and password ignored.'
308+ )
309+ if username is not None :
310+ if not password :
311+ raise ValueError (
312+ 'No password provided for user "{0}".' .format (username )
313+ )
314+ self ._session .auth = (username , password )
315+
316+ def _get_gcp_session (self , service_account_key_file ):
317+ from google .auth .transport import requests
318+ from google .oauth2 import service_account
319+ if not os .path .exists (service_account_key_file ):
320+ raise OSError (
321+ 'Google service account key file does not exist: "{}"' .format (
322+ service_account_key_file
300323 )
301- self ._session .auth = (username , password )
324+ )
325+ credentials = service_account .Credentials .from_service_account_file (
326+ service_account_file
327+ )
328+ scopes = ['https://www.googleapis.com/auth/cloud-platform' , ]
329+ scoped_credentials = credentials .with_scopes (scopes )
330+ return requests .AuthorizedSession (scoped_credentials )
302331
303332 def _parse_qido_query_parameters (self , fuzzymatching , limit , offset ,
304333 fields , search_filters ):
@@ -1843,7 +1872,7 @@ def retrieve_instance_metadata(self, study_instance_uid,
18431872 'wado' , study_instance_uid , series_instance_uid , sop_instance_uid
18441873 )
18451874 url += '/metadata'
1846- return self ._http_get_application_json (url )
1875+ return self ._http_get_application_json (url )[ 0 ]
18471876
18481877 def retrieve_instance_rendered (self , study_instance_uid ,
18491878 series_instance_uid ,
0 commit comments