diff --git a/app/models/clusters/applications/jupyter.rb b/app/models/clusters/applications/jupyter.rb
index 36c51522089bac12dc34d1494a4aa5917435f0a5..bd9c453e2a4cfe408a38eb43ec5b7b44dd2ae7bb 100644
--- a/app/models/clusters/applications/jupyter.rb
+++ b/app/models/clusters/applications/jupyter.rb
@@ -1,5 +1,7 @@
 # frozen_string_literal: true
 
+require 'securerandom'
+
 module Clusters
   module Applications
     class Jupyter < ApplicationRecord
@@ -80,6 +82,9 @@ def specification
             "secretToken" => secret_token
           },
           "auth" => {
+            "state" => {
+              "cryptoKey" => crypto_key
+            },
             "gitlab" => {
               "clientId" => oauth_application.uid,
               "clientSecret" => oauth_application.secret,
@@ -95,6 +100,10 @@ def specification
         }
       end
 
+      def crypto_key
+        @crypto_key ||= SecureRandom.hex(32)
+      end
+
       def project_id
         cluster&.project&.id
       end
diff --git a/changelogs/unreleased/jupyter_pre_spawn_hook_v2.yml b/changelogs/unreleased/jupyter_pre_spawn_hook_v2.yml
new file mode 100644
index 0000000000000000000000000000000000000000..c5918df8193d1c5db676b542ab7729f406865674
--- /dev/null
+++ b/changelogs/unreleased/jupyter_pre_spawn_hook_v2.yml
@@ -0,0 +1,5 @@
+---
+title: Pass user's identity and token from JupyterHub to user's Jupyter environment
+merge_request: 27314
+author: Amit Rathi
+type: added
diff --git a/vendor/jupyter/values.yaml b/vendor/jupyter/values.yaml
index 781d6e3042fba1bfb651aa05e0d16f1b575e216d..a5e13fdc104a29af033402f8858b8184f7a14e38 100644
--- a/vendor/jupyter/values.yaml
+++ b/vendor/jupyter/values.yaml
@@ -8,8 +8,28 @@ hub:
   extraConfig: |
     c.KubeSpawner.cmd = ['jupyter-labhub']
 
+    async def add_auth_env(spawner):
+      '''
+      We set user's id, login and access token on single user image to
+      enable repository integration for JupyterHub.
+      See: https://gitlab.com/gitlab-org/gitlab-ce/issues/47138#note_154294790
+      '''
+      auth_state = await spawner.user.get_auth_state()
+
+      if not auth_state:
+          spawner.log.warning("No auth state for %s", spawner.user)
+          return
+
+      spawner.environment['GITLAB_ACCESS_TOKEN'] = auth_state['access_token']
+      spawner.environment['GITLAB_USER_LOGIN'] = auth_state['gitlab_user']['username']
+      spawner.environment['GITLAB_USER_ID'] = str(auth_state['gitlab_user']['id'])
+
+    c.KubeSpawner.pre_spawn_hook = add_auth_env
+
 auth:
   type: gitlab
+  state:
+    enabled: true
 
 singleuser:
   defaultUrl: "/lab"