文/仲瑋 范軼 代成琴
校園社交網(wǎng)絡(luò) API設(shè)計(jì)方法
文/仲瑋 范軼 代成琴
近些年來,隨著社交網(wǎng)絡(luò)的發(fā)展,以校園信息服務(wù)為載體的校園社交作為一種新興媒介開始流傳起來。校園社交網(wǎng)絡(luò)基于社會(huì)網(wǎng)絡(luò)關(guān)系思想,將校園網(wǎng)作為平臺(tái),實(shí)現(xiàn)了校園網(wǎng)內(nèi)信息應(yīng)用的社會(huì)化數(shù)據(jù)集成。
在校園社交網(wǎng)絡(luò)里,為廣大開發(fā)者和校園用戶提供開放數(shù)據(jù)的開發(fā)平臺(tái)至關(guān)重要。使用開發(fā)平臺(tái)提供的API(Application Programming Interface 應(yīng)用程序接口)可以讓用戶無須通過Web接口就可以連接到校園社交網(wǎng)絡(luò)應(yīng)用之中,并被允許在這個(gè)平臺(tái)上創(chuàng)建新的應(yīng)用。使得Web、桌面、移動(dòng)應(yīng)用的多種操作成為可能,程序開發(fā)者的分工更加明確,降低了開發(fā)成本。因此,設(shè)計(jì)一個(gè)合理的API系統(tǒng)將有助于豐富校園網(wǎng)應(yīng)用,構(gòu)建以校園社交為核心的校園信息體系。
目前API的設(shè)計(jì)主要存在SOAP和REST兩種設(shè)計(jì)方案。前者基于SOA集成,表現(xiàn)了不同軟件構(gòu)件之間通過各種過程或方法進(jìn)行的交互,屬于面向服務(wù)架構(gòu);后者則將每個(gè)軟件構(gòu)件看作一組數(shù)據(jù)庫表,屬于面向資源架構(gòu)。由于REST具有輕量級應(yīng)用、輸出人工可讀的結(jié)果集、易于構(gòu)建、無需工具支持等優(yōu)點(diǎn), 目前各大互聯(lián)網(wǎng)廠商如Google、Twitter等多采取REST方案來構(gòu)建API。
REST是英文Representational State Transfer(表述性狀態(tài)轉(zhuǎn)移)的縮寫,是近年來迅速興起的,一種基于HTTP、URI以及XML這些現(xiàn)有協(xié)議與標(biāo)準(zhǔn)的,針對網(wǎng)絡(luò)應(yīng)用的設(shè)計(jì)和開發(fā)方式。它可以降低開發(fā)的復(fù)雜度,提高系統(tǒng)的可伸縮性。REST架構(gòu)風(fēng)格最初由Roy T. Fielding(HTTP/1.1協(xié)議專家組負(fù)責(zé)人)在其2000年的博士學(xué)位論文中提出, 其核心是可編輯的資源及其集合。每個(gè)資源或者集合有一個(gè)惟一的URI,系統(tǒng)以資源為中心,構(gòu)建并提供一系列的Web服務(wù)。HTTP就是該架構(gòu)風(fēng)格的一個(gè)典型應(yīng)用。從其誕生之日開始,它就因其可擴(kuò)展性和簡單性受到越來越多的架構(gòu)師和開發(fā)者們的青睞。
對于校園應(yīng)用而言,良好的API設(shè)計(jì)可以提高校園第三方應(yīng)用開發(fā)者的效率,易于用戶使用,并具有良好的擴(kuò)展性。因此,我們的RESTFUL API設(shè)計(jì)方案應(yīng)遵循以下基本原則:
1. 將系統(tǒng)上的所有事物都抽象為資源,每個(gè)資源對應(yīng)惟一的資源標(biāo)識(shí);
2. 簡單直觀,將通用邏輯以組件的方式展示,遵循RESTful風(fēng)格;
3. 開發(fā)人員友好性。API是一種為開發(fā)人員設(shè)計(jì)的產(chǎn)品,因此API的設(shè)計(jì)應(yīng)對第三方程序開發(fā)者保持友好,如盡可能支持多種數(shù)據(jù)返回格式,在瀏覽器調(diào)試中易于輸入等;
4. 安全性。盡可能使用標(biāo)準(zhǔn)的安全協(xié)議,這樣在跨系統(tǒng)對接時(shí)會(huì)有更好的兼容性。同時(shí)充分考慮私有API的認(rèn)證授權(quán)和安全控制,必要的API接口做好訪問頻率控制。
校園社交網(wǎng)絡(luò)的主要用戶群體是校園師生用戶,均需通過校園統(tǒng)一身份認(rèn)證進(jìn)行登錄,因此API的身份驗(yàn)證也應(yīng)以此為基礎(chǔ),通過分享用戶信息、社會(huì)關(guān)系、消息、頭像等方式將信息擴(kuò)展到其他第三方系統(tǒng)。采用分層的方式對公共業(yè)務(wù)進(jìn)行設(shè)計(jì)并提供有效的API供模塊通信。在REST風(fēng)格中,資源標(biāo)識(shí)結(jié)構(gòu)和URI模式的設(shè)計(jì)與API設(shè)計(jì)一脈相承,其設(shè)計(jì)如圖1所示。
1.HTTP Method 是REST利用Http實(shí)現(xiàn)的對資源的CURD功能,它提供了一個(gè)操作資源的統(tǒng)一接口,包括GET/POST/PUT/DELETE等。對于任何資源的操作都應(yīng)該對應(yīng)到前面方法中。
2.REST被稱為面向資源的開發(fā),這說明對資源的抽象是設(shè)計(jì)API的一個(gè)重要環(huán)節(jié)。{resources}用于表示校園社交網(wǎng)絡(luò)API系統(tǒng)的主體資源名,如用戶屬性、標(biāo)簽、頭像、社會(huì)關(guān)系等,{action_ name}則用于抽象對于資源的操作,同時(shí)與HTTP Method相對應(yīng),根據(jù)HTTP請求實(shí)現(xiàn)不同的對象操作。

