我正在尝试找出通过JWT验证JupyterHub用户的最佳方法。在我的特定用例中,客户端将首先在主网站上进行身份验证,并在以后阶段重定向到JupyterHub代理(两个站点都托管在同一域的后面)。这个想法将是完全绕过JupyterHub登录屏幕,并使用户能够访问他的Notebooks(前提是HTTP请求的Authorization header 中提供了有效的JWT token )。用户登录到主站点后,将生成JWT token 。
任何有关如何实现这一目标的指示/建议将不胜感激!我的猜测是,为了验证JWT,我需要编写一个自定义的身份验证器。但是,我不确定如何配置整个过程。
谢谢!
最佳答案
我有从我的应用程序中使用Jupyterhub的类似要求。我的要求是绕过Jupyterhub登录,并使用我的应用程序登录进入Jupyterhub。我检查了各种身份验证机制,但没有发现任何直接可用的内容。最后,我在一个自定义身份验证插件中进行了修改。细节在下面给出。
我修改了 jhub_remote_user_authenticator 插件。负责认证的主要功能如下。 (remote_user_auth.py)
class RemoteUserLoginHandler(BaseHandler):
def get(self):
header_name = self.authenticator.header_name
remote_user = self.request.headers.get(header_name, "")
if remote_user == "":
raise web.HTTPError(401)
else:
user = self.user_from_username(remote_user)
self.set_login_cookie(user)
self.redirect(url_path_join(self.hub.server.base_url, 'home'))
该插件检查请求 header 中的REMOTE_USER参数,并以该特定用户身份登录。如果我们将Apache httpd服务器与SSO一起使用,这将非常有用。
我修改了此插件以执行简单的登录。这是非常基本的。我在解释这个只是作为一个例子。您可以根据需要进行修改。修改后的代码如下。
class RemoteUserLoginHandler(BaseHandler):
def get(self):
remote_user = self.get_argument('user', None, True)
if remote_user == "":
raise web.HTTPError(401)
else:
user = self.user_from_username(remote_user)
self.set_login_cookie(user)
self.redirect(url_path_join(self.hub.server.base_url, 'home'))
现在,使用此修改后的插件,如果您使用参数user =访问jupyter hub,则将打开相应用户的笔记本。这也将绕过登录屏幕。
http://jupyterhuburl:port/hub/login?user=amal->这将为用户amal打开笔记本
http://jupyterhuburl:port/hub/login?user=demouser->这将为用户demouser打开笔记本
您可以根据需要修改此功能。这只是一个例子。我们可以添加修改此选项以启用更安全的登录。