Search results for: “openid”

  • วิธีเชื่อมต่อ OpenID กับ Moodle และการทำ Map field

    การตั้งค่าจะใช้ OAuth 2 services ซึ่งเป็น Built-in ของ Moodle เอง หรือสามารถลงปลั้กอินอื่นๆ ที่รองรับ OAuth2 ในตัวอย่างนี้จะใช้ Moodle 4.5.10+ (Build: 20260306)

    จากนั้นกดปุ่ม Custom

    ตั้งค่า OAuth

    ใส่ข้อมูลตามนี้

    Nameตั้งชื่อช่องทาง Login
    Client IDClient ID ที่ได้จากการขอ OpenID
    Client SecretClient Secret ที่ได้จากการขอ OpenID
    Service base urlURL ที่เป็น /.well-known/openid-configuration
    Logo URLใส่หรือไม่ใส่ก็ได้
    Scope ทั้งสองช่องemail openid psu_profile name profile
    ติ๊กถูกI understand that disabling email verification can be a security issue.

    ตั้งค่า Map field

    กด User field mappings บน Service ที่ตั้งค่าไว้ ตั้งค่าตามนี้

    External field nameInternal field name
    display_name_thdescription
    emailemail
    first_namefirstname
    preferred_usernameidnumber
    office_name_thinstitution
    last_namelastname
    usernameusername

    ตั้งค่า IP

    เข้าไปในหน้า HTTP security URL: /admin/settings.php?section=httpsecurity

    ตรวจสอบว่ามี Block IP 10.0.X.X ในรายการหรือไม่ ถ้ามี ให้เอาออก

    ทดสอบ Login

    ปิดการใช้งาน User/pass (optional)

    เข้า URL /admin/settings.php?section=manageauths หรือ Plugins > Authentication > Manage authentication แล้วเปิดแค่ OAuth 2

    ขอบคุณ คุณสุวัฒน์ อนันตคุณูปกร สำหรับ Server ทดสอบ Moodle และแนวทางตั้งค่า OAuth2

  • Library ที่ใช้ในการเชื่อมต่อ OpenID สำหรับภาษาต่างๆ

    Library ที่ใช้ในการเชื่อมต่อ OpenID สำหรับภาษาต่างๆ

    การนำ OpenID Connect (OIDC) ไปใช้งานนั้น ไม่จำเป็นต้องเขียน OAuth Flow เองตั้งแต่ต้น เพราะ OIDC เป็นมาตรฐานเปิดที่มี library สำเร็จรูปรองรับในทุกภาษาหลัก ไม่ว่าจะเป็น PHP เวอร์ชันเก่า (5.3+), .NET Framework, Java, Python, Node.js, Ruby หรือ Go ให้หา Library ที่รองรับ OpenID มาลองใช้งานได้เลยครับ

    ด้านล่างนี้คือรายการ Library ที่คัดเลือกมาแล้วว่าเสถียรและมี Document ที่ยังใช้งานได้จริงในปี 2026

    ภาษา + VersionLibrary LinkDocument Link
    PHP 5.4 – 5.6 (Legacy)jumbojett/OpenID-Connect-PHP (v0.8.0)v0.8.0 README
    PHP 7.4 – 8.x+jumbojett/openid-connect-phpOfficial Github README
    Node.js 18.x – 22.x+openid-clientDetailed API Docs
    .NET Framework 4.5 – 4.8Microsoft.Owin.Security.OpenIdConnectKatana Project Wiki
    .NET 6.0 / 8.0+ (Core)Microsoft.AspNetCore.Authentication.OpenIdConnectMS Learn: OIDC Authentication
    Python 3.8+ (Django/FastAPI)AuthlibAuthlib OIDC Client Docs
    Java (Spring Boot 3.x+)Spring Security OAuth2 ClientSpring Security Reference
    Go 1.20+coreos/go-oidc/v3Go Packages Documentation
    Ruby 3.x+openid_connectGitHub Wiki / Usage

    เรื่อง Scope, Return value ดูจาก คู่มือการเชื่อมต่อ OpenID Connect กับ PSUSSO (Authentik)

  • คู่มือการเชื่อมต่อ OpenID Connect ด้วย Pure PHP 2026

    คู่มือการเชื่อมต่อ OpenID Connect ด้วย Pure PHP 2026

    คำแนะนำการติดตั้งและใช้งาน OpenID Connect ใน PHP 8.0+ แบบดั้งเดิม พร้อมตัวอย่างการใช้งานจริง

    ขั้นตอนการติดตั้งและใช้งาน

    เตรียมสภาพแวดล้อมและ Dependencies

    ติดตั้ง dependencies ที่จำเป็นสำหรับ OpenID Connect:

    1.1 ติดตั้ง Composer:
    curl -sS https://getcomposer.org/installer | php
    php composer.phar require league/oauth2-client firebase/php-jwt guzzlehttp/guzzle
    1.2 ติดตั้ง PHP Extensions:
    # Ubuntu/Debian
    sudo apt-get install php-curl php-json php-openssl php-mbstring
    
    # CentOS/RHEL
    sudo yum install php-curl php-json php-openssl php-mbstring
    
    # Windows (แก้ไข php.ini)
    extension=curl
    extension=openssl
    extension=mbstring
    1.3 โครงสร้างโฟลเดอร์:
    openid-php/
    ├── config/
    │   └── config.php
    ├── src/
    │   ├── OpenIDClient.php
    │   ├── SessionManager.php
    │   └── Database.php
    ├── templates/
    │   ├── login.php
    │   ├── dashboard.php
    │   └── error.php
    ├── composer.json
    ├── index.php
    └── logout.php

    สร้าง OpenID Client Class

    สร้างคลาสสำหรับจัดการ OpenID Connect ด้วย League OAuth2 Client:

    2.1 src/OpenIDClient.php:
    <?php
    
    namespace App;
    
    use League\OAuth2\Client\Provider\GenericProvider;
    use League\OAuth2\Client\Grant\AuthorizationCode;
    use Firebase\JWT\JWT;
    use Firebase\JWT\Key;
    
    class OpenIDClient
    {
        private $provider;
        private $config;
        
        public function __construct($config)
        {
            $this->config = $config;
            
            $this->provider = new GenericProvider([
                'clientId'                => $config['client_id'],
                'clientSecret'            => $config['client_secret'],
                'redirectUri'             => $config['redirect_uri'],
                'urlAuthorize'            => $config['auth_url'],
                'urlAccessToken'          => $config['token_url'],
                'urlResourceOwnerDetails' => $config['userinfo_url'],
            ]);
        }
        
        public function getAuthorizationUrl($state = null)
        {
            $options = [
                'scope' => 'openid profile email psu_info',
            ];
            
            if ($state) {
                $options['state'] = $state;
            }
            
            return $this->provider->getAuthorizationUrl($options);
        }
        
        public function getAccessToken($authorizationCode)
        {
            try {
                $accessToken = $this->provider->getAccessToken('authorization_code', [
                    'code' => $authorizationCode
                ]);
                
                return [
                    'access_token' => $accessToken->getToken(),
                    'refresh_token' => $accessToken->getRefreshToken(),
                    'expires' => $accessToken->getExpires(),
                    'id_token' => $accessToken->getValues()['id_token'] ?? null
                ];
            } catch (\Exception $e) {
                throw new \Exception('Error getting access token: ' . $e->getMessage());
            }
        }
        
        public function getResourceOwner($token)
        {
            try {
                return $this->provider->getResourceOwner($token)->toArray();
            } catch (\Exception $e) {
                throw new \Exception('Error getting resource owner: ' . $e->getMessage());
            }
        }
        
        public function validateIdToken($idToken)
        {
            try {
                $decoded = JWT::decode($idToken, 
                    new Key($this->config['client_secret'], 'HS256')
                );
                return (array) $decoded;
            } catch (\Exception $e) {
                throw new \Exception('Invalid ID Token: ' . $e->getMessage());
            }
        }
    }

    ตัวอย่างการใช้งาน (Usage Example)

    ตัวอย่างสมบูรณ์การใช้งาน OpenID Connect ในแอปพลิเคชัน:

    3.1 index.php – ตัวอย่างการใช้งาน:
    <?php
    
    require_once 'vendor/autoload.php';
    require_once 'config/config.php';
    require_once 'src/OpenIDClient.php';
    
    use App\OpenIDClient;
    
    // สร้าง client
    $client = new OpenIDClient($config);
    
    // สร้าง state สำหรับ CSRF protection
    $state = bin2hex(random_bytes(16));
    session_start();
    $_SESSION['openid_state'] = $state;
    
    // สร้าง authorization URL
    $authUrl = $client->getAuthorizationUrl($state);
    
    echo "<a href='{$authUrl}' class='btn btn-primary'>Login with PSU</a>";
    3.2 callback.php – จัดการ response:
    <?php
    
    require_once 'vendor/autoload.php';
    require_once 'config/config.php';
    require_once 'src/OpenIDClient.php';
    
    use App\OpenIDClient;
    
    session_start();
    
    try {
        // ตรวจสอบ state
        if (!isset($_GET['state']) || $_GET['state'] !== $_SESSION['openid_state']) {
            throw new \Exception('Invalid state parameter');
        }
        
        $client = new OpenIDClient($config);
        
        // รับ access token
        $tokenData = $client->getAccessToken($_GET['code']);
        
        // รับข้อมูลผู้ใช้
        $user = $client->getResourceOwner($tokenData['access_token']);
        
        // ตรวจสอบ ID token
        if ($tokenData['id_token']) {
            $claims = $client->validateIdToken($tokenData['id_token']);
            echo "ID Token Claims: " . print_r($claims, true);
        }
        
        // เก็บข้อมูลผู้ใช้
        $_SESSION['user'] = $user;
        $_SESSION['access_token'] = $tokenData['access_token'];
        
        echo "Login Successful! User: " . $user['name'];
        
    } catch (\Exception $e) {
        echo "Error: " . $e->getMessage();
    }
    ต้องการความช่วยเหลือเพิ่มเติม?

    หากคุณมีเอกสาร คู่มือ หรือข้อเสนอแนะที่ต้องการแบ่งปันให้กับนักพัฒนาท่านอื่น สามารถส่งข้อมูลได้ที่: arafan.h@psu.ac.th (9045)

  • คู่มือการตั้งค่า OpenID สำหรับ WordPress

    คู่มือการตั้งค่า OpenID สำหรับ WordPress

    ขั้นตอนการตั้งค่า

    ขอรับข้อมูลสำหรับเชื่อมต่อ OpenID

    ในขั้นตอนแรก คุณต้องขอรับข้อมูลสำหรับเชื่อมต่ OpenID จากทีม DIIS ดังนี้:

    1. เข้าไปที่ลิงก์:https://diisform.psu.ac.th/th/forms/auth-system-openid
    2. กรอกข้อมูลในแบบฟอร์มให้ครบถ้วน
    3. รอการอนุมัติและรับข้อมูล Client ID และ Client Secret

    คำแนะนำ: ควรเตรียมข้อมูลโดเมนของเว็บไซต์ WordPress ของคุณไว้ก่อนกรอกแบบฟอร์ม

    ตั้งค่า Callback URL

    Callback URL คือที่อยู่ที่ระบบจะส่งผู้ใช้กลับมาหลังจากเข้าสู่ระบบผ่าน PSUSSO

    รูปแบบ Callback URL:

    https://<โดเมนของคุณ>/wp-admin/admin-ajax.php?action=openid-connect-authorize

    ตัวอย่าง: https://example.com/wp-admin/admin-ajax.php?action=openid-connect-authorize

    ให้ใช้ Callback URL นี้ในการขอรับข้อมูล OpenID ในขั้นตอนที่ 1

    ติดตั้งปลั๊กอิน OpenID

    ติดตั้งปลั๊กอินเพื่อเชื่อมต่อกับระบบ OpenID:

    1. เข้าสู่ระบบผู้ดูแลระบบ WordPress ของคุณ
    2. ไปที่เมนู ปลั๊กอิน → เพิ่มปลั๊กอินใหม่
    3. ค้นหาชื่อปลั๊กอิน: OpenID Connect Generic Client
    4. กดปุ่ม ติดตั้งเดี๋ยวนี้ แล้ว เปิดใช้งาน

    หรือดาวน์โหลดได้ที่: ดาวน์โหลดจาก WordPress.org

    ตั้งค่าปลั๊กอิน

    หลังจากติดตั้งปลั๊กอินแล้ว ให้ทำการตั้งค่าดังนี้:

    1. ไปที่เมนู ตั้งค่า → OpenID Connect Generic
    2. กรอกข้อมูลตามตารางด้านล่าง
    3. กดปุ่ม บันทึกการเปลี่ยนแปลง

    รายละเอียดการตั้งค่าปลั๊กอิน

    ชื่อการตั้งค่าค่าที่ต้องตั้งคำอธิบาย
    Login Typeอย่าเพิ่งเลือก Auto Login – SSO*ระบบ Login อัตโนมัติผ่าน PSUSSO
    Client ID${OIDC_ID}ใส่ Client ID ที่ได้รับจาก DIIS
    Client Secret Key${OIDC_SECRET}ใส่ Client Secret ที่ได้รับจาก DIIS
    OpenID Scopeopenid email profileข้อมูลที่ต้องการขอจากระบบ PSUSSO
    Login Endpoint URLhttps://psusso.psu.ac.th/application/o/authorize/URL สำหรับเข้าสู่ระบบ
    Userinfo Endpoint URLhttps://psusso.psu.ac.th/application/o/userinfo/URL สำหรับดึงข้อมูลผู้ใช้
    Token Validation Endpoint URLhttps://psusso.psu.ac.th/application/o/token/URL สำหรับตรวจสอบ Token
    End Session Endpoint URLhttps://psusso.psu.ac.th/application/o/<APP_NAME>/end-session/URL สำหรับออกจากระบบ
    Enable Refresh Tokenuncheckedไม่ต้องเลือก
    Link Existing Userscheckedเชื่อมโยงผู้ใช้ที่มีอยู่แล้ว
    Create user if does not existcheckedสร้างผู้ใช้ใหม่ถ้ายังไม่มีในระบบ
    Redirect Back to Origin Pagecheckedกลับไปหน้าเดิมหลัง Login
    Redirect to the login screen when session is expiredcheckedไปหน้า Login เมื่อ Session หมดอายุ

    คำเตือนเรื่อง Login Type

    ข้อควรระวังสำคัญ:

    • อย่าเลือก “Auto Login – SSO” ในครั้งแรก
    • ต้องทดสอบให้แน่ใจก่อนว่า OpenID ทำงานได้จริง
    • ถ้าตั้งค่าผิด คุณอาจไม่สามารถเข้าหน้า Admin ได้!

    วิธีแก้ไข: หากเข้า Admin ไม่ได้ ต้องไปปิดปลั๊กอินผ่าน FTP หรือ File Manager

    วิธีการทดสอบระบบ

    1. เข้าหน้า Login ของ WordPress: http://โดเมนของคุณ/wp-admin
    2. ควรจะปรากฏปุ่ม Login ด้วย PSUSSO
    3. ทดสอบกด Login เพื่อเชื่อมต่อกับระบบ PSUSSO
    4. ตรวจสอบว่าสามารถ Login ได้สำเร็จและเข้าสู่ระบบ WordPress ได้
    5. ผู้ใช้จะถูกสร้างขึ้นอัตโนมัติถ้ายังไม่มีในระบบ (ตามการตั้งค่า)

    การเปิดใช้งาน Auto Login

    เมื่อทดสอบและยืนยันว่าระบบทำงานได้ปกติ:

    1. กลับไปที่หน้าตั้งค่าปลั๊กอิน
    2. เปลี่ยน Login Type เป็น “Auto Login – SSO”
    3. บันทึกการเปลี่ยนแปลง
    4. ทดสอบอีกครั้งว่าระบบ Redirect ไปยัง PSUSSO โดยอัตโนมัติ
  • คู่มือการเชื่อมต่อ OpenID Connect กับ PSUSSO (Authentik)

    คู่มือการเชื่อมต่อ OpenID Connect กับ PSUSSO (Authentik)

    คำแนะนำการใช้งาน OpenID Connect สำหรับการยืนยันตัวตน

    ข้อมูลสำหรับทดสอบ (Client ID, Client Secret) ติดต่อทาง Microsoft Teams arafan.h@psu.ac.th

    ลิ้งก์แบบฟอร์ม ขอใช้บริการระบบยืนยันตัวตน (สำหรับเชื่อมต่อ OpenID)

    ข้อมูลสำคัญ OpenID Connect

    รายการค่า/URL
    Authorization Endpointhttps://psusso.psu.ac.th/application/o/authorize/
    Token Endpointhttps://psusso.psu.ac.th/application/o/token/
    UserInfo Endpointhttps://psusso.psu.ac.th/application/o/userinfo/
    Logout Endpointhttps://psusso.psu.ac.th/application/o/[APP_NAME]/end-session/
    JWKS URIhttps://psusso.psu.ac.th/application/o/[APP_NAME]/jwks/
    Issuerhttps://psusso.psu.ac.th/application/o/[APP_NAME]/

    การตั้งค่า Client Application

    ลงทะเบียนแอปพลิเคชัน

    กรอกข้อมูลขอ OpenID และกำหนด Permission ที่ต้องการในลิงก์ด้านบน

    ข้อมูลที่จะได้รับหลังจากลงทะเบียน:
    รายการค่าที่ได้รับ
    Client IDclient_id_1234567890
    Client Secretclient_secret_1234567890
    OpenID Configuration URLhttps://psusso.psu.ac.th/application/o/[APP_NAME]/.well-known/openid-configuration

    OAuth 2.0 Authorization Code Flow

    ทุกภาษาสามารถใช้ Library สำเร็จรูปได้ หรือหากต้องการเขียน Authen flow เอง สามารถนำวิธีไปปรับใช้ตามภาษาที่ถนัด

    ขั้นตอนการทำงานของ OAuth 2.0 Authorization Code:

    Step 1: สร้าง URL สำหรับขออนุญาต
    GET https://psusso.psu.ac.th/application/o/authorize/?
      response_type=code&
      client_id=CLIENT_ID&
      redirect_uri=REDIRECT_URI&
      scope=openid profile email psu_profile&
      state=RANDOM_STRING
    Step 2: รับ Authorization Code

    หลังจากผู้ใช้เข้าสู่ระบบสำเร็จ ระบบจะ redirect กลับมาพร้อม Authorization Code: https://yourapp.com/callback?code=AUTH_CODE&state=RANDOM_STRING

    Step 3: แลกเปลี่ยน Authorization Code เป็น Access Token
    POST https://psusso.psu.ac.th/application/o/token/
    Content-Type: application/x-www-form-urlencoded
    
    grant_type=authorization_code&
    code=AUTH_CODE&
    redirect_uri=REDIRECT_URI&
    client_id=CLIENT_ID&
    client_secret=CLIENT_SECRET
    Step 4: รับข้อมูลผู้ใช้
    GET https://psusso.psu.ac.th/application/o/userinfo/
    Authorization: Bearer ACCESS_TOKEN

    Supported Scopes และ Claims

    Supported Scopes

    Scopes ที่รองรับในระบบ OpenID Connect:

    • psu_profile – ข้อมูลโปรไฟล์ PSU แบบละเอียด
    • email – ข้อมูลอีเมลผู้ใช้
    • offline_access – ขอ Refresh Token
    • openid – สำหรับ OpenID Connect
    • profile – ข้อมูลโปรไฟล์พื้นฐาน
    Claims Supported

    Claims ทั้งหมดที่รองรับในระบบ:

    Claimคำอธิบายตัวอย่าง
    subรหัสประจำตัวผู้ใช้1234567890
    issIssuer ของ tokenhttps://psusso.psu.ac.th/application/o/[APP_NAME]/
    audAudience ของ tokenclient_id
    expExpiration time1735689599
    iatIssued at time1735685999
    auth_timeเวลาที่ผู้ใช้ทำการยืนยันตัวตน1735685999
    acrAuthentication Context Class Referenceurn:mace:incommon:iap:silver
    amrAuthentication Methods References["pwd"]
    nonceค่า nonce จากการขอ tokenn-0S6_WzA2Mj
    emailอีเมลsomchai.j@psu.ac.th
    nameชื่อเต็มสมชาย ใจดี
    preferred_usernameชื่อผู้ใช้ที่ต้องการแสดงsomchai.j
    usernameชื่อผู้ใช้งานในระบบsomchai.j
    display_nameชื่อแสดงสมชาย ใจดี
    display_name_thชื่อแสดงภาษาไทยสมชาย ใจดี
    first_nameชื่อSomchai
    first_name_thชื่อภาษาไทยสมชาย
    last_nameนามสกุลJaidee
    last_name_thนามสกุลภาษาไทยใจดี
    position_thตำแหน่งภาษาไทยนักวิชาการคอมพิวเตอร์
    campus_thวิทยาเขตภาษาไทยวิทยาเขตหาดใหญ่
    department_thภาควิชาภาษาไทยฝ่ายระบบโครงสร้างพื้นฐาน
    faculty_thคณะภาษาไทยสำนักนวัตกรรมดิจิทัลและระบบอัจฉริยะ
    office_name_thชื่อสำนักงานภาษาไทยฝ่ายระบบโครงสร้างพื้นฐาน สำนักนวัตกรรมดิจิทัลและระบบอัจฉริยะ
    groupsกลุ่มผู้ใช้["xxx", "yyy"]
    faculty_idรหัสคณะ01
    department_idรหัสภาควิชา0103
    campus_idรหัสวิทยาเขต1
    psu_idรหัสบุคลากร00XXXXX
    account_typeประเภทบัญชีStaff, Student, Professor, Alumni

    วิธีการแยก Staff/Student ให้แยกจาก List ของ groups

    • นักศึกษา = student
    • ศิษย์เก่า =alumni
    • บุคลากร = staff
    • อาจารย์ staff in groups และ position_th = “อาจารย์”

    ตัวอย่างการเช็คสิทธิ์ (Python)

    • นักศึกษา if “student” in groups:
    • อาจารย์ if “staff” in groups and position_th == “อาจารย์”
    
    
    
    
    
    ต้องการความช่วยเหลือเพิ่มเติม?

    หากคุณมีเอกสาร คู่มือ หรือข้อเสนอแนะที่ต้องการแบ่งปันให้กับนักพัฒนาท่านอื่น สามารถส่งข้อมูลได้ที่: arafan.h@psu.ac.th (9045)

    หมายเหตุ CitizenID จะไม่ได้รับเป็นค่าพื้นฐาน หากแอปพลิเคชันใดจำเป็นต้องใช้ ให้แจ้งเพิ่มเติม ในฟอร์มขอใช้บริการ

  • [บันทึกกันลืม] 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 ได้ตามปรกติ

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

  • Install from scratch – licensing (2)

    ใช้ plugin ชื่อว่า WPO365 วิธีการตั้งค่าเพื่อใช้งาน single sign on ของ Microsoft365 ในการล็อคอินเข้าระบบของ WordPress

    Authentication
    1. ต้องเซ็ต HTTPS ที่เว็บให้เสร็จเรียบร้อย
    2. สำคัญ!!! จำเป็นต้องมีสิทธิ์ Global Administrator บน Azure
    3. Login เข้าเว็บ https://portal.azure.com มองหา Azure Active Directory
    4. ซ้ายมือเลื่อนหาคำว่า App registrations
    5. คลิก + New registration แล้วกรอกชื่อที่ต้องการในช่อง Name ในส่วนของ Supported account types เลือก Accounts in this organizational directory only (Prince of Songkla University only – Single tenant)
    1. เลื่อนลงมาจนเจอคำว่า Redirect URI (Optional) เลือก Web ในช่อง select platform และกรอกชื่อเว็บ https://licensing.psu.ac.th/wp-admin/ ลงไปในช่องถัดมา แล้วคลิก Register
    1. หน้าถัดไป คลิก Token configuration บนเมนูซ้ายมือ จากนั้นคลิก + Add optional claim เลือก Token Type เป็น ID และเลือกหัวข้อด้านล่าง ดังนี้ email, family_name, given_name และ upn แล้วคลิกปุ่ม Add จะมีให้ Add optional claim เพิ่ม ให้ติ๊กถูกแล้วกด Turn on the Microsoft Graph email, profile permission (required for claims to appear in token). แล้ว Add จะได้
    1. คลิก API permissions ที่เมนูซ้ายมือ แล้วคลิก + Add permission คลิก Microsoft Graph แล้วคลิก Delegated และเลือกหัวข้อดังต่อไปนี้ (พิมพ์ในช่อง Search ได้เลย) email, offline_access, openid และ profile แล้วคลิก Add permissions

    จากนั้นคลิก Grant admin consent for Prince of Songkla University แล้วคลิก Yes

    1. คลิก Certificates & Secrets ที่เมนูซ้ายมือ คลิก  + New client secret ตั้งชื่อในช่อง Description และเลือกวันหมดอายุ คลิก Add จากนั้นให้ copy ค่าของช่อง Value เก็บไว้
    1. กลับมาที่ https://licensing.psu.ac.th หลังจากติดตั้งปลักอินชื่อ WPO365 | LOGIN และเปิดใช้งาน (activate) เรียบร้อยแล้ว
    2. คลิก WPO365 ที่ด้านซ้ายมือล่างสุด เปิดใช้งาน SINGLE SIGN-ON (SSO) แล้วคลิก configure
    3. กรอกข้อมูลดังนี้
      1. Select Identity Provider (IdP) เลือก Azure AD (default)
      2. Select SSO-protocol เลือก OpenID Connect (default)
      3. Select OpenID Connect flow เลือก Auth.-code flow (recommended)
      4. Application (Client) Secret นำค่าที่ copy เก็บไว้ในข้อ 9 มาใส่ช่องนี้
      5. Directory (tenant) ID นำค่าที่ได้จากหน้า Overview ของ lsc ชื่อฟิลด์ Directory (tenant) ID
      6. Application (Client) ID นำค่าที่ได้จากหน้า Overview ของ lsc ชื่อฟิลด์ Application (client) ID
      7. Redirect URI View in Azure Portal ใส่ว่า https://licensing.psu.ac.th/
      8. Domain hint View Custom domain names ใส่ว่า psu.ac.th, email.psu.ac.th
      9. Add prompt=select_account parameter ติ๊กถูก
      10. กด Save configuration ด้านล่าง แล้วจะมีหน้า Important ขึ้นมากด Confirm
    4. คลิกแท็บ User Registeration ด้านล่างกรอกดังนี้
      1. Custom domains View Custom domain names กรอก psu.ac.th และคลิก + เพิ่มอีกช่องพิมพ์ email.psu.ac.th
      2. เลื่อนลงมาล่างสุดกด Save configuration
    5. คลิกแท็บ Plugin self-test เลื่อนลงมาด้านล่าง กด Start self-test จะถูก redirect ไปหน้า log in ของ mail ให้ Log in ตามปกติ แล้วจะเด้งกลับมาหน้าของ https://licensing.psu.ac.th หากล็อคอินไม่ผ่านให้กลับไปหน้า https://portal.azure.com คลิก App registrations แล้วเลือก lsc แล้วคลิก Authentication คลิก Add URI เพิ่ม https://licensing.psu.ac.th เข้าไปอีก 1 url กด save กลับไปล็อคอินอีกครั้งน่าจะได้แล้ว
  • Cloud Computing การบริการประมวลผลจากเครื่องคอมพิวเตอร์บนเครือข่าย Internet

    “อะไรคือ Cloud Computing และมันน่าใช้ยังไง แล้วต้องเลือกแบบไหนถึงจะเหมาะกับองค์กร”

    • ขอขอบคุณข้อมูล Sipa จากการอบรม Cloud Computing รุ่นที่ 1
    • และขอขอบคุณข้อมูลจากท่านวิทยากร ผศ.ดร.ภุชงค์ อุทโยภาส ม.เกษตรศาสตร์

      แนวคิดและความหมายของ Cloud Computing

    cloud1

    Cloud Computing เป็นบริการประมวลผลจากเครื่องคอมพิวเตอร์บนเครือข่ายอินเทอร์เน็ต รวมถึงการ
    ใช้งานทรัพยากรเครื่องคอมพิวเตอร์ร่วมกันโดยไม่มีข้อจำกัด โดยสามารถเลือกปรับแต่งการใช้งานได้ตามต้องการ และสามารถเข้าถึงได้จากที่ใดก็ได้
    ซึ่งสามารถสรุปคุณสมบัติเป็นข้อ ๆ ตามคำนิยามของ NIST (National Institute of Standards and Technology) * ได้ดังนี้
    On-demand self-service – สามารถใช้งานทรัพยากรได้ตามที่ต้องการ
    Broad network access – สามารถเข้าถึงจากที่ใดก็ได้
    Resource pooling – สามารถนำทรัพยากรหลาย ๆ อย่างมารวมกันเพื่อใช้งานร่วมกัน
    Rapid elasticity – สามารถปรับเปลี่ยนได้ตลอดเวลาที่ต้องการ
    Measured Service – สามารถวัดปริมาณการใช้งานได้ทุกบริการ (เพื่อสามารถนำไปคิดค่าใช้จ่ายได้ด้วย)cloud2

    Reference : * The NIST Definition of Cloud Computing, http://nvlpubs.nist.gov/nistpubs/Legacy/SP/nistspecialpublication800-145.pdf

    สถาปัตยกรรม Cloud Ecosystem

    cloud3

    ตามคำนิยามของ NIST ได้มีการกำหนด Cloud Ecosystem หรือเรียกว่า Cloud Service Model ได้ 3 รูปแบบดังนี้
    Software As A Service (SAAS)
    เป็นบริการใช้งานซอฟต์แวร์ประยุกต์ (Application) ที่ผู้ให้บริการจัดหาให้ โดยสามารถเข้าถึงได้จาก
    Web Browser รวมถึง Application ทั้งที่อยู่ในเครื่องคอมพิวเตอร์หรืออุปกรณ์มือถือ การบริการรูปแบบนี้ผู้ใช้จะไม่สามารถจัดการเครื่องหรือระบบปฏิบัติการได้ ทุกอย่างผู้ให้บริการจัดการให้ทั้งหมด
    Platform As A Service (PAAS)
    เป็นบริการเครื่องมือสำหรับพัฒนาระบบ โดยผู้ใช้ไม่สามารถเข้าถึงการจัดการโครงสร้างพื้นฐานใด ๆ ได้ เช่นระบบเครือข่าย เครื่องเซิร์ฟเวอร์ ระบบปฏิบัติการ โดยผู้ให้บริการจะจัดการให้ทั้งหมด
    Infrastructure As A Service (IAAS)
    เป็นบริการที่ผู้ใช้สามารถจัดการระบบปฏิบัติการ ระบบเครือข่าย รวมถึงจัดหาโปรแกรมประยุกต์ เพื่อสามารถดูแลควบคุมการปรับแต่งระบบให้สามารถรองรับความต้องการที่หลากหลาย แต่การจัดหาทรัพยากร รวมถึงโครงสร้างพื้นฐานยังเป็น
    หน้าที่ของผู้ให้บริการจัดหาให้ตามความต้องการของผู้ใช้

    รูปแบบของการให้บริการ

    สามารถแบ่งรูปแบบการให้บริการ (Deployment Models) ออกแบบ 4 รูปแบบได้ดังนี้
    Private cloud
    เป็นการใช้งานระบบภายใต้โครงสร้างพื้นฐานขององค์กร ผู้ใช้อาจเป็นผู้ดูแลด้วยตนเอง หรือจ้างบุคคลที่สามดูแลก็ได้ อุปกรณ์อาจจะติดตั้งภายในสำนักงานหรืออยู่ภายนอกทั้งหมด หรือบางส่วนก็ได้
    Community cloud
    เป็นการใช้งานระบบภายใต้การร่วมการของกลุ่มสมาชิก โดยมีข้อปฏิบัติร่วมกัน ตามเงื่อนไขของรัฐ หรือขององค์กร โดยสมาชิกดูแลบริหารจัดการโครงสร้างด้วยสมาชิกเอง หรือทำผ่านบุคคลที่สาม โดยอุปกรณ์อาจจะติดตั้งภายในสถานที่ของชุมชน หรือนอกสถานที่ก็ได้
    Public cloud
    เป็นการใช้งานระบบร่วมกันกับสาธารณะชน องค์กรทั่วไปและกลุ่มองค์กรขนาดใหญ่ โดยผู้ให้บริการเป็นผู้ลงทุนโครงสร้างพื้นฐานไอทีและระบบซอฟต์แวร์ที่เกี่ยวข้องทั้งหมด
    Hybrid cloud
    เป็นการใช้งานผสมผสานระหว่าง Private cloud, Public cloud หรือ Hybrid cloud โดยขึ้นอยู่กับผู้ใช้บริการต้องการด้านใด โดยอาจจะทำงานเป็นอิสระ หรือมีการเชื่อมโยงเข้าหากัน แต่จะต้องสามารถทำงานร่วมกันในระดับข้อมูลและระบบซอฟต์แวร์ประยุกต์ได้ โดยการใช้งานทั่วไปมักจะใช้ Private cloud ก่อน จนเมื่อต้องการเพิ่ม Capacity ชั่วคราวจึงใช้ Public cloud เพิ่มเติม

    โครงสร้างของระบบ Cloud

    cloud4

    โดยมีการแบ่งออกเป็น Front End และ Back End เชื่อมต่อกันด้วยอินเทอร์เน็ต โดยแบ่งอุปกรณ์พื้นฐาน ได้ดังนี้
    1) Server
    2) Storage
    3) Network
    4) Cloud runtime ซึ่งจะเป็น Middleware ที่ใช้บริหารจัดการใน Back End
    ซึ่งจะมีระบบ Management และ Security ช่วยบริหารจัดการอุปกรณ์ต่าง ๆ ให้สามารถทำงานได้เป็น เนื้อเดียวกันและมีความปลอดภัยในการเข้าถึง

    บริการ Virtualization
    cloud8

    เมื่อก่อนระบบใดอยู่บนเครื่องใดแล้ว ถ้าเสียก็จะเสียไปด้วย ต้องหาเครื่องใหม่มาทดแทน โดยต้องทำการติดตั้งระบบใหม่ นำเข้าข้อมูลจากที่สำรองไว้ แถมเครื่องซื้อมาใช้งานไม่เต็มประสิทธิภาพ จึงมีการสร้างระบบ Virtualization ขึ้นมาเพื่อแก้ไขปัญหาดังกล่าวโดยจะมี Middleware ระหว่าง OS กับ Resource ที่เรียกว่า Virtualization software หรือ Hypervisor โดยข้อดีคือแต่ละบริการในเครื่องเดียวกันสามารถมี OS หรือ Application เป็นของตนเอง และแยกอิสระออกจากกัน สามารถติดตั้งโปรแกรมที่มีความต้องการเฉพาะได้ รวมถึงสามารถใช้พื้นที่กลางในการจัดเก็บข้อมูล เพื่อในกรณีที่เครื่องมีปัญหาสามารถย้ายไปรันเครื่องอื่นได้โดยกระทบต่อการบริการน้อยที่สุด ทำให้การใช้เครื่องเต็มประสิทธิภาพมากขึ้น โดยเราสามารถนำเครื่องที่มี Peak Load คนละช่วงเวลามารวมในเครื่องเดียวกันได้ โดยไม่กระทบต่อการให้บริการโดยรวม

    วิวัฒนาการของ Virtualization

    cloud9

    1st Generation : Full virtualization (Binary rewriting)
    – ใช้ Software จัดการทั้งหมด
    – มีปัญหาที่ต้องมีการ Compile กับ Kernel เมื่อมีการเปลี่ยน Kernel ใหม่จะไม่สามารถใช้งานต่อได้ ต้องทำการ Patch Kernel ก่อน
    2nd Generation : Paravirtualization
    – มีการเขียน Hypervisor ขึ้นมาคั่นก่อนเข้าถึง Hardware
    – ข้อเสียคือช้ากว่า 1st Gen และเมื่อผู้ผลิต CPU หรืออุปกรณ์อื่น ๆ ต้องการเพิ่ม Feature ไม่สามารถทำได้ทันทีต้องทำการแก้ Hypervisor ให้รองรับ Feature ใหม่ ๆ
    3rd Generation : Silicon-based (Hardware-assisted)
    – ไม่จำเป็นต้องแก้ Hypervisor ให้รองรับ Feature ใหม่ ๆ ผู้ผลิต CPU หรืออุปกรณ์อื่น ๆ ออกแบบให้รองรับ Virtualization มาให้เลย โดยมีการใส่เข้าไปในอุปกรณ์ให้เลย
    – ทำงานด้วย Hardware ทำให้รวดเร็วกว่า 2nd Gen

    ประโยชน์ของ Virtualization

    – สามารถใช้ Hardware ได้อย่างมีประสิทธิภาพ
    – ลดพื้นที่ของ Data Center ในการต้องวางเครื่องจำนวนเยอะที่ใช้งานได้ไม่เต็มประสิทธิภาพ (ประหยัดเครื่องลง)
    – ใช้พลังงานน้อยลง เพราะเครื่องมีจำนวนน้อยลง
    – สามารถเพิ่มเครื่องได้อย่างรวดเร็ว ไม่ต้องรอซื้อเครื่องนาน
    – สามารถสร้างระบบทดสอบ หรือเครื่องสำหรับพัฒนาได้ง่าย และรวดเร็ว

    การเลือกใช้บริการ Cloud

    cloud5

    ในส่วนของ Private cloud ในประเทศไทย มีการใช้งานเกิน 50% โดยมีความต้องการใช้งาน Vmware, Microsoft, Openstack ตามลำดับ

    โดยมีการใช้งาน SaaS เป็นหลักรองลงมาจะเป็น IaaS และ ทุกท้ายจะเป็น PaaS โดย เหตุผลหลักที่ใช้ Cloud คือต้องการลดค่าใช้จ่าย และมีความยืดหยุ่นนการใช้งาน ส่วนสาเหตุที่ใช้ Public cloud เนื่องมาจากราคาถูกกว่าลงทุนเองในระยะยาว และไม่ต้องซื้อเครื่องแพง ๆ ที่มี Peak Load แค่บางช่วง ช่วงที่ไม่ได้ใช้งานจะไม่คุ้มกับราคาที่ลงทุน

    บริการ Cloud ที่มีในปัจจุบัน

    Amazon AWS
    มีการให้บริการหลาย Service ดังนี้
    AWS Compute :
    – EC2 : ให้บริการ Virtual Machine
    – Elastic Load Balance (ELB) : ให้บริการกระจายโหลดระหว่าง EC2
    AWS Storage :
    – S3 : ให้บริการพื้นที่ Storage
    – Elastic Block Store : ให้บริการพื้นที่ Storage เพิ่มเติมสำหรับ EC2
    AWS Database :
    – Relational Database Service (RDS) : ให้บริการฐานข้อมูลประเภท Relational Database เช่น MySQL
    – DynamoDB : ให้บริการฐานข้อมูล NoSQL
    AWS Analytic :
    – Elastic MapReduce : ให้บริการ Big Data Processing
    AWS Machine Learning :
    บริการ Machine Learning
    AWS loT
    บริการ Internet of Things

     

    Google Cloud Platform

    cloud6Compute :
    – Compute Engine เป็นบริการ Virtual Maching
    – App Engine เป็นบริการแบบ PaaS
    Storage :
    – Cloud Storage เป็นบริการ Storage
    – Cloud SQL เป็นบริการฐานข้อมูล
    App Services :
    – ให้บริการ Application Service รวมถึง Development Application รวมถึง Cache Service

     

    Microsoft Azure

    cloud7App Services :
    ให้บริการ Application ในกลุ่มของ Microsoft และในกลุ่มของ Linux โดยครอบคลุมทุกบริการของ
    Microsoft เป็นหลัก และเพิ่มบริการของ Linux เพิ่มมากขึ้นเรื่อย ๆ
    Compute :
    ให้บริการเครื่อง Virtual Machine รองรับทั้ง Website, Cloud services และ Mobile services
    Storage :
    ให้บริการฐานข้อมูล SQL Database โดยเฉพาะในส่วนของ Microsoft SQL Server ทั้งนี้รองรับในส่วน
    ของฐานข้อมูลอื่น ๆ ด้วย เช่น HDInsight ทั้งในส่วนของ SQL และ NoSQL

    6 ข้อดีของการใช้ Cloud Computing

    1) ไม่ต้องลงทุน Infrastructure เอง จ่ายราคาตามปริมาณที่ใช้ได้
    2) ผู้ให้บริการลงทุนมหาศาล บริการให้คนมหาศาล ทำให้ค่าบริการต่อหัวลดลงมาก
    3) เลิกคาดเดาว่าเราจะต้องการทรัพยากรเท่าไหร่ถึงจะพอ หรืออาจจะซื้อมามากเกินไปหรือเปล่า
    4) สามารถเพิ่มความเร็วในการจัดหาทรัพยากร์
    5) หยุดใช้เงินในการจัดการ Data Center
    6) สามารถ Deploy Application ให้ใช้ได้ทั่วโลกได้อย่างรวดเร็ว โดยรวมถึงคนทั่วโลกสามารถ Access ได้อย่างรวดเร็ว

    การนำ Cloud มาใช้งาน

    – ผู้บริหารต้องเห็นด้วย และเป็นผู้ผลักดันในการใช้งานให้เกิดเป็นรูปธรรม
    – โดยในแต่ละธุรกิจ หรือแต่ละองค์กรมีวิธีการใช้งานในรูปแบบที่แตกต่างกันตามลักษณะงานที่ทำ
    – การเปลี่ยนแปลงจะต้องเปลี่ยนในสิ่งต่อไปนี้
    1) งานที่ทำ
    2) ความสามารถ ทักษะ ที่ต้องการเพิ่มขึ้นในองค์กร
    3) ความสัมพันธ์ระหว่างคนในองค์กรและผู้บริหารระบบไอที
    4) กระบวนการทำงาน
    – ระดับของการใช้งาน Cloud มีทั้งแบบ ไม่มีใช้งาน, ใช้งานภายใน, ใช้งานภายนอกทั้งหมด ซึ่งสุดท้ายแล้วจะไม่มีผู้ดูแลระบบภายในเหลืออยู่เลย
    – แต่ก็ยังต้องมีฝ่าย IT ภายในองค์กร แต่จะใช้ในการดูแลเรื่องความปลอดภัยของการเข้าถึงข้อมูล การจัดการบริการ Cloud และการเฝ้าระวัง
    – การเริ่มที่ง่ายที่สุด ต้องเริ่มจากความซับซ้อนน้อยที่สุด
    – สิ่งที่ควรนำขึ้น Cloud ก่อนคืองานที่ใช้ทดสอบหรือพัฒนา, งานที่ไม่กระทบต่อธุรกิจโดยรวม, งานที่รันเป็น Batch
    – สุดท้ายแล้วงานที่จะขึ้น Cloud ช่วงหลังก็จะเป็นงานที่มีโหลดสูง, งานที่มีการใช้งานร่วมกัน, งานที่ต้องใช้กับ Desktop, งานทั้งที่เป็นงานทั่วไป และงานสำคัญ

    ความเสี่ยงในการใช้งาน Cloud

    – ข้อมูลสูญหาย
    – การใช้บริการของที่หนึ่งแล้วจำเป็นต้องย้ายไปยังอีกผู้ให้บริการ
    – Data lock-in ข้อมูลอาจจะไม่สามารถย้ายไปใช้กับ Application อื่นได้
    – ขนาดของเครื่อง ซึ่งผู้ให้บริการไม่สามารถจัดหาให้ได้
    – เครื่องมือจัดการระบบ Cloud ซึ่งการที่ย้ายไปยังผู้บริการอื่นใช้เงินลงทุนที่สูง

    การป้องกันความเสี่ยงในการใช้งาน Cloud

    – Data lock-in ใช้รูปแบบมาตรฐานของข้อมูลเช่น JSON, XML
    – VM lock-in ใช้รูปแบบมาตรฐานของ VM Image
    – App lock-in ใช้รูปแบบ API มาตรฐาน
    – การยืนยันตัวตนให้ใช้มาตรฐาน เช่น OAuth, OpenID, Facebook Authentication