圖1 RESTFUL API的URI設(shè)計(jì)
社交網(wǎng)絡(luò)中的資源,在描述了某種事物的同時(shí),有時(shí)還存在著一定的層次結(jié)構(gòu)關(guān)系。比如,系從屬于某個(gè)學(xué)院,班級從屬于系;學(xué)生信息可以從屬于班級,也可以從屬于某個(gè)公寓。當(dāng)資源有這種層次關(guān)系的時(shí)候,需要使用復(fù)合的URI模式來幫助開發(fā)者更好地理解和設(shè)計(jì)資源。
3.開發(fā)者在發(fā)送一個(gè)REST API的請求同時(shí),針對相同的資源根據(jù)場景的不同可能會(huì)希望得到不同的返回形式。比如使用javascript時(shí)希望得到JSON的返回,而使用C++時(shí)可能希望得到XML的返回。為了提供這種完備的內(nèi)容協(xié)商能力,在這里設(shè)計(jì)了{(lán)format}參數(shù),使用URI的模式直接用于定義響應(yīng)和請求中的資源表述格式。
4.參數(shù)。在API中URI應(yīng)設(shè)計(jì)的盡量簡短,這里使用參數(shù)的方式用于結(jié)果過濾、排序、搜索、分頁等相關(guān)功能。但過多的參數(shù)會(huì)導(dǎo)致URL的可讀性變差,更有甚者,可能會(huì)導(dǎo)致URL過長,使得API請求無法執(zhí)行。因此參數(shù)的設(shè)置應(yīng)在合理的范圍內(nèi)使用,必要時(shí)設(shè)置別名來代替常用的過濾、搜索請求。
URI是RESTFUL API設(shè)計(jì)中非常重要的一個(gè)環(huán)節(jié),在通過URI定義好了資源與允許的操作之后,為實(shí)現(xiàn)RESTFUL API,還須在以下幾方面進(jìn)行設(shè)計(jì)。
REST架構(gòu)的一個(gè)基本要求是保證操作語義的可見性,因此應(yīng)正確地將API執(zhí)行結(jié)果以及失敗的原因以HTTP狀態(tài)代碼的方式傳達(dá)給客戶程序,詳細(xì)描述操作是否成功、如果出錯(cuò)原因是什么,并采取相應(yīng)的后續(xù)動(dòng)作。API的錯(cuò)誤碼可以分為客戶端錯(cuò)誤和服務(wù)器端錯(cuò)誤兩部分。API應(yīng)該至少將所有的客戶端錯(cuò)誤以json形式返回。如圖2所示。
API的緩存處理是提高API使用效率的重要措施。包括model查詢結(jié)果緩存、URL頁面緩存、類對象緩存等。最簡單的方式可以采用HTTP自帶的緩存框架。HTTP 頭中有“Cache-control”字段來控制如何使用緩存,常見的取值有 private、no-cache、max-age、must-revalidate 等。
還有一種緩存方案,即通過支持條件請求與電子標(biāo)簽ETag來處理緩存。當(dāng)用戶請求數(shù)據(jù)內(nèi)容時(shí),系統(tǒng)在返回?cái)?shù)據(jù)的同時(shí),在HTTP頭中,將返回根據(jù)服務(wù)器內(nèi)容的最后修改時(shí)間Last-Modified,或者根據(jù)服務(wù)器內(nèi)容生成電子標(biāo)簽ETag。當(dāng)用戶再次請求數(shù)據(jù)時(shí),就可以在HTTP請求中使用If-Modified-Since或者If-None-Match 頭信息,把上次請求得到的時(shí)間戳或者電子標(biāo)簽傳給服務(wù)器。當(dāng)收到一個(gè)有條件請求的HTTP頭的REST請求的時(shí)候,我們的程序需要將收到的時(shí)間戳或者電子標(biāo)簽與當(dāng)前內(nèi)容作比較,就可以很容易地知道用戶請求的數(shù)據(jù)內(nèi)容在這段時(shí)間是否發(fā)生過修改,并根據(jù)比較結(jié)果返回給用戶最新內(nèi)容,或者用HTTP響應(yīng)碼304告知用戶,內(nèi)容沒有變化。

