[精讚] [會員登入]
1507

[PHP] OPENID CONNECT #2 取得USERINFO及PROFILE

此文分為幾個部分: [PHP] OPENID CONNECT #0 簡介及取得URL [PHP] OPENID CONN

分享此文連結 //n.sfs.tw/11206

分享連結 [PHP] OPENID CONNECT #2 取得USERINFO及PROFILE@Axer's World
(文章歡迎轉載,務必尊重版權註明連結來源)
2019-10-16 10:10:52 最後編修
2017-06-05 15:27:34 By Axer
 

自動目錄

此文分為幾個部分:

[PHP] OPENID CONNECT #0 簡介及取得URL
[PHP] OPENID CONNECT #1 取得ACCESS TOKEN
[PHP] OPENID CONNECT #2 取得USERINFO及PROFILE
[PHP] OPENID CONNECT #3 驗證id_token
[PHP] OPENID CONNECT #4 程式下載及安裝

上一篇已經有取得ACCESS TOKEN並把access token記到SESSION中,以下是取得access token的函數

PHP

  public function getAccessToken($token_ep='' ,$code='', $redir_uri='' ,$rtn_array=false){
    $hash = base64_encode( CLIENT_ID . ":" . CLIENT_SECRET);
    $data = array('grant_type' => 'authorization_code', 'code'=> $code,
      'redirect_uri' => $redir_uri);
    $header= array( "Content-type: application/x-www-form-urlencoded",
       "Authorization: Basic $hash" ) ;
    $options = array(
        'http' => array(
          'header'  => $header,
          'method'  => 'POST',
          'content' => http_build_query($data)
        ));
    $context = stream_context_create($options);
    $result = file_get_contents($token_ep, false, $context);
    $j= json_decode($result, $rtn_array);
    return $j;
  }

此函數回傳的陣列內容範例

Array ( [access_token] => 7NkeXr8ci4Aw6MTgXPOAJXHDh2ng4KsDKh5a67NljGs [refresh_token] => Rq2uPIhVXjKB_hHURlNnW9s8GrXk11qjLxu8DpqF29I [scope] => openid profile userinfo [id_token] => eyJhbGciOiJSUzI1NiJ9.eyJzdWIiOiJjMWI2YjBiZS1iM3MWVhNDkzNyIsImlzcyI6Imh0dHBzOlwvXwvU9IUQLqaFyB9Y8fSvZv-qwJCIV8FJWpBrxIopuaQdVp6cgNQja1hrQ_l3sQ
<==BASE64編碼,部分內容省略==>
[token_type] => Bearer [expires_in] => 3600 )

其中有幾個欄位,簡略說明如下:

access_token 存取用權杖

refresh_token 刷新用權杖

scope 此權杖可使用的權限。openid為必要,其餘為選用,申請時OP有註記可使用scope。多筆scope用空白分格,順序不重要。

id_token id_token 為使用者有關的基本資訊,下一篇OPENID CONNECT #3 驗證id_token會介紹

token_type 使用 Bearer,Base64 encoded

expires_in 有效期限,單位秒

取得USERINFO

接下來可以使用儲存在 session 中的 access token來取回使用者的userinfo,userinfo的內容由 access token定義的scope來決定,輸出的結果是JSON格式,一個userinfo的範例為:

{"sub":"c1b6b0be-b0d3-452a-9dc1-78793cc97eac","preferred_name":"axeredu","name":"張〇✖","email":"axeredu@edu.tw"}

其中有幾個欄位這些欄位稱為 CLAIMS,簡略說明如下:

sub 帳號唯一識別碼

preferred_name openid帳號,也就是本部帳號

name 中文姓名

email 第二電子郵件信箱

PHP

userinfo.php

<?php
//驗證 access token
if( !isset($_SESSION['access_token'])){
  die ("無存取用權杖,無法取回使用者資料!");
}

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

$obj= new openid();

$token_ep=USERINFO_ENDPOINT;
if(DYNAMICAL_ENDPOINT){
   $token_ep=$ep->getEndPoint()->userinfo_endpoint;
}

$userinfo = $obj->getUserinfo($token_ep ,$_SESSION['access_token'], true);
if( !$userinfo) {
  die ("無法取得 USER INFO");
}
// 把access token記到session中
print_r($userinfo);

第18行的函數getUserinfo內容如下:

  public function getUserinfo($token_ep='' ,$accesstoken='',$rtn_array=false){
    $header= array( "Authorization: Bearer $accesstoken" );
    $options = array(
        'http' => array(
          'header'  => $header,
          'method'  => 'GET',
          'content' => ''
        ));
    $context = stream_context_create($options);
    $result = file_get_contents($token_ep, false, $context);
    $u= json_decode($result,$rtn_array);
    return $u;
  }

取得PROFILE

目前此功能未來可能會整合至profile的scope,因此只暫時列出來參考,取得使用者的profile,只需將 profile的endpoint代入上方函式即可:

$profile = $obj->getUserinfo(PROFILE_ENDPOINT ,$_SESSION['access_token'], true);

profile的內容範例

Array ( [fullname] => 張〇✖ [schoolid] => 193526 [guid] => CC9FEA71B4A386F02349021---30CEA894A6AA78770D1D8D9B6 [sub] => c1b6b0be-b0d3-452a-9dc1-78793cc97eac [titles] => Array ( [0] => Array ( [schoolid] => 193526 [title] => Array ( [0] => 學生 ) ) ) [roles] => Array ( [servicename] => edumail [role] => Array ( [0] => 學生 ) ) [ncnu] => )

下一篇: [PHP] OPENID CONNECT #3 驗證id_token(撰寫中)

END

你可能感興趣的文章

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

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

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

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

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

嘸蝦米的替代好物--無蝦殼 進到WIN11後,除了購買原版的嘸蝦米,還可以用無蝦殼來替代

我有話要說

>>

限制:留言最高字數1000字。 限制:未登入訪客,每則留言間隔需超過10分鐘,每日最多5則留言。

訪客留言

[無留言]

隨機好文

鬼魅般的交互作用spooky action at a distanc spooky action at a distance 這個詞並不是在說什麼鬼故事,而是愛因斯坦用以形容「Quantum entanglement」或是量子糾纏這個理論...

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

一碗飯值多少? 買店買米 超市買米一袋一袋很方便,多少人沒去過米店買過米?為此我還和同事討論過,他家是雜貨店,有賣米。 米店賣米有兩種方

老師,你的觀念要改變 投資期很長,最少要十六年,並且不保證能成功,失敗率很高。老實講,你願意去投資嗎?

店奴 開店容易養店難~~