jupyterhub / jupyterhub/firstuseauthenticator

I forgot my password. How do I log in?

Open
#51 1 comment 0 reactions 0 assignees View on GitHub
bug
Dominant language
Python
Stars
50
Forks
31
PR merge metrics
No merged PRs in 30d

Description

### Bug description

I have forgotten my JupyterHub password, and now I cannot login.

#### Expected behaviour

There should be a "forgot password" page, or some way for an admin to reset a user's password.

#### Actual behaviour

I cannot log in.

### How to reproduce

1. Set a password.
2. Do not remember the password.

### Your personal set up

- OS:

- Version(s):

jupyterhub --version: `2.1.1`

python --version: Python 3.8.12

- Full environment
```
alembic @ file:///home/conda/feedstock_root/build_artifacts/alembic_1643780403162/work
anyio @ file:///tmp/build/80754af9/anyio_1644481698350/work/dist
argon2-cffi @ file:///opt/conda/conda-bld/argon2-cffi_1645000214183/work
argon2-cffi-bindings @ file:///tmp/build/80754af9/argon2-cffi-bindings_1644569684262/work
async-generator==1.10
attrs @ file:///home/conda/feedstock_root/build_artifacts/attrs_1640799537051/work
Babel @ file:///tmp/build/80754af9/babel_1620871417480/work
backcall @ file:///home/ktietz/src/ci/backcall_1611930011877/work
bcrypt==3.2.0
bleach @ file:///opt/conda/conda-bld/bleach_1641577558959/work
blinker==1.4
brotlipy==0.7.0
certifi==2021.10.8
certipy==0.1.3
cffi @ file:///opt/conda/conda-bld/cffi_1642701102775/work
charset-normalizer @ file:///home/conda/feedstock_root/build_artifacts/charset-normalizer_1644853463426/work
click==8.0.4
cloudpickle==2.0.0
cryptography @ file:///home/conda/feedstock_root/build_artifacts/cryptography_1634230276575/work
dask==2022.2.0
debugpy @ file:///tmp/build/80754af9/debugpy_1637091796427/work
decorator @ file:///opt/conda/conda-bld/decorator_1643638310831/work
defusedxml @ file:///tmp/build/80754af9/defusedxml_1615228127516/work
Deprecated==1.2.13
entrypoints @ file:///home/conda/feedstock_root/build_artifacts/entrypoints_1643888246732/work
filelock==3.6.0
fsspec==2022.2.0
grpcio==1.44.0
idna @ file:///home/conda/feedstock_root/build_artifacts/idna_1642433548627/work
importlib-metadata @ file:///home/conda/feedstock_root/build_artifacts/importlib-metadata_1644934520674/work
importlib-resources @ file:///home/conda/feedstock_root/build_artifacts/importlib_resources_1635615662634/work
ipykernel @ file:///tmp/build/80754af9/ipykernel_1633545412716/work/dist/ipykernel-6.4.1-py3-none-any.whl
ipython @ file:///tmp/build/80754af9/ipython_1643818147236/work
ipython-genutils @ file:///tmp/build/80754af9/ipython_genutils_1606773439826/work
jedi @ file:///tmp/build/80754af9/jedi_1644315233700/work
Jinja2 @ file:///home/conda/feedstock_root/build_artifacts/jinja2_1636510082894/work
json5 @ file:///tmp/build/80754af9/json5_1624432770122/work
jsonschema @ file:///home/conda/feedstock_root/build_artifacts/jsonschema-meta_1642000296051/work
jupyter-client @ file:///opt/conda/conda-bld/jupyter_client_1643638337975/work
jupyter-core @ file:///tmp/build/80754af9/jupyter_core_1636524756443/work
jupyter-server @ file:///opt/conda/conda-bld/jupyter_server_1644494914632/work
jupyter-telemetry @ file:///home/conda/feedstock_root/build_artifacts/jupyter_telemetry_1605173804246/work
jupyterhub @ file:///home/conda/feedstock_root/build_artifacts/jupyterhub-feedstock_1643124509075/work
jupyterhub-firstuseauthenticator==1.0.0
jupyterlab @ file:///opt/conda/conda-bld/jupyterlab_1644830542042/work
jupyterlab-pygments @ file:///tmp/build/80754af9/jupyterlab_pygments_1601490720602/work
jupyterlab-server @ file:///opt/conda/conda-bld/jupyterlab_server_1644500396812/work
locket==0.2.1
Mako @ file:///home/conda/feedstock_root/build_artifacts/mako_1637170539581/work
MarkupSafe @ file:///home/conda/feedstock_root/build_artifacts/markupsafe_1621455677251/work
matplotlib-inline @ file:///tmp/build/80754af9/matplotlib-inline_1628242447089/work
mistune==0.8.4
msgpack==1.0.3
nbclassic @ file:///opt/conda/conda-bld/nbclassic_1644943264176/work
nbclient @ file:///tmp/build/80754af9/nbclient_1645431659072/work
nbconvert @ file:///opt/conda/conda-bld/nbconvert_1641309195684/work
nbformat @ file:///tmp/build/80754af9/nbformat_1617383369282/work
nest-asyncio @ file:///tmp/build/80754af9/nest-asyncio_1613680548246/work
notebook @ file:///tmp/build/80754af9/notebook_1645002536250/work
numpy==1.22.2
oauthlib @ file:///home/conda/feedstock_root/build_artifacts/oauthlib_1643507977997/work
packaging @ file:///tmp/build/80754af9/packaging_1637314298585/work
pamela==1.0.0
pandocfilters @ file:///opt/conda/conda-bld/pandocfilters_1643405455980/work
parso @ file:///opt/conda/conda-bld/parso_1641458642106/work
partd==1.2.0
pexpect @ file:///tmp/build/80754af9/pexpect_1605563209008/work
pickleshare @ file:///tmp/build/80754af9/pickleshare_1606932040724/work
prometheus-client @ file:///home/conda/feedstock_root/build_artifacts/prometheus_client_1643395600215/work
prompt-toolkit @ file:///tmp/build/80754af9/prompt-toolkit_1633440160888/work
protobuf==3.19.4
psutil @ file:///tmp/build/80754af9/psutil_1612298023621/work
ptyprocess @ file:///tmp/build/80754af9/ptyprocess_1609355006118/work/dist/ptyprocess-0.7.0-py2.py3-none-any.whl
pycparser @ file:///home/conda/feedstock_root/build_artifacts/pycparser_1636257122734/work
pycurl==7.44.1
Pygments @ file:///opt/conda/conda-bld/pygments_1644249106324/work
PyJWT @ file:///home/conda/feedstock_root/build_artifacts/pyjwt_1638819640841/work
pyOpenSSL @ file:///home/conda/feedstock_root/build_artifacts/pyopenssl_1643496850550/work
pyparsing @ file:///tmp/build/80754af9/pyparsing_1635766073266/work
pyrsistent @ file:///tmp/build/80754af9/pyrsistent_1636110947380/work
PySocks @ file:///home/conda/feedstock_root/build_artifacts/pysocks_1635862404924/work
python-dateutil @ file:///home/conda/feedstock_root/build_artifacts/python-dateutil_1626286286081/work
python-json-logger @ file:///home/conda/feedstock_root/build_artifacts/python-json-logger_1602545356084/work
pytz==2021.3
PyYAML==6.0
pyzmq @ file:///tmp/build/80754af9/pyzmq_1638436375034/work
ray==1.10.0
redis==4.1.4
requests @ file:///home/conda/feedstock_root/build_artifacts/requests_1641580202195/work
ruamel.yaml==0.16.5
ruamel.yaml.clib @ file:///opt/conda/conda-bld/ruamel.yaml.clib_1641552548372/work
Send2Trash @ file:///tmp/build/80754af9/send2trash_1632406701022/work
six @ file:///home/conda/feedstock_root/build_artifacts/six_1620240208055/work
sniffio @ file:///tmp/build/80754af9/sniffio_1614030475067/work
SQLAlchemy @ file:///home/conda/feedstock_root/build_artifacts/sqlalchemy_1612225077951/work
terminado @ file:///tmp/build/80754af9/terminado_1644322581811/work
testpath @ file:///tmp/build/80754af9/testpath_1624638946665/work
toolz==0.11.2
tornado @ file:///home/conda/feedstock_root/build_artifacts/tornado_1610094706440/work
traitlets @ file:///home/conda/feedstock_root/build_artifacts/traitlets_1635260543454/work
typing-extensions @ file:///tmp/build/80754af9/typing_extensions_1631814937681/work
urllib3 @ file:///home/conda/feedstock_root/build_artifacts/urllib3_1641584929973/work
wcwidth @ file:///Users/ktietz/demo/mc3/conda-bld/wcwidth_1629357192024/work
webencodings==0.5.1
websocket-client @ file:///tmp/build/80754af9/websocket-client_1614804261064/work
wrapt==1.13.3
zipp @ file:///home/conda/feedstock_root/build_artifacts/zipp_1643828507773/work
```