圖2 json形式錯(cuò)誤信息返回示例
安全設(shè)計(jì)是API設(shè)計(jì)中不可回避的一項(xiàng)工作,在這里我們使用OAuth協(xié)議用于身份認(rèn)證。校園社交網(wǎng)絡(luò)的API相當(dāng)于授權(quán)外部應(yīng)用訪問社交網(wǎng)絡(luò)站內(nèi)資源,OAuth協(xié)議正適用于此。OAuth協(xié)議將與校園網(wǎng)已建設(shè)的統(tǒng)一身份認(rèn)證系統(tǒng)相結(jié)合最終為面向最終用戶維度的API提供授權(quán)。對于身份認(rèn)證之后的安全控制則主要通過應(yīng)用控制,采用基于角色的方式來實(shí)現(xiàn)資源的訪問授權(quán)。
除了OAuth認(rèn)證,還可以輔助使用其他的安全措施。比如對全部參數(shù)進(jìn)行簽名防止篡改;在請求中增加一次性的Token,或者短時(shí)間內(nèi)有效的Token;對內(nèi)容加密防止數(shù)據(jù)泄露等等。
隨著云計(jì)算和移動(dòng)計(jì)算的興起,許多企業(yè)愿意在互聯(lián)網(wǎng)上共享自己的數(shù)據(jù)、功能,對于校園社交網(wǎng)絡(luò)也是如此。開放API是大勢所趨,通過使用API,開發(fā)人員將可很方便地訪問社交網(wǎng)絡(luò)中的的海量內(nèi)容,可以以編程的方式訪問一個(gè)特定用戶的信息,使得信息的傳遞存在了無限可能性。
RESTFUL API是校園社交網(wǎng)絡(luò)系統(tǒng)的基礎(chǔ)構(gòu)架,因此在設(shè)計(jì)時(shí)需要從整個(gè)社交網(wǎng)絡(luò)設(shè)計(jì)的高度進(jìn)行思考。REST把軟件架構(gòu)的概念與網(wǎng)絡(luò)架構(gòu)的概念相互結(jié)合起來,使得之成為可測量的分布式系統(tǒng)的理想狀態(tài),提高了信息數(shù)據(jù)的處理能力和通訊效率。
(作者單位為哈爾濱工業(yè)大學(xué)網(wǎng)絡(luò)與信息中心)
OpenSSL是當(dāng)今應(yīng)用最廣泛的加密軟件之一,因此漏洞影響的范圍非常廣泛,幾乎包括所有利用openssl組件來實(shí)現(xiàn)ssl功能的服務(wù),具體有:
1. 使用Apache及Nginx兩款軟件的https服務(wù)(tcp 443端口);
2. 使用ssl協(xié)議的加密pop3(tcp 995端口),加密SMTP(tcp 465端口)、IMAP(tcp 994端口)的郵件系統(tǒng);
3.使用ssl協(xié)議并使用openssl做組件的vpn(tcp 443端口及1194端口)設(shè)備;
4.使用ssl協(xié)議的加密及時(shí)通訊XMPP(tcp 5222端口);
5.其他基于openssl組件開發(fā)的應(yīng)用加密程序,如在線交易程序等;
需要說明的是,這個(gè)漏洞會(huì)泄露系統(tǒng)中原本加密的用戶名和密碼,并且即便被攻擊過也不會(huì)在系統(tǒng)上留下任何痕跡,因此如果您的系統(tǒng)使用openssl來加密登錄過程的話,除了要及時(shí)安裝補(bǔ)丁程序外,還需要對攻擊帶來后續(xù)影響進(jìn)行評估。根據(jù)我們的檢測,只要您的系統(tǒng)存在該漏洞并且不是補(bǔ)丁發(fā)布后馬上進(jìn)行升級的,十之八九都被攻擊者光顧過了,為安全起見建議通知從漏洞出現(xiàn)(4月7日晚)到您系統(tǒng)升級完后這段時(shí)間里登錄過系統(tǒng)的用戶更改密碼,避免賬號(hào)被他人利用。
(供稿:鄭先偉)