在中央授權中心OIDC功能推廣過程,發現有如下情況:
為了使中央授權中心支持此業務場景,特提供此擴展功能。主要步驟為:
此功能實現主要包括:PC端、相信手機端兩個OIDC授權功能;中央資訊云緩存服務;以及前端的展示功能。
流程時序圖如下:
第三方系統,僅需準備中央授權心的一個OIDC客戶端賬號并注冊兩個跳轉地址以及對應的state值、scope值,一個登錄界面。
//Url中的換行僅為了提高可讀性,實際代碼中應去掉。
<script src="https://sso.foxconn.com/lib/jquery/dist/jquery.min.js"></script>
<script src="https://sso.foxconn.com/Civet/CustomLogin/LoginJs?
clientId=[您的client_id]&
MobileRedirectUrl=[手機端RedirectUrl]&
MobileScope=[手機端RedirectUrl對應的Scope,可為空,默認為:openid civet.ext.custom_scan;此無此兩個Scope時會自動加上]&
MobileState=[手機端RedirectUrl對應的State,可為空]&
PCRedirectUrl=[PC端RedirectUrl]&
PCScope=[PC端RedirectUrl對應的Scope,可為空,默認為:openid profile foxconn]&
PCState=[PC端RedirectUrl對應的State,可為空]
&PCClientId=[PC端ClientId,可為空,默認為前面clientId值相同]
"></script>
<--
特別說明:若定義了PCClientId值,且與clientId值不相等,則PCScope必須包含一個clientId自定義的scope。
舉例:clientId=channel,PCClientId=BGNo1。
那么 PCScope必須包含以channel開頭的scope,此scope是channel事先定義好的為 channel.login.scan并授權過的。 一般 PCScope=openid profile foxconn channel.login.scan。這樣從中央授權中心獲得的AccessToken就有權限調用channel提供的接口來解析用戶登錄的公共賬號信息。
-->
<script>
var hsso_options = {
scanPrompt: "相信掃一掃,在手機端選擇要登錄的XX系統賬號",
imgSize: 145,
imgMarginTop: 10,
imgMarginBottom: 20
};
var hsso = new HQiTSSO("#div1", hsso_options);
</script>
此功能必須引用jQuery 1.7版本或以上。
JS主要方法為: new HQiTSSO(selector, options);
selector
DOM對像選擇字符串,用來指定顯示二維碼容器。
options
配置參數,可以為空。json對像,可包含下列值,且均可以為空。
scanPrompt
提示用戶掃碼,默認值為“請使用相信「掃一掃」功能”。
s0Prompt
用戶已掃碼的提示,默認值為“請在相信手機端完成登錄操作”。
s5Prompt
已管理員審核時的提示,默認值為“等待管理人員同意”。
sn10Prompt
管理員拒絕時的提示,默認值為“管理人員不同意此次登錄”。
s10Prompt
相信手機端操作已完成時的提示,默認值為“中央授權中心正在登錄”。
imgSize
二維碼圖片寬度,單位px,默認值為180。
imgMarginTop
二維碼圖片上端空白高度,單位px,默認值為30。
imgMarginBottom
二維碼圖片下端空白高度,單位px,默認值為30。
useDefaultCsss
是否加載默認CSS樣式,默認值為true。
基本步驟:
回寫自定義操作數據的接口
//此為Restful API
請求地址:https://sso.foxconn.com/Civet/CustomLogin/WriteStatusOperation
請求方法:POST
請求格式:JSON
請求頭:Authorization: Bearer <access_token>
請求數據:
{
"session_id": "[返回手機端RedirectUrl帶上的state值的豎線前部分]",
"status": [狀態,可選值有:10, 5, -10],
"data": "[自定義操作數據,HQiT SSO將原樣傳至PC端]",
"auditor": "[審核人賬號,status=5時必填]"
}
access_token獲取地址:見令牌端點(Token Endpoint)
返回值說明
//操作成功
{status : 200, message : "OK"}
//常見異常
{status : 401, message : "Token Validation Failed。"}
{status : 400, message : "請求數據不完整session_id不能為空。"}
{status : 401, message : "請求數據status值不正確,它只能是:5, 10, -10。"}
{status : 501, message : "未知異常信息"}
基本步驟:
掃碼信息獲取
從令牌(IDToken)
解析出來的custom_scan值
,為base64d編碼數據,解碼后可得到如下數據
{
st: "1677636000", /*掃碼開始時間戳*/
aud: "X007", /*審核人,可以為空*/
lt: "1677636060", /*審核發起時間戳*/
et: "1677636600" /*操作完成時間戳*/
}
自定義操作數據加密建議
為了防止“自定義操作數據”被篡改,強烈建此操作數據進行加密或附加簽名處理。加密或附加簽名時應考慮將當前時間截、當前用戶工號信息加入以提高其安全性。
參考代碼如下:
方法擴展
若第三方系統由多個微服務組成,且所有微服務都集成了中央身份授權中心單點登錄驗證。 在使用此“自定義掃碼登錄”功能時,考慮減少手機端掃碼操作,可重新生成一個“自定義操作數據”值放至在PC端授權鏈接中。
授權端點地址:
//Url中的換行僅為了提高可讀性,實際代碼中應去掉。
https://sso.foxconn.com/connect/authorize?
client_id=[您的client_id]&
scope=[PC端的Scope]&
response_type=code&
redirect_uri=[PC端RedirectUrl]&
state="[自定義操作數據]|[其它狀態信息]"
這里只是說明此功能在頻道賬號上的一個應用案例。
這里涉及到四類參與者:
第四方系統登錄界面處理
如前文所說,配合頻道/頻道賬號系統設定,登錄界面內容如下。
//Url中的換行僅為了提高可讀性,實際代碼中應去掉。
<script src="https://sso.foxconn.com/lib/jquery/dist/jquery.min.js"></script>
<script src="https://sso.foxconn.com/Civet/CustomLogin/LoginJs?
clientId=channel&
MobileRedirectUrl=https://believe.foxconn.com/mp_login/ChannelSelector.html&
MobileState=[可選項/可為空,值有:roleIdGt0、roleIdGt1,分別表示不许無權用戶臨時登錄、只许擁有者登錄]&
PCClientId=[functionSystem001, 您的client_id]&
PCRedirectUrl=[PC端RedirectUrl]&
PCScope=openid profile foxconn channel.login.scan&
PCState=[PC端RedirectUrl對應的State,可為空]
"></script>
<script>
var hsso_options = {
scanPrompt: "相信掃一掃,在手機端選擇要登錄的相信頻道賬號",
imgSize: 145,
imgMarginTop: 10,
imgMarginBottom: 20
};
var hsso = new HQiTSSO("#div1", hsso_options);
</script>
注:涉及的scope開通可與相信團隊聯系開通。
第四方系統獲得頻道的賬號信息
使用前文所述的“PC端RedirectUrl處理”:
1)獲得state值英文豎線(|)前的“自定義操作數據”;
2)獲得AccessToken。
使用上面得到內容,請求頻道賬號系統獲得頻道賬號信息。
POST https://believe.foxconn.com/mp_login/channelinfo
Authorization: Bearer <access_token>
Content-Type: application/x-www-form-urlencoded
login_data=<自定義操作數據>&
lang=tw //支持cn/tw/en/jp
返回結果
{
"data": {
"uid": "CivetDeve",
"name": "生活頻道開發指南",
"icon": "https://icivetmedia.foxconn.com/group1/M00/48/69/CoaWx1p7x8uAKsf3AABo84SjADM518.jpg",
"roleId": 2
},
"code": 200,
"msg": "OK"
}
// roleId,值有: 0/1/2,分別表示臨時同意登錄、運營人員登錄、頻道擁有者登錄。
// 其中,roleId=0時強列建議授權登錄時檢查掃碼信息確認登錄同意人的賬號,或不予登錄。