- Configuration

```python
c = get_config()
c.Spawner.mem_limit = '50G'
c.Spawner.mem_guarantee = '3G'
c.Spawner.cpu_limit = 50
c.Spawner.cpu_guarantee = 2

from subprocess import check_call
from hashlib import sha256
import pathlib, re, os, shutil, io

def pre_spawn_hook(spawner):
"""Create user:"""
username = spawner.user.name
username = username.strip()
if username in ['root', 'ec2-user']:
raise ValueError(f'Cannot create user "{username}"')
uname_exp = re.compile("^([a-zA-Z0-9-]+)$")
if uname_exp.match(username) is None:
raise ValueError(f'"{username}" is an invalid alias')
uid = int(sha256(str(username).encode('utf8')).hexdigest(), 16) % (4294967294-65536) + 65536 ## Ref: https://unix.stackexchange.com/a/685943
try:
check_call(['useradd', '-u', f'{uid}', '-ms', '/bin/bash', '-d', f'/efs/litmus-server/users/{username}', username])
except Exception as e:
print(f'{e}')
"""Create directory:"""
username = spawner.user.name # get the username
volume_path = os.path.join('/efs/litmus-server/users', username)
if not os.path.exists(volume_path):
os.mkdir(volume_path, 0o755)
volume_path = os.path.join('/efs', username)
if not os.path.exists(volume_path):
os.mkdir(volume_path, 0o755)
os.system(f'chown -R {username} /efs/litmus-server/users/{username}/')

c.Spawner.pre_spawn_hook = pre_spawn_hook

c.Spawner.notebook_dir = '/efs/litmus-server/users/{username}/'

c.JupyterHub.port = 5432
c.Spawner.args = [
'--allow-root',
]
c.ServerApp.shutdown_no_activity_timeout = 7 * 24 * 60 * 60
c.MappingKernelManager.cull_idle_timeout = 7 * 24 * 60 * 60 ## Ref: https://www.ibm.com/docs/en/spectrum-conductor/2.4.0?topic=notebooks-kernel-culling-jupyter
c.Spawner.default_url = '/lab' ##Ref https://github.com/jupyterhub/jupyterhub/issues/2603#issuecomm$
c.MappingKernelManager.cull_idle_timeout = 24 * 60 * 60

c.JupyterHub.authenticator_class = 'firstuseauthenticator.FirstUseAuthenticator'
c.JupyterHub.template_paths=['./templates'] ## Ref: https://github.com/jupyterhub/jupyterhub/issues/1385#issuecomment-465801218
```

- Logs

```
# paste relevant logs here, if any
```

Contributor guide

No contributing guide indexed for this repository

Research direction

Start by reviewing the FirstUseAuthenticator entry point named in the configuration and its existing password flow. The issue names no source files or tests, so trace how passwords are set and authenticated before defining the reset behavior. Done should include an agreed way for users or administrators to recover access, with coverage for the chosen flow.

Written by the indexing model from the issue text.

Assessment

Tech stack
python
Domain
authentication, security
Issue type
Feature
Difficulty
5/5
Estimated time
Over a week
Activity status
Stale
Clarity
Needs clarification
Newbie friendliness
25/100

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.