[บันทึกกันลืม] JupyterHub Authenticated with OIDC

ต่อจากตอนที่แล้ว [บันทึกกันลืม] 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 ได้ตามปรกติ

หวังว่าจะเป็นประโยขน์ครับ

Leave a Comment

This site uses Akismet to reduce spam. Learn how your comment data is processed.