Author: arafan.h

  • 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_idPSU ID0045637

    วิธีการแยก 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 จะไม่ได้รับเป็นค่าพื้นฐาน หากแอปพลิเคชันใดจำเป็นต้องใช้ ให้แจ้งเพิ่มเติม ในฟอร์มขอใช้บริการ