Jupyterhub 自定义身份验证器

Jupyterhub Custom Authenticator

我有点难以为 jupyterhub 编写自定义身份验证器。很可能是因为我不了解可用 REMOTE_USER authenticator. 的内部工作原理,我不确定它是否适用于我的情况......无论如何......这就是我想做的:

我的总体想法: 我有一个服务器,可以使用他或她的机构登录名对用户进行身份验证。登录机构 server/website 后,用户的数据被编码——只有一些细节可以识别用户。然后通过以下方式将它们重定向到 jupyterhub 域 https://<mydomain>/hub/login?data=<here go the encrypted data>

现在,如果请求像这样发送到我的 jupyterhub 域,我想解密提交的数据,并对用户进行身份验证。

我的试用期: 我用下面的代码试了一下。但似乎我太笨了......:D 所以,欢迎迂腐的评论:D

from tornado import gen
from jupyterhub.auth import Authenticator

class MyAuthenticator(Authenticator):
    login_service = "my service"
    authenticator_login_url="authentication url"
    @gen.coroutine
    def authenticate(self,handler,data=None):
        # some verifications go here
        # if data is verified the username is returned

我的第一个问题...单击登录页面上的按钮,没有将我重定向到我的身份验证 URL...似乎已设置登录模板中的变量 authenticator_login_url其他地方...

第二个问题...向...发出的请求.../hub/login?data=...未被验证器评估(似乎...)

所以:有人可以提示我如何处理这个问题吗?

如您所见,我遵循了此处的教程: https://universe-docs.readthedocs.io/en/latest/authenticators.html

所以下面的代码可以完成这项工作,但是,我总是乐于改进。

因此,我所做的是将空登录尝试重定向到登录-url 并拒绝访问。如果提供了数据,请检查数据的有效性。如果通过验证,用户可以登录。

from tornado import gen, web
from jupyterhub.handlers import BaseHandler
from jupyterhub.auth import Authenticator

class MyAuthenticator(Authenticator):
    login_service = "My Service"

    @gen.coroutine
    def authenticate(self,handler,data=None):
        rawd = None

       # If we receive no data we redirect to login page
       while (rawd is None):
           try:
               rawd = handler.get_argument("data")
           except:
               handler.redirect("<The login URL>")
               return None

       # Do some verification and get the data here.
       # Get the data from the parameters send to your hub from the login page, say username, access_token and email. Wrap everythin neatly in a dictionary and return it.

       userdict = {"name": username}
       userdict["auth_state"] = auth_state = {}
       auth_state['access_token'] = verify
       auth_state['email'] = email

       #return the dictionary
       return userdict

只需将文件添加到 Python 路径,以便 Jupyterhub 能够找到它并在您的 jupyterhub_config.py 文件中进行必要的配置。