請使用LDAP單一帳號登入

歡迎加入和討論!!

 my group 1543651877081

 

雲端校務系統API應用-同步學期資料實作分享

臺中市立外埔國中資訊組長 郭特全 2018.11.04

{attachments}

 1.目前同步學期資料API應用可回傳資料有基本資訊,如更新時間、學年學期學期開始日期學期結束日期開學日結業日,及有用學期資料如學期編班學期教職員單位資料課表。

 2.因為要在本校的線上請假系統強化調代課功能,故本範例主要實作透過雲端校務系統API應用,取回課表資料留存本地端,並透過比對校務系統和本地端的更新時間資訊,達成自動化更新功能。

3.程式碼如下:

 <?php
include_once("config.php") ;
session_start();
function objectToArray($d) {
        if (is_object($d)) {
            $d = get_object_vars($d);
        }
        
        if (is_array($d)) {
            return array_map(__FUNCTION__, $d);
        }
        else {
            return $d;
        }
    }
echo "<html><head><meta http-equiv='Content-Type' content='text/html; charset=UTF-8'></head>" ;
if (in_array($_SESSION['login_title'], $admin_title))
  {  
       // API NAME
     $api_name = '/semester-data';
     // API URL
     $api_url = 'https://api.tc.edu.tw';
     // 建立 CURL 連線
     $ch = curl_init();
     // 取 access token
     curl_setopt($ch, CURLOPT_URL, $api_url."/oauth?authorize");
     // 設定擷取的URL網址
     curl_setopt($ch, CURLOPT_POST, TRUE);
     // the variable
     curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
     //$clientId 和 $client_secret 的值於 config.php 中取得,設定需在各校雲端系統中以系統管理者權限為之。
     curl_setopt($ch, CURLOPT_POSTFIELDS, array(
     'client_id' => $clientId,
     'client_secret' => $client_secret,
     'grant_type' => 'client_credentials'
     ));
       $data = curl_exec($ch);
     $data = json_decode($data);
     $access_token = $data->access_token;
     $authorization = "Authorization: Bearer ".$access_token;
     curl_setopt($ch, CURLOPT_URL, $api_url.$api_name);
     curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type: application/json' , $authorization )); // **Inject Token into Header**
     curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "GET");
     curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
     //curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
     $result = curl_exec($ch);
     $data = json_decode($result);
     $data = objectToArray($data) ;
     //解決CSV首字亂碼
     setlocale(LC_ALL, 'en_US.UTF-8');
     $fname = "files/semester_data/class.csv" ;
     if (file_exists($fname))
       {
             //若本地端已有課表資料csv檔,比對雲端校務系統 semester_data 更新時間 和既存檔案更新時間,若時間不同,刪檔重建較新資料。
            if (($handle = fopen($fname, "r")) !== FALSE)
            {
               while (($row_data = fgetcsv($handle)) !== FALSE)
                 {
                     if ($row_data[0] == '更新時間')
                       {
                           $local_update_time =     $row_data[1] ;
                       }
                 }
               fclose($handle) ;
            }
          if ($local_update_time != $data['更新時間'])
            {
                   unlink($fname) ;
                   echo "<script>location.href= ('sync_semester_data.php');</script>" ;
            }     
       } else {
                    //課表資料csv檔不存在,連線雲端校務系統產生此檔。
                 $fp = fopen($fname, 'w');
                 foreach ($data as $key => $value)
                   {
                        if (!is_array($value))
                         {
                              //記錄更新時間 學年 學期 學期開始日期 學期結束日期 開學日 結業日
                              fwrite($fp, $key.",".$value."\n");
                         }
                      if (is_array($value) && ($key == '課表'))
                         {
                             //本例只需要課表資料,每堂課csv資料格式如下
                               //年級,班序,班名,星期,節次,科目,專科教室,教師,身分證編碼
                               foreach ($value as $value2)
                                 {
                                     $num = 0 ;
                                      foreach ($value2 as $value3)
                                          {
                                                $num++ ;
                                                if ($num == count($value2))
                                                  {
                                                        fwrite($fp, $value3."\n");
                                                  } else {
                                                           fwrite($fp, $value3.",");
                                                         }
                                          }
                                 }                  
                         }
                   }
                 fclose($fp);
             }
     //顯示
     echo "<body bgcolor='#e7d6b6'>" ;
     echo "<style>a { text-decoration:none;}</style>" ;
     echo "<center><br><img src='images/sync.png' width='80'><br><br>" ;
     echo "<b><font size='5'>自動同步雲端校務系統課表資料後取得最新版本時間&nbsp;:</font>" ;
     echo "<br><br><font size='6' color='blue'>".$data['更新時間']."</font></b>" ;
     echo "</center>" ;
  } else {
           echo "<script>alert ('您尚未登入或無權限瀏覽本網頁!!'); location.href= ('index.php');</script>" ;           
         }
