此文分為幾個部分:
[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 就是我們接下來會用到的。
下一篇