ต่อจากตอนที่แล้ว [บันทึกกันลืม] JupyterHub ด้วย Docker
คราวนี้ ถ้าต้องการให้ ยืนยันตัวตนด้วย OpenID เช่น PSU Passport เป็นต้น ก็ให้ทำดังนี้
ในไฟล์ jupyterhub_config.py ใส่ configuration ประมาณนี้
c = get_config() #noqa
c.Authenticator.allow_all = True
c.JupyterHub.authenticator_class = "generic-oauth"
c.JupyterHub.spawner_class = 'jupyterhub.spawner.LocalProcessSpawner'
c.Spawner.new_user = True
import pwd
import subprocess
def pre_spawn_hook(spawner):
username = spawner.user.name
try:
pwd.getpwnam(username)
except KeyError:
import subprocess
subprocess.check_call(['useradd', '-ms', '/bin/bash', username])
c.Spawner.pre_spawn_hook = pre_spawn_hook
c.Authenticator.admin_users=set(('admin'))
c.GenericOAuthenticator.client_id = "__client__id__"
c.GenericOAuthenticator.client_secret = "__client_secret__"
c.GenericOAuthenticator.redirect_uri = '/oauth2/callback'
c.GenericOAuthenticator.username_claim = 'preferred_username'
c.GenericOAuthenticator.authorize_url = "https://IDP_URL/application/o/authorize/"
c.GenericOAuthenticator.token_url = "https://IDP_URL/application/o/token/"
c.GenericOAuthenticator.userdata_url = "https://IDP_URL/application/o/userinfo/"
c.GenericOAuthenticator.scope = "openid email profile"
c.GenericOAuthenticator.grant_type = "authorization_code"
อธิบายเพิ่มเติมนิดนึง
- c.JupyterHub.authenticator_class = “generic-oauth”
ใช้ generic-oauth ในการยืนยันตัวตน - สร้าง pre_spawn_hook มา เพื่อให้สร้าง local user
- c.Spawner.pre_spawn_hook = pre_spawn_hook
จากนั้นบอก Spawner ให้ใช้ function pre_spawn_hook ข้างต้น - c.GenericOAuthenticator
ต่าง ๆ เหล่านั้น เป็น config ให้ระบบไปติดต่อ IdP - c.GenericOAuthenticator.redirect_uri = ‘/oauth2/callback’
อันนี้สำคัญ คือพอ Authenticate เสร็จก็ส่งมาที่นี่ เพื่อ เข้าสู่ระบบ - c.GenericOAuthenticator.username_claim = ‘preferred_username’
อันนี้ ระบุว่า จะเอา field อะไรเป็น username - ทำตามนี้แหล่ะ ลองมาแล้ว
จากนั้น
docker cp jupyterhub_config.py jupyterhub01:/srv/jupyterhub/jupyterhub_config.py
docker restart jupyterhub01
docker logs -f jupyterhub01
ถ้าทุกอยากเรียบร้อยดี ก็จะได้หน้าจอประมาณนี้ (อันนี้ทำเร็ว ๆ ยังไม่ได้ใส่ HTTPS)
เมื่อคลิก Sign in with OAuth2.0 ก็จะวิ่งไปหา IdP ที่ตั้งไว้ (ในที่นี้ใช้ Authentik ของหน่วยงาน ซึ่ง แยกออกจากของมหาวิทยาลัยอีกที — เดี๋ยวเขียนวิธีการทำอีกที)
ไหลไปเรื่อย ๆ ก็จะเจอหน้า Authentication ของมหาวิทยาลัย
แล้วก็กลับมาที่ IdP ของเรา
จากนั้นก็เข้าใช้งาน JupyterHub ได้ตามปรกติ
หวังว่าจะเป็นประโยขน์ครับ