如何實作 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);
}
?>