?>

4.成功留存課表CSV檔。

2018110401

5.本範例程式執行時畫面。

2018110402

採LDAP認證的學生出缺席登記系統

臺中市立外埔國民中學 資訊組長 郭特全 20171222 修正

 

特點:

1.執行環境只要 apache+php 和可供認證的 LDAP server。

2.不須 mysql 資料庫,以 csv 檔紀錄。

3.只要備份本系統資料夾 absence ,就完整備份本系統,不會遺失任何資訊。

安裝方法:

假設 apache 網頁資料夾為 /var/www/html

1.先確認是否安裝 php-ldap 函式,否則無法執行 LDAP 認證相關程式碼。安裝方法:

  #yum -y install php-ldap

2.下載網頁上方本系統程式碼,解壓縮後放入 /var/www/html/ 下

  #cd /var/www/html/absence

  #cp config_ini.php config.php

  #chown apache.apache config.php

  #chmod 600 config.php

  #vi config.php

 2017122201

 

2017122202

 

2017122203

 

2017122204

 

2017122205

 

2017122206

如何實作 Cloudschool OAUth2 認證?

臺中市立外埔國中資訊組長 郭特全 2018.10.13

{attachments}

  本文將說明如何實作 Cloudschool OAUth2 認證?

1.一般開發應用程式會有 config 檔,假設為 config.php ,將Cloudschool OAUth2 認證列入:

//認證種類(OpenLdap $AUTH_TYPE = 1 , Synology $AUTH_TYPE = 2 , 雲端校務系統 $AUTH_TYPE = 3)
$AUTH_TYPE = 3 ;

if ($AUTH_TYPE == 1)
  {
     //使用自建LDAP SERVER
     //LDAP伺服器IP
     $LDAP_IP = "xxx.xxx.xxx.xxx" ;

     //埠號(預設389)
     $port = "389" ;

     //完整網域名稱
     $FQDN = "xxxx.tc.edu.tw" ;

     //LDAP管理者帳號
     $rootdn = "cn=xxxxxxxxx,dc=xxxx,dc=tc,dc=edu,dc=tw" ;

     //LDAP管理者密碼
     $rootpw = "xxxxxxxxxxxxx" ;
  } else if ($AUTH_TYPE == 2)
           {
             //使用群暉 synology Directory Server
             //LDAP伺服器IP
             $LDAP_IP = "xxx.xxx.xxx.xxx" ;

             //埠號(預設389)
             $port = "389" ;

             //完整網域名稱
             $FQDN = "xxxx.tc.edu.tw" ;

             //LDAP管理者密碼
             $rootpw = "xxxxxxxxxxxx" ;
           } else if ($AUTH_TYPE == 3)
                    {
                        //雲端校務系統 API 設定
                        //已授權的重新導向 URI  http://xxx.xxx.xxx.xxx/teacher_absence/oauth.php
                        $clientId = 'xxxxxxxxxxxxxxxxxx';
                    }

2.如何填步驟1 $clientID ?

 1

 2

3

3.所有實作的關鍵,就是 oauth.php ,詳細說明如下:

oauth.php

