如何實作 Cloudschool OAUth2 認證?

本文將說明如何實作 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';
                    }

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);
         }
?>

 

瀏覽數: