我的JupyterHub部署使用Okta进行用户身份验证。我有一个自定义的身份验证器,可以根据Okta验证用户,然后无论用户实际是什么,都返回特定的用户someUser
。这样做是为了避免处理系统权限,并允许在用户之间轻松共享笔记本和实时内核。
现在,我想知道经过身份验证的用户是谁,因为可用性而不是安全性。我在docs上看到可以通过auth_state
完成此操作。我向auth_state
添加了一些键,类似于示例中的内容:
class MyAuthenticator(Authenticator):
@gen.coroutine
def authenticate(self, handler, data=None):
username = ...
return {
'name': 'someUser',
'auth_state': {
'user': username,
},
}
@gen.coroutine
def pre_spawn_start(self, user, spawner):
"""Pass upstream_token to spawner via environment variable"""
auth_state = yield user.get_auth_state()
if not auth_state:
# auth_state not enabled
return
spawner.environment['OKTA_USER'] = auth_state['user']
起初,这产生了一个空的auth_state;然后,我看到要应用一些配置,因此我在JupyterHub配置文件中添加了c.Authenticator.enable_auth_state = True
,并在JupyterHub流程中添加了export JUPYTERHUB_CRYPT_KEY=$(openssl rand -hex 32)
。
但是,当我尝试在此之后重新启动JupyterHub服务时,该服务无法正确加载。日志显示它一直在努力:
Loading cookie_secret from ....../jupyterhub_cookie_secret
但是在任何地方都找不到正确的错误消息。
如果我注释掉c.Authenticator.enable_auth_state
配置,它将很好地加载,该cookie加载行仅在日志中出现一次。
在code中,提到必须安装cryptography
,所以我确定已安装。我还尝试过更改enable_auth_state
参数的代码默认值,而不是通过config进行更改,但是得到了相同的结果。
我的主要问题是,我做错了什么?如何使auth_state
正常工作?
或者,我是否只是在解决所有错误,是否应该停止使用someUser
,并启用其他方式的轻松内核共享?