Rop開發手冊 3 最簡單的服務開放平台框架

2021-09-01 09:56:10 字數 3398 閱讀 7609

:d [quote]rop專案文件前後寫了乙個多月,在寫的過程中發現很多功能不完善的,又回過頭了改專案,此種反覆多次,現在rop開源專案的文件已經差不多了,將陸續在iteye此發出,希望對大家有幫助。在rop專案的開發過程中得到了眾多iteye網友的有力幫助,收到了很多很好的整改的意見,在此對他們的奉獻和幫助表示誠摯的感謝,這些網友包括但不限於:

[url=

[url=

[url=http://風一樣的男子[/url]

[url=

[url=木木的愛情童話[/url]

[url=

[url=

:) :idea:

[/quote]

[b][size=large]目錄[/size][/b]

[url=快速了解rop[/url]

[url=請求服務模型[/url]

3.應用授權及驗證

4.服務會話管理

5.錯誤處理模型

6.響應報文控制

7.檔案上傳

8.服務安全控制

9.***及事件體系

10.效能調優

11.開發客戶端sdk

12.參考資料

[b][size=x-large]應用鍵/應用金鑰[/size][/b]

當使用者需要訪問某個應用系統前,應用系統一般都需要對該使用者進行身份認證。常見的身份認證方法是讓使用者輸入「使用者/密碼」,當通過驗證後,允許進入系統,否則阻止使用者登入系統。

[b][size=x-large]應用鍵/金鑰管理器[/size][/b]

由於rop需要在服務端採用相同的演算法計算請求引數的簽名,並和客戶端傳送過來的簽名進行比較,如果兩者相等,便認為當前互動的客戶端是合法的客戶端,反之則認為是乙個非法的客戶端。

[list]

[/list]

[quote]00001=abcdeabcdeabcdeabcdeabcde

00002=abcdeabcdeabcdeabcdeaaaaa[/quote]

[b][size=x-large]簽名演算法[/size][/b]

(1)所有請求引數按引數名公升序排序;

(2)按請求引數名及引數值相互連線組成乙個字串:…;

(3)將應用金鑰分別新增到以上請求引數串的頭部和尾部:《請求引數字串》;

(4)對該字串進行sha1運算,得到乙個二進位制陣列;

(5)將該二進位制陣列轉換為十六進製制的字串,該字串即是這些請求引數對應的簽名;

(6)該簽名值使用sign系統級引數一起和其它請求引數一起傳送給服務開放平台。

假設,user.create的服務有3個業務級引數,分別為username、age及***。這些業務級引數和系統級引數的值如下表所示:

[table]

|系統級引數名稱 |引數值 v業務級引數名稱| 引數值|

|sessionid |aaaa |age |24|

|method |user.create |*** |1|

|v |1.0 |

|format |xml |

|locale |zh_cn |

[/table]

根據rop的簽名演算法,首先按字母順序將所有引數名和引數值拼裝成乙個字串:

對以上字串進行sha1簽名運算,將簽名值轉換為十六進製制的編碼串,得到:

[quote]8625fd7eeae1e68203b48c64de495792bf59e833[/quote]

最後,客戶端即可使用如下的url請求串對user.create服務方法發起請求:

[b][size=x-large]簽名功能控制[/size][/b]

預設情況下,rop會對每個服務請求進行簽名驗證,如果簽名驗證報錯,將直接駁回請求並回報相應的錯誤資訊。rop允許服務平台開發者開啟或關閉簽名驗證的功能,rop提供了3個級別的控制:

[list]

[*]平台級:開啟或關閉服務平台所有服務的簽名驗證功能;

[*]服務級:在平台級簽名驗證功能開啟的情況下,可以關閉某個具體服務的簽名驗證;

[*]引數級:在後續內容中,我們知道rop的簽名演算法要求把所有的引數拼裝成乙個字串,如果有些引數值很大(如上傳檔案的檔案內容),簽名演算法將需要構造乙個很大的字串,占用很大的記憶體。從安全上來說,僅需對一些關鍵的引數進行簽名就可以了,並非一定要對所有的引數進行簽名。有鑑於此,rop在服務簽名時允許忽略某些引數,提供引數級的簽名控制。

[/list]

[b][size=large]平台級控制[/size][/b]

通過的sign-enable屬性即可開啟或關閉服務平台簽名驗證功能:

我們強烈建議在生產環境下開啟服務簽名驗證的功能,以保證服務平台的安全性,免受惡意客戶終端的攻擊。

服務級控制

在平台級簽名功能開啟的情況下,rop還允許關閉某個服務的簽名驗證功能。通過將@servicemethod的ignoresign屬性設定為ignoresigntype.yes即可:

@servicemethod(method = "user.add", version = "5.0", ignoresign = ignoresigntype.yes)

public object adduser5(createuserrequest request)

這樣,客戶端在訪問user.add#5.0的服務方法時,就不必提供請求引數的簽名資訊了。

[b][size=large]引數級控制[/size][/b]

在定義服務方法的roprequest類時,只要在roprequest的某些屬性上標註了@ignoresign,這些屬性所對應的請求引數就可以排除在簽名引數列表之外了。來看乙個例子:

public class logonrequest extends abstractroprequest")

private string username;

@ignoresign

@pattern(regexp = "\\w")

private string password;

...}

logonrequest的password屬性所對應的請求引數將不會納入到簽名演算法的引數列表中。使用這種辦法,可以在具體的roprequest類中將某些屬性對應的請求引數排除在簽名演算法之外。

如果希望某一型別的屬性統一忽略簽名,有沒有簡單的方法呢?rop提供了一種非常便捷的方法,即在屬性類定義處使用@ignoresign註解即可。如用於儲存上傳檔案的uploadfile類就標註了@ignoresign註解:

@ignoresign

public class uploadfile

這樣,uploadfile作為任何roprequest類的屬性都將排除在簽名演算法的引數列表之外。關於uploadfile的進一步資訊,請參見後續的內容。

開啟最簡單的tornado服務

import tornado.ioloop 開啟迴圈的模組 import tornado.web web伺服器的大部分方法封裝在這裡 class mainhandler tornado.web.requesthandler 類檢視 def get self,args,kwargs get請求 sel...

C 最簡單的登入Web服務

由於演示程式,所以有以下問題 1,密碼是明碼傳輸。本文在 c 建立最簡單的web服務,無需iis 的基礎上完成。具體步驟 一,requestprocessor增加變數mlogin,改寫parserequestandprocess函式。protected bool mlogin false publi...

C 最簡單的登入Web服務

因為演示程式,所以有下面問題 1。password是明碼傳輸。本文在 c 建立最簡單的web服務,無需iis 的基礎上完畢。詳細步驟 一。requestprocessor新增變數mlogin,改寫parserequestandprocess函式。protected bool mlogin false...