Skip to content

HTTP client_kwargs authentication not used with simplecache #484

@scottyhq

Description

@scottyhq

Using fsspec='0.8.4+70.g33d532f' if a simplecache:: prefix is used with HTTP:// it seems that authentication settings are not used leading to ClientResponseError: 401, message='Unauthorized'

This works:

import fsspec
import xarray as xr
import netrc
import aiohttp

(username, account, password) = netrc.netrc().authenticators("urs.earthdata.nasa.gov")
uri = 'https://grfn.asf.alaska.edu/door/download/S1-GUNW-A-R-137-tops-20200311_20200305-020013-43055N_41518N-PP-00fe-v2_0_2.nc'
with fsspec.open(item.data.urlpath, 
                 client_kwargs={'auth': aiohttp.BasicAuth(username, password)}) as f:
    ds = xr.open_dataset(f, group='/science/grids/data', engine='h5netcdf', chunks={})

This does not:

with fsspec.open('simplecache::'+item.data.urlpath, 
                 client_kwargs={'auth': aiohttp.BasicAuth(username, password)}) as f:
    ds = xr.open_dataset(f, group='/science/grids/data', engine='h5netcdf', chunks={})
---------------------------------------------------------------------------
ClientResponseError                       Traceback (most recent call last)
<ipython-input-17-a30d2d9da865> in <module>
      1 # with simplecache
      2 with fsspec.open('simplecache::'+item.data.urlpath, 
----> 3                  client_kwargs={'auth': aiohttp.BasicAuth(username, password)}) as f:
      4     ds = xr.open_dataset(f, group='/science/grids/data', engine='h5netcdf', chunks={})
      5 

~/GitHub/filesystem_spec/fsspec/core.py in __enter__(self)
    100         mode = self.mode.replace("t", "").replace("b", "") + "b"
    101 
--> 102         f = self.fs.open(self.path, mode=mode)
    103 
    104         self.fobjects = [f]

~/GitHub/filesystem_spec/fsspec/implementations/cached.py in <lambda>(*args, **kw)
    384             # all the methods defined in this class. Note `open` here, since
    385             # it calls `_open`, but is actually in superclass
--> 386             return lambda *args, **kw: getattr(type(self), item)(self, *args, **kw)
    387         if item in ["__reduce_ex__"]:
    388             raise AttributeError

~/GitHub/filesystem_spec/fsspec/spec.py in open(self, path, mode, block_size, cache_options, **kwargs)
    912                 autocommit=ac,
    913                 cache_options=cache_options,
--> 914                 **kwargs
    915             )
    916             if not ac:

~/GitHub/filesystem_spec/fsspec/implementations/cached.py in <lambda>(*args, **kw)
    384             # all the methods defined in this class. Note `open` here, since
    385             # it calls `_open`, but is actually in superclass
--> 386             return lambda *args, **kw: getattr(type(self), item)(self, *args, **kw)
    387         if item in ["__reduce_ex__"]:
    388             raise AttributeError

~/GitHub/filesystem_spec/fsspec/implementations/cached.py in _open(self, path, mode, **kwargs)
    637                     f2.write(data)
    638         else:
--> 639             self.fs.get(path, fn)
    640         return self._open(path, mode)
    641 

~/GitHub/filesystem_spec/fsspec/asyn.py in get(self, rpath, lpath, recursive, **kwargs)
    279         lpaths = other_paths(rpaths, lpath)
    280         [os.makedirs(os.path.dirname(lp), exist_ok=True) for lp in lpaths]
--> 281         return sync(self.loop, self._get, rpaths, lpaths)
    282 
    283 

~/GitHub/filesystem_spec/fsspec/asyn.py in sync(loop, func, callback_timeout, *args, **kwargs)
     69     if error[0]:
     70         typ, exc, tb = error[0]
---> 71         raise exc.with_traceback(tb)
     72     else:
     73         return result[0]

~/GitHub/filesystem_spec/fsspec/asyn.py in f()
     53             if callback_timeout is not None:
     54                 future = asyncio.wait_for(future, callback_timeout)
---> 55             result[0] = await future
     56         except Exception:
     57             error[0] = sys.exc_info()

~/GitHub/filesystem_spec/fsspec/asyn.py in _get(self, rpaths, lpaths, **kwargs)
    267             *[
    268                 self._get_file(rpath, lpath, **kwargs)
--> 269                 for lpath, rpath in zip(lpaths, rpaths)
    270             ]
    271         )

~/GitHub/filesystem_spec/fsspec/implementations/http.py in _get_file(self, rpath, lpath, chunk_size, **kwargs)
    177             if r.status == 404:
    178                 raise FileNotFoundError(rpath)
--> 179             r.raise_for_status()
    180             with open(lpath, "wb") as fd:
    181                 chunk = True

~/miniconda3/envs/intake-stac-gui/lib/python3.7/site-packages/aiohttp/client_reqrep.py in raise_for_status(self)
    944                 status=self.status,
    945                 message=self.reason,
--> 946                 headers=self.headers)
    947 
    948     def _cleanup_writer(self) -> None:

ClientResponseError: 401, message='Unauthorized', url=URL('https://urs.earthdata.nasa.gov/oauth/authorize?app_type=401&client_id=iwntGSgHy9yoog7Mjag0dQ&response_type=code&redirect_uri=https://grfn.asf.alaska.edu/door/oauth&state=aHR0cDovL2dyZm4uYXNmLmFsYXNrYS5lZHUvZG9vci9kb3dubG9hZC9TMS1HVU5XLUEtUi0xMzctdG9wcy0yMDIwMDMxMV8yMDIwMDMwNS0wMjAwMTMtNDMwNTVOXzQxNTE4Ti1QUC0wMGZlLXYyXzBfMi5uYw')

I also tried entering authentication settings via fsspec.config.conf['https'] = dict(client_kwargs={'auth': aiohttp.BasicAuth(username, password)}) but get the same traceback.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions