自動目錄
此文分為幾個部分:
[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 程式下載及安裝
教育部在2016-2017年推動一項計畫,建立全國性的帳號服務,並提供OPENID CONNECT的認證方式。
目的說明
如果我的網站想用教育部的帳號登入,直接使用我的服務,省略麻煩的帳號管理和註冊功能。
名詞解釋
本部帳號 教育部的帳號,帳號為email格式,ex: somename@edu.tw
RP 依賴方(Relying Party, RP),如果我的網站想用教育部的帳號登入,我的網站就可以說是一個依賴方
IdP 提供者(identity provider, IdP),提供認證服務的人就叫作身分提供者
OP OPENID CONNECT提供者(OPENID Connect PROVIDER, OP),提供以OPENID CONNECT方式來認證者,可以叫作OPENID CONNECT提供者
取得各端點 URL
連結網址 https://oidc.tanet.edu.tw/.well-known/openid-configuration
內容如下:
{
"issuer" : "https://oidc.tanet.edu.tw",
"subject_types_supported" : [ "public" ],
"jwks_uri" : "https://oidc.tanet.edu.tw/oidc/v1/jwksets",
"authorization_endpoint" : "https://oidc.tanet.edu.tw/oidc/v1/azp",
"token_endpoint" : "https://oidc.tanet.edu.tw/oidc/v1/token",
"userinfo_endpoint" : "https://oidc.tanet.edu.tw/oidc/v1/userinfo",
"scopes_supported" : [ "openid", "email", "profile" ],
"response_types_supported" : [ "code id_token token" ],
"id_token_signing_alg_values_supported" : [ "RS256" ],
"id_token_encryption_alg_values_supported" : [ "A256KW" ],
"id_token_encryption_enc_values_supported" : [ "A256CBC-HS512" ],
"claim_types_supported" : [ "aggregated", "distributed", "normal" ],
"claims_supported" : [ "aud", "email", "exp", "iat", "iss", "name", "sub" ],
"claims_parameter_supported" : false,
"request_parameter_supported" : false,
"request_uri_parameter_supported" : true,
"require_request_uri_registration" : false
}
取得CODE
"authorization_endpoint" : "https://oidc.tanet.edu.tw/oidc/v1/azp"
取得ACCESS TOKEN
"token_endpoint" : "https://oidc.tanet.edu.tw/oidc/v1/token"
取得USERINFO
"userinfo_endpoint" : "https://oidc.tanet.edu.tw/oidc/v1/userinfo",
PHP
取得endpoint函式
public function getEndPoint($rtn_array=false){
$options = array(
'http' => array(
'header' => '',
'method' => 'GET',
'content' => ''
));
$context = stream_context_create($options);
$result = file_get_contents(WELL_KNOWN_URL, false, $context);
$u= json_decode($result, $rtn_array);
return $u; //object
}
若要將json結果轉換成陣列,帶入參數true,預設是物件。
getEndPoint(true) 執行的結果
其中的endpoint 就是我們接下來會用到的。
下一篇
[PHP] OPENID CONNECT #1 取得ACCESS TOKEN
