[精讚] [會員登入]
1428

[PHP] OPENID CONNECT #1 取得ACCESS TOKEN

取得ACCESS TOKEN

此文完整連結 http://n.sfs.tw/11204

複製連結 [PHP] OPENID CONNECT #1 取得ACCESS TOKEN@Axer's World
(文章歡迎轉載,務必尊重版權註明連結來源)
2019-10-25 13:15:39 最後編修
2017-06-05 15:26:39 By Axer
 

自動目錄

 

RP要由OP取得ACCESS TOKEN

必要條件

1. RP 要先向 OP取得 client_id, client_secret,由於認證網站採用 Basic auth,所以還需要有 auth_secret

2. RP 要先設定 redirect_url,認證後回傳到此網址

取得 CODE

將網址導向 oidc認證主機,他的網址是,在 [PHP] OPENID CONNECT #0 簡介及取得URL@Axer's World 中有取得authorization_endpoint

https://oidc.tanet.edu.tw/oidc/v1/azp

其中所代的參數為:

clientid 需申請,由op提供

scope 定義 access token可以存取的權限 openid(必要), openid2(選項), email(選項), profile(選項)

response_type code

redirect_uri 需申請時設定,且urlencoded

state 必要,RP需由帶回來的值驗證SESSION連續狀態

nonce 必要,可用來防止權杖重新取得攻擊

一個連結的範例(認證方法是GET)

https://oidc.tanet.edu.tw/oidc/v1/azp?response_type=code&client_id=d8170c2861d20da77c5839bc71ea4937&redirect_uri=http%3A%2F%2Fexample.com%2Fopenidconnect%2Fcallback.php&scope=openid+email+profile&state=8143249&nonce=NSFSTW

程式記住state值並提供連結給使用者點擊,執行畫面

使用者點擊此連結後會導向此網址後的認證範例畫面

使用者輸入錯誤的範例,帳密驗證錯誤的話無法把資料傳回。

使用者輸入帳密認證成功後會導回RP的redirect_uri,GET帶回參數:

code 接下來取得access token用

state 檢查session的連續性

範例認證後OP轉址到redirect_uri並帶回code及state值

http://example.com/openidconnect/callback.php?code=br2qjcGi5imfua29thT_0Qr9JAbLXNT0zOs_0DnwX0w&state=8143249

寫到這裡我想要貼這張同事傳來的圖片,程式來不及寫了還得寫文件

PHP

config.php

<?php

// RP申請獲得
define('CLIENT_ID', '3b0d2d618fab2----e08ca605e1a74a');
define('CLIENT_SECRET', 'cfc3d40dee3657e----31f1723c4a0804ca0e');
define('AUTH_SECRET', 'dWhvby50d0BnbWFpbC5jb20=');
define('REDIR_URI0', 'http://opneid.example.com/callback.php');

define('WELL_KNOWN_URL', 'https://oidc.tanet.edu.tw/.well-known/openid-configuration');
// 預設0由設定檔的URL決定;設定為1則每次皆由WELL_KNOWN取回END POINT URL
define('DYNAMICAL_ENDPOINT', 0);
// DYNAMICAL_ENDPOINT設為0下方需填寫
define('AUTH_ENDPOINT', 'https://oidc.tanet.edu.tw/oidc/v1/azp');
define('TOKEN_ENDPOINT', 'https://oidc.tanet.edu.tw/oidc/v1/token');
define('USERINFO_ENDPOINT', 'https://oidc.tanet.edu.tw/oidc/v1/userinfo');
// PROFILE URL
define('PROFILE_ENDPOINT', 'https://oidc.tanet.edu.tw/moeresource/api/v1/oidc/profile');

openidconnect/index.php

<?php
include "config.php";
include "library.class.php";

$obj= new openid();

$_SESSION['azp_state']=rand(0,9999999); //隨機產生state值
$_SESSION['nonce']=isset($_SESSION['nonce'])? $_SESSION['nonce']:base64_encode($_SESSION['azp_state']);

$auth_ep=AUTH_ENDPOINT;
if(DYNAMICAL_ENDPOINT){
   $auth_ep=$ep->getEndPoint()->authorization_endpoint;
}
$link = $auth_ep . "?response_type=code&client_id=". CLIENT_ID .
"&redirect_uri=".REDIR_URI0 ."&scope=openid+email+profile&state=".$_SESSION['azp_state'].
"&nonce=".$_SESSION['nonce'];

