6

我试图找出使用 JWT 验证 JupyterHub 用户的最佳方法。在我的特定用例中,客户端将首先在主网站上进行身份验证,并在稍后阶段重定向到 JupyterHub 代理(两个站点都托管在同一个域后面)。这个想法是完全绕过 JupyterHub 登录屏幕并允许用户访问他的笔记本(前提是 HTTP 请求的 Authorization 标头中提供了有效的 JWT 令牌)。一旦用户登录到主站点,就会生成 JWT 令牌。

任何关于如何实现这一点的指针/建议将不胜感激!我的猜测是我需要编写一个自定义身份验证器来验证 JWT。但是,我不确定如何配置整个过程。谢谢!

4

1 回答 1

2

我有一个类似的要求,要从我的应用程序中使用 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 参数并以该特定用户身份登录。如果我们使用带有 SSO 的 Apache httpd 服务器,这将非常有用。

我修改了这个插件来执行一个简单的登录。这是一个非常基本的。我只是作为一个例子来解释这个。您可以根据自己的要求进行修改。修改后的代码如下。

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 打开笔记本

您可以根据需要修改此功能。这只是一个例子。我们可以添加修改它以启用更安全的登录。

于 2018-04-04T08:58:53.520 回答