基於與OA,億方雲對接的規範協議要求,針對傳送用戶登錄信息給下游H5頁面授權和防穿篡改的要求,定義和梳理,並同時確定了接口參數內容,以備可以順利實現外部系統(OA或者億方雲)和ETONE的數據打通和互傳,並逐級實現ETONE層面的協議標準。
盟廣易通ETONE介紹
盟廣信息技術有限公司旗下的產品 – 易通(ETONE),主要是爲了解決和幫助酒店員工上下班打卡,審批,加班,易採購,簽到以及個人信息的查詢和修改,甚至會進行年假延期等功能延展。
目前ETONE支持消息,短消息接受和顯示查看,釣美學院的網上教學視頻的在線點播和回放,支持釣美學院視頻的上傳等。爲了打造整合移動OA大平臺的構想,用戶登錄信息的平臺共享和返回跳轉。
文檔接口概述
現有盟廣易通ETONE是基於微軟NET Razor視圖引擎以及Avalon的MVVM的view model雙向綁定的技術體系架構,如今已實現ETONE和盟廣DMH之間的各種接口服務功能的信息的交互,存儲和作用。數據的相互的讀取和寫入爲實時,可用直接反應在互相交互的系統中。
在開發前請閱讀此文檔,遵守文檔中的要求和約定。
標準功能覆蓋隨着接口功能的不斷完善,文檔中的接口功能也會不斷更新,現有接口功能爲現階段需要實現的接口功能。
本文檔描述與定義盟廣易通(Etone) 通過防篡改salt加密並且作用在http頭上增加UserNo來實現對接的標準協議規範。
4.1、Http Header頭部格式
Http Post request Header會加入以下信息
UserNo:爲用戶的域賬號(ETONE提供)
Salt:統一約定 QSCEDVFGXMLIOPUYRWE,第三方做下可配置,以防需要變更
Token:是對UserNo 加Salt,進行MD5算法得出的結果,具體簽名算法(c#)如下:
private string saltStr = “QSCEDVFGXMLIOPUYRWE”;
public static string GetMD5(string myString)
{
MD5 md5 = new MD5CryptoServiceProvider();
byte[] fromData = System.Text.Encoding.Unicode.GetBytes(myString);
byte[] targetData = md5.ComputeHash(fromData);
string byte2String = null;
for (int i = 0; i < targetData.Length; i++)
{
byte2String += targetData[i].ToString("x");
}
return byte2String;
}
public static string MD5Encoding(string rawPass, object salt)
{
if (salt == null) return rawPass;
return GetMD5(rawPass + "{" + salt.ToString() + "}");
}
4.2 第三方驗證登錄信息
驗證登錄信息正確性以及簽名之後,需要返回URL ,該URL在DMH_LINK接收之後,可以直接跳轉打開(即便登錄信息,簽名信息錯誤,給出相應的URL以及提示信息)
ETONE與OA的接口大類爲以下列表中所羅列內容。每一行表示一個消息接口。
Way |
Scenario |
Functions |
由OA跳轉頁面 |
DMH-LINK ICON 點擊----(ModuleCode)---> OA Mobile SSO認證 ----(ModuleCode)--->重定向到 OA H5頁面 |
從ETONE的指定頁面跳轉SSO認證服務器,然後根據防篡改hash來判斷是ETONE發出,並且驗證UserNo是否在數據庫中存在,最後由SSO認證服務器返回給OA的頁面解析服務器來跳轉頁面。 |
由ETONE跳轉頁面 |
DMH-LINK ICON 點擊----> OA Mobile SSO認證 -----返回Module對應的H5 URL DMH-LINK-----重定向到Module對應的H5 URL |
從ETONE指定頁面跳轉SSO認證服務器,然後根據防篡改hash來判斷是ETONE發出,並且驗證UserNo 是否在數據庫中存在,最後返回給ETONE,由ETONE二次發出頁面跳轉,跳轉到有登錄授權權限的頁面 |
由OA跳轉頁面時序圖和由ETONE跳轉頁面時序圖如下:
接口調用使用https協議,通過Restful API方式調用。數據傳輸格式採用Json。
ETONE調用OA方向:
接口調用時,使用約定好的SALT QSCEDVFGXMLIOPUYRWE的MD5做簽名,簽名信息需要帶入消息,使用單獨的Sign字段表示。簽名規則爲:
- 雙方線下約定一個密鑰(key)
- 對salt拼接而成的字符串進行MD5加密,作爲Sign的值
舉例說明:假設key=hello則需要進行MD5加密的字符串爲key=hello,使用MD5算法進行加密得到Sign= 8EE6DCB9E3B9CE1DC2CCD84A9C3CEDCC,傳入到參數中。
該安全性標準是通用標準,針對外部系統或是中間件調用易通ETONE,基本都採用此安全標準,如有特殊情況,需另行定義。
ETONE調用億方雲方向:
ETONE調用億方雲的接口安全性設計建議與上述方法相同。具體由億方雲開發工程師確認。
如是ETONE調用其他的外部系統或是中間件,具體安全標準需以對方開發工程師確認。
7.1使用ashx的硬代碼拼接方式
針對第二種SSO登陸方式可以使用ashx的硬代碼拼接,
使用ashx方式得到context的內容 返回給result,本質是ajax前端到後端的異步調用的一種H5的實現方式,此方式多用於富客戶端的js框架以及jquery調用jquery
UI的來生成數據列表的一種呈現方式,下面是微軟的官方做法:
其中返回的代碼是用Html body拼接起來的超文本。
7.2使用重定向方式
針對第一種SSO驗證方式可以使用重定向來實現。
這邊的重定向涉及跨域跳轉,主要分爲以下九類:
1、 通過jsonp跨域
2、 document.domain + iframe跨域
3、 location.hash + iframe
4、 window.name + iframe跨域
5、 postMessage跨域
6、 跨域資源共享(CORS)
7、 nginx代理跨域
8、 nodejs中間件代理跨域
9、 WebSocket協議跨域
可以選擇使用Windows服務講數據庫數據填充到html然後生成到虛擬站點部署到服務器上,而我們這邊result得到是重定向的靜態頁面。
當然跳轉的第三方可以使用IIS來解析,但是其中的js和css資源需要把js的絕對路徑加token給到我們實在的下載,將css發佈到CDN同時綁定絕對地址來獲得。
因爲js和css資源不滿足同源策略,應該增加測試環境或者正式環境的域名和token驗證來實現重定向到指定的OA相關頁面。
舉個例子:
<html>
<head><meta name="viewport" content="width=device-width" /><meta charset="utf-8" />
<!--主要I是強制讓文檔的寬度與設備寬度保持1:1,最大寬度1.0,禁止屏幕縮放。-->
<meta content="width=device-width,initial-scale=1.0,maximum-scale=1.0,user-scalable=no" name="viewport" />
<!--這個也是iphone私有標籤,允許全屏瀏覽。-->
<meta content="yes" name="apple-mobile-web-app-capable" />
<!--iphone的私有標籤,iphone頂端狀態條的樣式。-->
<meta content="black" name="apple-mobile-web-app-status-bar-style" />
<!--禁止數字自動識別爲電話號碼,這個比較有用,因爲一串數字在iphone上會顯示成藍色,樣式加成別的顏色也是不生效的。-->
<meta content="telephone=no" name="format-detection" />
<!--禁止email識別-->
<meta content="email=no" name="format-detection" />
<script type="text/javascript">
var currentWebUrl = 'http://local.dkhztech.com:82';
var Selector_Warning_Click = "";
</script>
<script type="text/javascript" src="http://local.dkhztech.com:82/_layouts/15/DMH.CommonResources/Scripts/jquery-1.7.min.js?token="></script>
<script type="text/javascript" src="http://local.dkhztech.com:82/_layouts/15/DMH.CommonResources/Scripts/Viewlist.js?ver=1.2&token="></script>
<script type="text/javascript" src="http://local.dkhztech.com:82/_layouts/15/DMH.OAH5.Foundations/Script/MamJavaScript.js&token="></script>
<link rel="stylesheet" type="text/css" href="http://local.dkhztech.com:82/_layouts/15/DMH.OAH5.Foundations/css/MamStyle.css?token=" /><link rel="stylesheet" type="text/css" href="/_layouts/15/DMH.OAH5.Foundations/css/ModuleStyle.css" /><link rel="stylesheet" type="text/css" href="http://local.dkhztech.com:82/_layouts/15/DMH.OAH5.Foundations/css/h5form.css?token=" />
其中的JS或者CSS的靜態資源都由token和絕對路徑獲得,這樣由我們razor解析。針對第一種SSO的驗證方式也可以直接在result中給出地址進行跳轉。
下面給出具體的返回重定向的URL的對象模型:
public class Result
{
public long TimeConsume { get; set; }
public int Code { get; set; }
public string Message { get; set; }
public string StackTrace { get; set; }
public string redirectUrl { get; set; }
public Result()
{
Code = 0;
Message = "操作成功";
}
}
其中的code定義可以擴展,如下圖:
code |
message |
||
1 |
操作成功 |
||
2 |
mc不對 |
||
-1 |
操作失敗 |
||
具體的返回地址可以存放在redirectUrl的字符串中。
7.2.1Token的定義和失效時間
Result對象模型中的code爲操作成功返回的RedirectUrl中有Token和t來控制安全性,用t重定向到真正的H5頁面模塊的同時傳遞DateTime.Now.Ticks的t變量的時間戳來讓OA驗證是否在五分鐘內有效來進行跳轉。
跳轉OA的驗證方式增加了tick的hash加密,如下面代碼:
/// <summary>
/// 計算安全簽名
/// </summary>
/// <param name="ADAccount">用戶登錄賬戶</param>
/// <param name="ticks"></param>
/// <returns></returns>
public string BuildSign(string ADAccount,string ticks)
{
return MD5Encode(ADAccount + "{" + ConfigurationManager.AppSettings["MobilSalt"] + "}"+ ticks);
}
public string BuildSign(string ADAccount, string MobilSalt , string ticks)
{
return MD5Encode(ADAccount + "{" + MobilSalt + "}"+ticks);
}
/// <summary>
/// MD5加密
/// </summary>
/// <param name="str">明文字符串</param>
/// <returns></returns>
private static string MD5Encode(string str)
{
MD5 md5 = new MD5CryptoServiceProvider();
byte[] fromData = System.Text.Encoding.Unicode.GetBytes(str);
byte[] targetData = md5.ComputeHash(fromData);
string byte2String = null;
for (int i = 0; i < targetData.Length; i++)
{
byte2String += targetData[i].ToString("x");
}
return byte2String;
}
跳轉OA的驗證方式不以header來跳轉,以userNo,以上面的Hash算法以及t這個當天時間戳爲QueryStirng參數傳遞。
8.1 在returnURL中直接給出返回地址
在hash+userNo的方式上增加returnUrl來對某一跳轉進行返回。用蒙版做在第三方跳轉頁面的頂部進行跳轉。HttpContext.Current.Request.Url.AbsolutePath方法用得服務器域名+頁面地址來獲得傳遞到returnUrl中。
8.2配置在第三方這邊的返回地址
在第三方的數據庫中配置某個模塊返回某個模塊的固定配置,優點是靈活配置容易,缺點是多個來源頁面跳轉同一個第三方頁面模塊返回困難。這個實現多個來源頁面的話還是需要多傳參數來告知第三方需要返回哪個頁面。
8.3 Etone 返回
關於Etone 返回的方法Demo:
1 打開頁面
頁面通過js 和原生交互,調用原生 ETone.open(url, flag, title) 注:考慮IOS和安卓兼容
{url :打開地址,flag:0顯示標題,1不顯示標題, title 標題名稱}
2.返回刷新
頁面通過js 和原生交互,調用原生ETone.close(),關閉當前頁面,顯示父頁面並實現父頁面的刷新,JS 原生刷新 會導致無法返回Etone App, 如: window.location.reload()。實現返回刷新Demo:
子頁面:
用localStorage.pagecount = '1';記錄個值
ETone.close();
ETone.RefreshShell();
父頁面:
ETone.open(子頁面地址);
localStorage.pagecount = '0';
var interval = setInterval(function () {
if (localStorage.pagecount != '0') {
//實現頁面數據重新綁定,window.location.reload() 無法返回Etone app
clearInterval(interval);
}
}, 100);