來源:互聯網
上載者:User
關鍵字
IBM
SmartCloud
Entry
Restlet
安全機制
本文將簡要介紹 IBM SmartCloud Entry 自帶的兩種 Web Service 安全機制,以及如何在各種用戶端程式設計通過這些安全機制的認證。
環境準備
一個運行的 IBM SmartCloud Entry 系統 Eclipse 3.6 或者更高版本
開始之前
在正式開始之前,先對本文將用到的一些名詞做基本的解釋。
Restlet:誕生於 2005 年,是一個針對 JAVA 語言開發人員的開源專案。 Restlet 旨在以一種簡單的方式,向開發人員提供各個應用場景下實現 REST Web Service 的方法。 目前 Restlet 的最新穩定版本是 2.1.1,本文的所有內容都是基於 Restlet 2.1.1 來進行說明。 Dojo:Dojo 是一個強大的前端框架,它提供了方便的 Ajax 方法、豐富的小部件、資料結構、輔助函數、效果和佈局説明。 Dojo 是一個較為活躍的開源專案,截止到目前,Dojo 的最新版本是 1.8.1。 本文中的所有實現將基於 Dojo 1.8.1。 jQuery:jQuery 是一個優秀的羽量級 JavaScript 框架。 可以方便的提供 Ajax 交互,各種動畫效果。 jQuery 的應用文檔很詳細,同時還有許多成熟的外掛程式可供使用。 本文中所有實現將基於 jQuery1.9.1。 HttpClient:Apache Jakarta Common 下的子專案,可以用來提供高效的、最新的、功能豐富的、支援 HTTP 協定的用戶端程式設計工具組。 cURL:由瑞士 curl 組織開發,是一個綜合的網路傳輸工具。 更多內容,請參考 cURL 網站。
基於 Restlet 的 WebService 安全機制
Restlet 框架自帶了一套完整的使用者認證機制,IBM SmartCloud Entry 的使用者認證機制正是基於 Restlet 實現。 Restlet 框架的使用者認證機制如圖 1 所示。
圖 1. Restlet 的認證機制
從圖中可以看出,Client 若沒有通過認證,是沒有辦法接觸到 REST 資源。
IBM SmartCloud Entry 在版本 3.1 以前,只支援 HTTP Basic Authentication 的認證方式。 從版本 3.1 開始,在原來的基礎上,新增了 Token Authentication 的認證方式,使用者可以根據自己的需要選用相應的認證方式。 若用戶端同時帶有兩種認證,IBM SmartCloud Entry 將只按照 HTTP Basic Authentication 進行認證。 接下來,將簡要介紹如何在各個用戶端程式設計以通過這兩種認證。
HTTP Basic Authentication
HTTP Basic Authentication 可以說是最簡單的 HTTP 認證方式。 它僅需要靜態的、標準 HTTP header 就能完成認證。 同時,它不需要登錄頁面,可以將使用者名和密碼直接通過 URL 傳入,例如:HTTP://username:password@www.example.com/path。 但是,另一方面,Basic Authentication 幾乎沒有任何機密性,使用者名和密碼僅僅是經過 BASE64 編碼就從用戶端傳遞到伺服器端。
用戶端想要通過 HTTP Basic Authentication,首先需要確認使用者名和密碼是正確的,然後將使用者名和密碼通過一個「:」連接,進行 BASE64 編碼,編碼的結果與「Basic 」結合置於一個叫「 Authorization」的 HTTP header 中,即可通過認證。
IBM SmartCloud Entry 提供一個 REST API,POST 「//hostname:port/unsecured/cloud/api/auth」,可以用於驗證所提供的使用者名和密碼是否合法。 下面的例子將用到這個 REST API 以驗證使用者名和密碼。
如何使得 Dojo 用戶端通過認證
清單 1 展示了如何在 Dojo 用戶端程式設計以 HTTP Basic Authentication 方式通過 IBM SmartCloud Entry 的認證。 在確認了使用者名和密碼之後,獲取已經部署的 workload 來檢驗已經通過認證。
清單 1. Dojo 用戶端通過 HTTP Basic Authentication
dojo.require("dojox.encoding.digests._base");dojo.ready(function() { var base64Encode, username = "xhh", password = " password"; dojo.xhrPost({// 通過 post 方式驗證使用者名和密碼是否有效 // 這裡的絕對位址是 hostname:port/unsecured/cloud/api/auth url: ".. /.. /unsecured/cloud/api/auth", content: { username: encodeURIComponent(username), password: encodeURIComponent(password ) }, sync: true, // 這裡為了直觀表現,將該 Ajax 請求設置成同步 // 實際中可以設置成非同步方式 handle: function(response, ioArgs) { if (ioArgs.xhr.status == 200) { //進行 Base64 編碼 base64Encode = dojox.encoding.digests.wordToBase64( dojox.encoding.digests.stringToWord( encodeURI(username)+":"+encodeURI(password))); } else { console.error("Wrong username or password!"); } } }); if (base64Encode) { // 驗證是否能通過認證 dojo.xhrGet({ // 這裡的絕對位址是 hostname:port/cloud/api/workloads url: ".. /api/workloads", handleAs: "json", headers: { "Accept": "application/json, text/plain, text/html", "Authorization": " Basic " + base64Encode, "Content-Type": "text/plain; charset=UTF-8" }, handle: function(response, ioArgs) { if (ioArgs.xhr.status == 200) { console.log(response); } else { console.error(response); } } }); }});
用戶端只要記住 base64Encode 的值,在每個 HTTP 要求時傳入 Authorization 即可完成通過認證。