Unable to Access Authenticate Function in Custom Authenticator

Description:
I’m currently working on an application where I need to retrieve username details from a URL using a certain encoding format. To achieve this, I’m using a custom authenticator within Z2JH kubernets setup under extra config. Here’s the relevant code snippet:

  extraConfig:
    custom_login.py: |
      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):
          print("Entered into authentication")
          username = handler.get_argument("username", default="")
          password = handler.get_argument("password", default="")
          if username == "user" and password == "password":
            # Return a dictionary with user information
            return {
                'name': username,
            }
          else:
            return None  # Authentication failed
          
      c.JupyterHub.authenticator_class = MyAuthenticator

However, I’m encountering difficulties accessing the authenticate function. I’ve ensured that the necessary ‘username’ and ‘password’ fields are present in the data parameter, but I’m still unable to make it work.
using url like
http://192.168.49.2:30268/hub/login?next=&username=user&password=password
I observed logs to see print output and written some syntax error inside authenticate function still it is not detecting.

Could anyone provide insights into why I might be facing this issue? Any help would be greatly appreciated!

Could you share your logs? What errors are you getting?

It is not giving any error related logs.
Due to the absence of relevant logs and the lack of detection of the authenticate function, I realized the function might not be detected.

[I 2023-08-22 08:14:05.344 JupyterHub log:186] 200 GET /hub/login?next=&username=user&password=password (@::ffff:10.244.0.1) 1.44ms
[D 2023-08-22 08:14:05.383 JupyterHub log:186] 200 GET /hub/health (@10.244.0.1) 0.58ms
[D 2023-08-22 08:14:07.384 JupyterHub log:186] 200 GET /hub/health (@10.244.0.1) 0.97ms
[D 2023-08-22 08:14:09.383 JupyterHub log:186] 200 GET /hub/health (@10.244.0.1) 0.96ms
[D 2023-08-22 08:14:11.383 JupyterHub log:186] 200 GET /hub/health (@10.244.0.1) 0.91ms
[D 2023-08-22 08:14:13.383 JupyterHub log:186] 200 GET /hub/health (@10.244.0.1) 0.89ms

still in the same login page

I think the issue is that /hub/login must do a POST request with user credentials to trigger auth flow. That is why you authenticate function never gets called.

Then what changes should I make?

You must do a POST request to /hub/login<url_params> instead of GET.

Thankyou, now I can able detect authenticate function with POST request.

But How Can I make a POST request from another server and skip the login page?
In browser it is taking default GET request.

What are you exactly trying to achieve? There are other ways to do authentication. Check documentation.

I have a server that authenticates a user with his or her institutional login. After logging into the institution server/website, the users’ data are encoded – only some details to identify the user. They are then redirected to a the jupyterhub domain in the following way https://<mydomain>/hub/login?data=<here go the encrypted data>

Now, if a request gets sent like this to my jupyterhub-domain, I’d like to decrypt the submitted data, and authenticate the user.

Well, it seems to me that you should use OpenID connect, SAML flow or JWT based auth to achieve depending on your institutional SSO. There are authenticators available on JupyterHub GitHub wiki. Maybe they can help you!

1 Like

Thank you, for your inputs @mahendrapaipuri
I successfully fulfilled my requirements by employing the auto_login method in conjunction with the authenticate method.