我试图找出使用JWT验证JupyterHub用户的最佳方法。在我的特定用例中,客户端将首先在主网站上进行身份验证,并在稍后阶段重定向到JupyterHub代理(两个站点都托管在同一个域之后)。我们的想法是完全绕过JupyterHub登录屏幕,并允许用户访问他的笔记本(前提是HTTP请求的授权标头中有一个有效的JWT令牌)。一旦用户登录到主站点,就会生成JWT令牌。
如何实现这一点的任何指针/建议将不胜感激!我的猜测是我需要编写一个自定义验证器来验证JWT。但是,我不确定如何配置整个过程。 谢谢!
答案 0 :(得分:0)
我有类似的要求从我的应用程序中使用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'))
此插件检查请求标头中的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 - >这将为用户打开笔记本电脑
http://jupyterhuburl:port/hub/login?user=demouser - >这将为用户demouser打开笔记本
您可以根据自己的要求修改此功能。这只是一个例子。我们可以添加修改此选项以启用更安全的登录。