<?php
//引入設定檔 config.php ,其上有 client_id
include_once("config.php") ;
session_start();
//物件轉為陣列的函式
 function objectToArray($d) {
        if (is_object($d)) {
            $d = get_object_vars($d);
        }        
        if (is_array($d)) {
            return array_map(__FUNCTION__, $d);
        }
        else {
            return $d;
        }
    }

if (isset($_GET['data']))
  {
      //有回傳值
        if ($_GET['state'] == $_SESSION['state'])
          {
              //檢查 GET 回傳 state 值 是否與 $_SESSION['state'] 相同,若相同,表回傳值無偽造可信賴
            $data = json_decode($_GET['data']);
            //將物件轉為陣列
            $data = objectToArray($data) ;
            //教師帳號 $data 回傳內容有:
            //school_no       學校代碼
            //username        教職員帳號
            //role -> teacher 身分別(教職員)
            //name            教職員姓名
            //edu_key         身分證字號hash值
            //title_name      職稱,例資訊組長
            //title_kind      職別,例教師兼組長
            if ($data['role'] == 'teacher')
              {
                   //僅供教職員登入
                   //姓名和職稱寫入 SESSION
                 $_SESSION['login_name'] = $data['name'] ;
                 $_SESSION['login_title'] = $data['title_name'] ;
                 //跳轉登入後首頁
                 echo "<script>location.href= ('home.php');</script>";
              } else {
                        echo "<script>alert ('您未被授權瀏覽本網頁!!'); location.href= ('index.php');</script>" ;  
                     }
          }
  } else {
              //無回傳值,導向雲端校務系統 $apiUrl
              //以時間序做 md5 運算取前20碼作為 unique 狀態值
              $state = substr(md5(date('YmdHis')),0,20) ;   
            $apiUrl = 'https://api.tc.edu.tw/school-oauth/authorize?client_id='.$clientId.'&response_type=code&state='.$state;
            //以 SESSION 記錄 $state 狀態值
            $_SESSION['state'] = $state ;
            header('Location: '.$apiUrl);
         }
?>

4.以本人開發的教職員線上請假系統實作 Cloudschool OAUth2 認證,示範如下:

原本採LDAP認證

 4

在 config.php 選擇雲端校務系統 OAUth2 認證,接著進入系統首頁

 5

6

7

8

登入成功!!

9

採LDAP認證的學生資料輸出EXCEL系統

臺中市立外埔國民中學 資訊組長 郭特全 20171221 修正

特點:

1.執行環境只要 apache+php 和可供認證的 LDAP server。

2.不須 mysql 資料庫,以 csv 檔紀錄。

3.只要備份本系統資料夾 stu_excel ,就完整備份本系統,不會遺失任何資訊。

安裝方法:

假設 apache 網頁資料夾為 /var/www/html

1.先確認是否安裝 php-ldap 函式,否則無法執行 LDAP 認證相關程式碼。安裝方法:

  #yum -y install php-ldap

2.下載網頁上方本系統程式碼,解壓縮後放入 /var/www/html/ 下

  #cd /var/www/html/stu_excel

  #cp config_ini.php config.php

  #chown apache.apache config.php

  #chmod 600 config.php

  #vi config.php

 2017122101

 

2017122102

 

2017122103

反霸凌、性侵害、性騷擾投訴信箱 :

No_Bully@wpjh.tc.edu.tw

受理本校學生、師長、家長,媒體及

民眾申訴或諮詢有關暴力霸凌、詐騙案件。

投訴專線 : (04)26833721 分機 222

本市反霸凌申訴專線電話為0800-580-995

教育部反霸凌專線:0800-200-885

學校資訊

電話:04-2683-3721

【處室分機】

傳真:04-2683-3759

網路電話:070-910-5330

校址:

43857 臺中市外埔區大同里外埔路999號

【位置圖】

GPS資訊

北緯:(24.332599)

東經:(120.649367)

網站維護 : 外埔國中資訊組 (04)26833721 #231

Monday the 18th. PointLink.