The stack strace is coming from line 460 in auth.py of jupyterhub/services/auth.py when the object env_scopes is defined using json.loads on the env var JUPYTERHUB_OAUTH_ACCESS_SCOPES.
@default('access_scopes')
def _default_scopes(self):
env_scopes = os.getenv('JUPYTERHUB_OAUTH_ACCESS_SCOPES')
if not env_scopes:
# deprecated name (since 3.0)
env_scopes = os.getenv('JUPYTERHUB_OAUTH_SCOPES')
if env_scopes:
return set(json.loads(env_scopes))
This is the stack trace:
[E 2024-08-03 08:45:35.447 YarnSingleUserNotebookApp web:1875] Uncaught exception GET /user/gschulz/lab? (::ffff:95.217.23.222)
HTTPServerRequest(protocol='https', host='hub1.click-your-it.de', method='GET', uri='/user/gschulz/lab?', version='HTTP/1.1', remote_ip='::ffff:95.217.23.222')
Traceback (most recent call last):
File "/opt/miniforge/miniforge/envs/jupyterlab/lib/python3.9/site-packages/tornado/web.py", line 1769, in _execute
result = await result # type: ignore
File "/opt/miniforge/miniforge/envs/jupyterlab/lib/python3.9/site-packages/jupyter_server/base/handlers.py", line 620, in prepare
_user = self.identity_provider.get_user(self)
File "/opt/miniforge/miniforge/envs/jupyterlab/lib/python3.9/site-packages/jupyter_server/auth/identity.py", line 703, in get_user
user = self.login_handler_class.get_user(handler) # type:ignore[attr-defined]
File "/opt/miniforge/miniforge/envs/jupyterlab/lib/python3.9/site-packages/jupyterhub/singleuser/mixins.py", line 125, in get_user
return handler.get_current_user()
File "/opt/miniforge/miniforge/envs/jupyterlab/lib/python3.9/site-packages/jupyterhub/services/auth.py", line 1408, in get_current_user
self._hub_auth_user_cache = self.check_hub_user(user_model)
File "/opt/miniforge/miniforge/envs/jupyterlab/lib/python3.9/site-packages/jupyterhub/services/auth.py", line 1335, in check_hub_user
if self.allow_all:
File "/opt/miniforge/miniforge/envs/jupyterlab/lib/python3.9/site-packages/jupyterhub/services/auth.py", line 1270, in allow_all
self.hub_scopes is None
File "/opt/miniforge/miniforge/envs/jupyterlab/lib/python3.9/site-packages/jupyterhub/services/auth.py", line 1262, in hub_scopes
return self.hub_auth.access_scopes or None
File "/opt/miniforge/miniforge/envs/jupyterlab/lib/python3.9/site-packages/traitlets/traitlets.py", line 687, in __get__
return t.cast(G, self.get(obj, cls)) # the G should encode the Optional
File "/opt/miniforge/miniforge/envs/jupyterlab/lib/python3.9/site-packages/traitlets/traitlets.py", line 635, in get
default = obj.trait_defaults(self.name)
File "/opt/miniforge/miniforge/envs/jupyterlab/lib/python3.9/site-packages/traitlets/traitlets.py", line 1897, in trait_defaults
return t.cast(Sentinel, self._get_trait_default_generator(names[0])(self))
File "/opt/miniforge/miniforge/envs/jupyterlab/lib/python3.9/site-packages/traitlets/traitlets.py", line 1241, in __call__
return self.func(*args, **kwargs)
File "/opt/miniforge/miniforge/envs/jupyterlab/lib/python3.9/site-packages/jupyterhub/services/auth.py", line 460, in _default_scopes
return set(json.loads(env_scopes))
File "/opt/miniforge/miniforge/envs/jupyterlab/lib/python3.9/json/__init__.py", line 346, in loads
return _default_decoder.decode(s)
File "/opt/miniforge/miniforge/envs/jupyterlab/lib/python3.9/json/decoder.py", line 337, in decode
obj, end = self.raw_decode(s, idx=_w(s, 0).end())
File "/opt/miniforge/miniforge/envs/jupyterlab/lib/python3.9/json/decoder.py", line 355, in raw_decode
raise JSONDecodeError("Expecting value", s, err.value) from None
json.decoder.JSONDecodeError: Expecting value: line 1 column 2 (char 1)
This occurs when patching spawner.py of YarnSpawner like here and also patching singleuser.py of YarnSpawner like here.
In my case it does not occur when using json.dumps on the env var JUPYTERHUB_OAUTH_ACCESS_SCOPES in singleuser.py of yarnspawner.