如何使用json web token(JWT)验证JupyterHub用户?

时间:2017-02-07 08:26:47

标签: jupyterhub

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

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

1 个答案:

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

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