?>
<!doctype html>
<html lang="zh-TW">
<head>
<meta charset="utf-8" />
</head>
<body>
<a href="<?php echo $link ?>">使用教育部OPENID認證</a>
</body>
</html>

openidconnect/callback.php

$code= $_GET['code'];
$state= $_GET['state'];
//驗證 $state
if( !isset($_GET['code']) ||  !isset($_GET['state'])){
  die ("認證伺服器回傳結果失敗!");
}

if( strcmp($state, $_SESSON['azp_state'])){
  die ("錯誤的認證狀態,請重新嘗試!");
}

//取回access token
include "config.php";
include "library.class.php";

$obj= new openid();

$token_ep=TOKEN_ENDPOINT;
if(DYNAMICAL_ENDPOINT){
   $token_ep=$ep->getEndPoint()->token_endpoint;
}

$acctoken= $obj->getAccessToken($token_ep ,$code, REDIR_URI0);
if( !$acctoken || !isset($acctoken->access_token) ) {
  die ("無法取得ACCESS TOKEN");
}
// 把access token記到session中
print $_SESSION['access_token']= $acctoken->access_token;

第23行執行取回access token的函式,待下一篇說明,取回的access token記到SESSION中,待後面要取回userinfo使用

 

下一篇: [PHP] OPENID CONNECT #2 取得USERINFO及PROFILE

你可能感興趣的文章

使用教育部電子郵件 教育部提供的免費電子郵件,有5GB的空間

[DNS管理系統] DNS的運作及學校切換DNS集中化 dns的運作原理簡介及說明學校切換集中化後,差別是什麼?

教育部OPENID帳號管理服務使用說明 教育部OPENID帳號管理服務系統使用說明 系統簡介 教育部OPENID帳號管理系統,主要處理帳號的問題,例如個人資料修

[PHP] OPENID CONNECT #1 取得ACCESS TOKEN 取得ACCESS TOKEN

在麥當勞和便利商店使用台中市教育局公務帳號上網(免費) 台中市網建置的教育局公務帳號,非常的好用,可在M或部分便利店免費上網

[PHP] OPENID CONNECT #0 簡介及取得URL 教育部在全國性的OPENID CONNECT帳號服務,PHP程式說明文件及範例。

[PHP] OPENID CONNECT #3 驗證id_token id_token及id_token驗證

使用台中市教育局公務帳號登入教育部數位教學資源網 使用公務帳號就能登入教育部的數位教學資源網

[PHP] OPENID CONNECT #4 程式下載及安裝 要使用教育部的本部帳號使用OPENID CONNECT,PHP的範例程式。

利用監理服務app繳交燃料費和牌照稅 利用監理服務app繳交燃料費

我有話要說


限制:留言最高字數1000字,超過部分會被截掉。請注意:留言不可帶有網址,會被濾掉。 限制:未登入訪客,每則留言間隔需超過10分鐘,每日最多5則留言。

訪客留言

tad
請問教育部的OpenID帳號要去哪裡申請? 另外,CLIENT_ID、CLIENT_SECRET及AUTH_SECRET要去哪裡申請? 感謝! @2017-06-22 15:48:19

Axer's World
目前有開放測試可申請。請寫信給台中市蕭聖哲師:front713@gmail。未來上線後申請得由openid帳號管理小組(各縣市代表組成)審核。
2017-06-25 01:41:18

隨機好文

保持低調和隱藏的態度 當我們常常認為別人的成功是運氣的因素時,我們就離成功越來越遠,而離憤恨和不滿越來越近..

要做一下容易,要持續做很困難 要做一下容易,要持續做很困難 「要做一下容易,要持續做很困難」這個道理大家都知道,可是令人憎恨的是,大家選擇不去面對要持

[Scratch2] 下雨效果 SCRATCH2下雨效果

[Scratch2] 灑落的愛心(櫻花) 愛心(或是櫻花、樹葉等)會飄下來,並停地上模擬不規則的掉落。

[數學] 欲窮千里目,更上一層樓的問題 王之渙在鸛雀樓上曰:「欲窮千里目,更上一層樓」。若一層樓3公尺,請問上一層樓,可看多遠?