OIDC為中央授權中心主推協議,它是位于OAuth2.0協議之上的身份層。
原相信OAuth將會停止對新注冊的頻道支持服務。
對舊頻道賬號的系統提供了 登錄界面兼容處理
分類 | 授權類型 | 支持情況 | 說明 |
---|---|---|---|
有用戶參與 |
授權碼模式 authorization code |
支持
|
最常用的安全模式。點擊查看流程圖
此模式下中央授權中心同時支持OAuth2.0擴展協議 PKCE。 |
密碼模式 password |
支持,不對外開放
|
涉及到用戶相信密碼,不對外開放。 | |
隱式授權模式 implicit |
不支持
|
redirect_uri直接帶上Token,不安全。 說明 | |
混合模式 hybrid |
不支持
|
相當于authorization code與implicit模式混合。 同樣redirect_uri直接帶上Token,不安全。 說明 |
|
無用戶參與 |
客戶端模式 client credentials |
支持
|
僅可得到AccessToken,無IDToken、RefreshToken。 無須刷新Token。 |
中央授權中心業務流程圖如下:
中央授權中心包含一些職責和功能:
請求方式:GET
發現端點可用于檢索有關中央授權中心的元數據 - 它返回發布者名稱,密鑰材料,支持的范圍等信息。有關詳細信息,請參閱此處。
中央授權中心的發現端點為:https://sso.foxconn.com/.well-known/openid-configuration
標準地址:https://sso.foxconn.com/connect/authorize
請求方式:瀏覽器直接請求(非接口調用)
其它地址
地址1:https://sso.foxconn.com/Account/Login
* 此地址不建議。請使用標準地址,可設定參數prompt=login 來達到同等效果。
地址2:https://sso.foxconn.com/connect/iframe_authz
* 將登入二維碼顯示在一個Iframe框中。非特殊情況也不建議使用。
* 針對一些只支持IE的老舊系統,使用<iframe>標籤嵌入地址2時,建議將IE默認版設置成IE 9及以上,設定如下:
<meta http-equiv="X-UA-Compatible" content="IE=edge"> <!-- 頁面頭部添加 -->
* 目前此方式對IE 6 ~ 8支持不理想,IE5及以下版本不支持。
* 使用Edge模擬IE環境時,非<iframe>標籤嵌入模式使用不受影響。
擴展功能1: JS調用掃碼登錄
擴展功能2: 自定義掃碼登錄
【討論議題】標準地址的意義以及window.open方法是否可用?
【演示地址】公司內網演示點擊進入
授權端點可用于通過瀏覽器請求令牌或授權碼。此過程通常涉及最終用戶的身份驗證和可選的同意。
注意 中央授權中心支持OpenID Connect和OAuth 2.0授權請求參數的子集。有關完整列表, 請參見此處。
《OAuth 2.0授权框架》中文文檔
參數說明
client_id
客戶的標識符(必需)。
scope
一個或多個注冊范圍(必需)
redirect_uri
必須與該客戶端允許的重定向URI之一完全匹配(必需)
response_type
響應類型(RFC 6749標準要求“必需”,中央授權中心為“可選”項),可參考OIDC文檔附錄
code
請求授權碼
id_token
請求身份令牌(僅允許身份范圍)
token
請求訪問令牌(僅允許資源范圍)
id_token token
請求身份令牌和訪問令牌
code id_token
請求授權代碼和身份令牌
code id_token token
請求授權代碼,身份令牌和訪問令牌。
response_mode
響應方式,回傳response_type
對應數據的方式。(可選)
query
默認方式,將授權碼(或令牌)響應查詢字符串的形式附加到重定向 URI(Redirect URI)中。
form_post
將授權碼(或令牌)響應作為表單發送而不是片段編碼重定向。
fragment
將授權碼(或令牌)響應以 URL 片段的形式(#code=[code值])附加到重定向 URI 中。
state
狀態值,回傳response_type
對應數據的同時會回傳此狀態值。(推薦的)
此參數為了安全而設計,針對客戶端和中央授權中心之間的往返狀態,增強返回值的安全性(即:集團接入系統可以核對此值前后是否一致),防止跨站請求偽造(CSRF)攻擊,但它也可以用于在授權流程完成后定位到應用程序(網站)應該顯示的內容。
使用此參數時請確保不包含敏感信息。
nonce
中央授權中心將回傳身份令牌中的nonce值,這樣可增加返回值的安全。(可選)
通過隱式授權對身份令牌是必需的,但隱式授權中央授權中心不支持。
此值將寫入身份令牌(id_token)中,與state
向redirect_uri
界面傳值不同。
prompt
是否每次都顯示登錄UI。(可選)
none
不需要時不顯登錄UI。此設定不影響用戶正常登錄時的UI顯示和同意界面顯示。
login
即使用戶已登錄并具有有效會話,也會顯示登錄UI。但中央授權中心會顯示用戶已登錄的狀態。
force_login
強行要求用戶登錄驗證。若用戶已登錄中央授權中心會移除登錄狀態,自動登出。
code_challenge
發送PKCE的代碼質詢(可選)
code_challenge_method
發送PKCE的代碼是否進行哈希處理。(可選)
[說明]
plain
默認值,表示挑戰是使用純文本(不推薦)。
login
S256表示使用SHA256對挑戰進行哈希處理。
login_hint
可用于預先填寫登錄頁面上的用戶名字段(可選)
login_type
用于設定登錄方式(可選)
* 目前主要針對二次驗證(多因子驗證、Multi-factor authentication)功能設定,“非中央授權中心二次驗證”功能請不要使用此參數。
* 用戶在中央授權中心身份驗證成功(即:登錄成功)之后,此值將與授權代碼(authorization_code
)一起傳入redirect_uri
中。
本參數值包括:
2FA
中央授權中心自身兩次驗證。即兩次驗證全由中央授權中心負責完成。(推薦使用)
Mfa
中央授權中心提供第二次驗證。即中央授權中心只負責兩次驗證的后次驗證。
MyVendor
外部供應商第二次驗證。
login_type
= 2FA
時,將由中央授權中心負責完成兩次驗證。login_type
為 Mfa
MyVendor
時,為第三方系統登錄之后中央授權中心再進行第二次驗證。login_hint
必須得有值。login_type
參數且值必須一致。(本文不另作說明)。login_type
= Mfa
時,我們提供了多種驗證方式,供用戶任意選擇一種。
fa
參數來指定用戶選擇的驗證方式選項及選項順序。見fa參數值說明
Mfa
改成以下值,來指定一種驗證方式。
MfaFxOtp
指定用相信動態安全碼作為第二次驗證。
MfaScan
指定用相信掃碼作為第二次驗證。
MfaTotp
指定用TOTP作為第二次驗證。
MfaFido
指定用Fido2作為第二次驗證。
MfaMail
指定用郵箱驗證碼作為第二次驗證。
MfaSms
指定用手機短信驗證碼作為第二次驗證。
MfaBelieve
指定用相信掃碼或相信動態安全碼作為第二次驗證。
login_type
= MyVendor
時,
cn
簡體中文tw
繁體中文en
英文jp
日文vn
越南語
mobile_return
手機端非相信環境調相信APP登錄驗證后,返回至原界面。(可選)
例
GET /connect/authorize?
client_id=client1&
scope=openid profile foxconn civet.api.msg&
response_type=code&
redirect_uri=https://mybu.foxconn.com/callback&
state=abc&
nonce=xyz
(刪除了URL編碼,并添加了換行符以提高可讀性)
地址:https://sso.foxconn.com/connect/token
請求方式:POST
Content-Type:application/x-www-form-urlencoded
令牌端點可用于以編程方式請求令牌。它支持authorization_code
,client_credentials
,password
,refresh_token
的類型。
注意 中央授權中心支持OpenID Connect和OAuth 2.0授權請求參數的子集。有關完整列表,請參見此處。
client_id
客戶標識符(必需)
client_secret
客戶端密鑰(必需)
密鑰為開發者設置的原始值,即申請填寫的密鑰及修改密鑰填寫的值。而非系統顯示的加密后的HASH值。
grant_type
授權類型(必填)
值有:
authorization_code
,client_credentials
,password
,refresh_token
。
注意:client_credentials
為集團接入系統后臺直接調用,產生的AccessToken默認一個小時內有效。建議集團接入系統后臺存儲AccessToken,切莫頻繁調用令牌端點(Token Endpoint)。
scope
一個或多個注冊范圍。(client_credentials
,password
授權類型所需)
如果未指定,將發出所有明確允許范圍的標記。 使用authorization_code
授權類型時未指定,則為本次請求“授權端點(Authorize Endpoint)”所指定的scope
值。
redirect_uri
指定的重載地址(authorization_code
授權類型所需)
在使用authorization_code
授權類型時必須與本次請求“授權端點(Authorize Endpoint)”獲得code
時傳入的redirect_uri
值一致。
code
授權代碼(authorization_code
授權類型所需)
在使用authorization_code
授權類型,此值為本次請求“授權端點(Authorize Endpoint)”獲得的code值,code值系統設定為5分鐘內有效,且只能成功地使用一次,Token獲得成功之后不能用其重復調用此令牌端點(Token Endpoint)。
code_verifier
PKCE證明密鑰(PKCE
協議所需)
[說明]
username
資源所有者用戶名(password
授權類型所需)
password
資源所有者密碼(password
授權類型所需)
refresh_token
刷新令牌(refresh_token
授權類型所需)
刷新令牌指刷新“有用戶參與”模式下AccessToken,避免因令牌過期而要求用戶重新登錄的情況。
只有AccessToken搭載數據中scope的值包含offline_access,中央授中心才會同時發放RefreshToken值,集團接入系統可使用RefreshToken值再調用令牌端點(Token Endpoint)刷新AccesToken。
注意:刷新令牌僅需在AccessToken快過期前調用一次即可,切莫在AccessToken有效期頻繁調用。
POST /connect/token
client_id=client1&
client_secret=secret&
grant_type=authorization_code&
code=[授權端點重載頁面時帶上的code參數值]&
redirect_uri=https://mybu.foxconn.com/callback
地址:https://sso.foxconn.com/connect/userinfo
請求方式:GET
Content-Type:application/json
Authorization: Bearer <access_token>
UserInfo端點可用于檢索有關用戶的身份信息 (請參閱OIDC規范) 。
調用者需要發送代表用戶的有效訪問令牌。根據授予的范圍,UserInfo端點將返回映射的聲明(至少需要openid作用域)。
示例
GET /connect/userinfo
Authorization: Bearer <access_token>
HTTP/1.1 200 OK
Content-Type: application/json
{
"sub": "FX000001",
"emp_no": "FX000001",
"name": "相信大使",
"area":"龍華",
"bg":"中央單位",
"bu":"中央資訊總處",
"company":"富泰華工業(深圳)有限公司",
"cost_code":"DAAB07",
"birthdate":"2000/01/01",
"class":"師1",
"job_title":"大使",
"hiredate":"2015-08-10",
"email":"civet-helpdesk@mail.foxconn.com",
"picture":"https://icivetmedia.foxconn.com/group1/M00/39/67/CoaWx14kDPaENfGQAAAAALnmmck62.jpeg",
"role": [
"簡單角色設定值1",
"簡單角色設定值2"
]
}
地址:https://sso.foxconn.com/connect/endsession
請求方式:瀏覽器直接請求(非接口調用)
結束會話端點可用于觸發單點注銷 (請參閱規范)。
要使用結束會話端點,客戶端應用程序會將用戶的瀏覽器重定向到結束會話URL。用戶在會話期間通過瀏覽器登錄的所有應用程序都可以參與注銷。
id_token_hint
當前用戶的IDToken,此值用來繞過系統提示,無此值時系統會提示用戶是否真的想要注銷。
即:有值時用戶無需再確認是否退出。
此方法中不判斷傳入的用戶IDToken是否過期。
post_logout_redirect_uri
如果id_token_hint有效傳遞了,則客戶端也可以發送post_logout_redirect_uri參數。這可用于允許用戶在注銷后重定向回客戶端。該值必須與客戶端預先配置的PostLogoutRedirectUris。
state
如果post_logout_redirect_uri有效,則客戶端也可以發送state參數。在用戶重定向回客戶端后,這將作為查詢字符串參數返回給客戶端。這通常由客戶端用于跨重定向的往返狀態。
例
GET /connect/endsession?
id_token_hint=<當前用戶的IDToken>&
post_logout_redirect_uri=https://myapp/logout&
state=abc&
(刪除了URL編碼,并添加了換行符以提高可讀性)
地址:https://sso.foxconn.com/connect/revocation
請求方式:POST
Content-Type:application/x-www-form-urlencoded
此端點允許撤消刷新令牌。它實現了令牌撤銷規范(RFC 7009)。
結束會話端點可用于觸發單點注銷(請參閱規范)。
要使用結束會話端點,客戶端應用程序會將用戶的瀏覽器重定向到結束會話URL。用戶在會話期間通過瀏覽器登錄的所有應用程序都可以參與注銷。
token
要撤銷的令牌(必填)
token_type_hint
令牌類型提示(可選) 值有:access_token
或refresh_token
(可選)
例
POST /connect/revocation HTTP/1.1
Host: server.example.com
Content-Type: application/x-www-form-urlencoded
Authorization: Basic czZCaGRSa3F0MzpnWDFmQmF0M2JW
token=45ghiukldjahdnhzdauz&token_type_hint=refresh_token
(刪除了URL編碼,并添加了換行符以提高可讀性)
中央授權中心的令牌為JWT標準格式,并采用RS256的簽名。
如果您想直接使用JWT搭載的信息(如:sub)做為用戶身份認別,應對JWT簽名進行驗證。WebAPI在使用AccessToken進行權限認證時,都必須驗證JWT令牌有效性。授權中心UserInfo端點已對JWT令牌有效性進行了嚴格的驗證。
客戶端驗證令牌有效性主要有以下幾步:
1) 從JWT搭載的信息中判斷令牌是否在有效期內。
2) 通過公開的公鑰地址獲得公鑰,對JWT簽名部分進行驗證。
參考代碼如下: