nativeauthenticator
nativeauthenticator copied to clipboard
import_from_firstuse not working: Previous users cannot log in or create an account.
Bug description
After setting c.NativeAuthenticator.import_from_firstuse = True and reloading the configuration, the users from firstuse_dbm_path do get added to the new database, but they cannot log in or create a new account.
This is because the hashed password from firstuse_dbm_path is passed to the user creation function as if it were a normal password, leading to a different hash. The user then exists in the new database, preventing them from signing up with the same name. And they cannot sign in because their old password will not match the new hash.
Expected behaviour
All users would be transferred with the same username and password and are able to sign in without having to sign up first.
Actual behaviour
They cannot log in or create a new account with the same username.
How to reproduce
- Set up tljh with an admin user and password (randomly chosen here):
curl -L https://tljh.jupyter.org/bootstrap.py \
| sudo python3 - \
--admin the_admin:PUYLjBrI5q
- Create the file /opt/tljh/config/jupyterhub_config.d/native_auth.py with:
c.JupyterHub.authenticator_class = 'nativeauthenticator.NativeAuthenticator'
c.Authenticator.admin_users = {'the_admin'}
c.NativeAuthenticator.enable_signup = True
c.NativeAuthenticator.import_from_firstuse = True
- Reload the hub:
sudo tljh-config reload
- Try to log in as the_admin with password PUYLjBrI5q or create a new user named the_admin.
Your personal set up
Tested on the-littlest-jupyterhub.
- OS: Ubuntu 22.04.1 LTS
- Version(s): JupyterHub version 1.5.0, python 3.10
Full environment
# paste output of `pip freeze` or `conda list` here
Configuration
# jupyterhub_config.py
"""
JupyterHub config for the littlest jupyterhub.
"""
from glob import glob
import os
from tljh import configurer
from tljh.config import INSTALL_PREFIX, USER_ENV_PREFIX, CONFIG_DIR
from tljh.utils import get_plugin_manager
from tljh.user_creating_spawner import UserCreatingSpawner
from jupyterhub_traefik_proxy import TraefikTomlProxy
c.JupyterHub.spawner_class = UserCreatingSpawner
# leave users running when the Hub restarts
c.JupyterHub.cleanup_servers = False
# Use a high port so users can try this on machines with a JupyterHub already present
c.JupyterHub.hub_port = 15001
c.TraefikTomlProxy.should_start = False
dynamic_conf_file_path = os.path.join(INSTALL_PREFIX, "state", "rules", "rules.toml")
c.TraefikTomlProxy.toml_dynamic_config_file = dynamic_conf_file_path
c.JupyterHub.proxy_class = TraefikTomlProxy
c.SystemdSpawner.extra_paths = [os.path.join(USER_ENV_PREFIX, "bin")]
c.SystemdSpawner.default_shell = "/bin/bash"
# Drop the '-singleuser' suffix present in the default template
c.SystemdSpawner.unit_name_template = "jupyter-{USERNAME}"
tljh_config = configurer.load_config()
configurer.apply_config(tljh_config, c)
# Let TLJH hooks modify `c` if they want
# Call our custom configuration plugin
pm = get_plugin_manager()
pm.hook.tljh_custom_jupyterhub_config(c=c)
# Load arbitrary .py config files if they exist.
# This is our escape hatch
extra_configs = sorted(glob(os.path.join(CONFIG_DIR, "jupyterhub_config.d", "*.py")))
for ec in extra_configs:
load_subconfig(ec)
Logs
Thank you for opening your first issue in this project! Engagement like this is essential for open source projects! :hugs:
If you haven't done so already, check out Jupyter's Code of Conduct. Also, please try to follow the issue template as it helps other other community members to contribute more effectively.
You can meet the other Jovyans by joining our Discourse forum. There is also an intro thread there where you can stop by and say Hi! :wave:
Welcome to the Jupyter community! :tada: