如今,網民越來越多地使用網際網路透過社交網站與朋友、家人和同事建立聯絡。曾經透過電子郵件進行的對話現在發生在 Facebook 牆上的短訊息或 Twitter 上的簡短推文中。曾經透過握手建立的聯絡現在透過 LinkedIn 建立。當希望面對面會面時,可以使用 TripIt 共享旅行詳情。
正如人們使用這些社交網站相互交流一樣,企業也在尋找方法將自己注入社交圖譜,以便以更個人的方式與客戶建立聯絡,並使他們的網站成為客戶社交體驗的延伸。
本週,我們很高興釋出了 Spring Social 的第一個里程碑版本,這是一個 Spring 的新擴充套件,旨在提供一個平臺,用於構建具有社交功能的 Spring 應用程式。我想借此機會向您介紹 Spring Social,並讓您初步瞭解它提供的功能。
安全共享社交資料
表面上看,開發與各種社交網路互動的應用程式似乎很簡單。由於大多數社交網路都提供 REST API,Spring 的 RestTemplate 似乎就是您所需要的。但您很快會發現,這些社交 REST API 受 OAuth 保護,並且使用 OAuth 憑據簽署透過 RestTemplate 傳送的請求是一項非瑣碎的任務。
OAuth 是一種開放協議,它允許使用者與其在一個或多個服務提供商上託管的資料共享給另一個應用程式。透過訪問這些資料,應用程式可以聚合、呈現和處理資訊,從而提供超出服務提供商本身預期或設想的附加價值。
幾乎所有主要的提供商都支援 OAuth,包括 Twitter、Facebook、LinkedIn、TripIt 和 Foursquare,以及 Google 和 Yahoo API。因此,OAuth 對於開發具有社交功能的應用程式至關重要。
在 OAuth 安全互動的開始階段,有一個來回的對話,通常稱為“OAuth 舞步”。在典型的 OAuth 舞步中,涉及三方:
- 服務提供商(例如 Twitter 或 LinkedIn)
- 希望訪問或更新該服務提供商託管資料的使用者。
- 使用者希望與之共享資料的消費者應用程式。
此舞步的關鍵步驟如下:
- 消費者應用程式將使用者重定向到服務提供商的站點進行登入並授權消費者。
- 假設使用者同意授予消費者訪問其資料的許可權,則流程將返回到消費者應用程式。
- 消費者應用程式從服務提供商處收到訪問令牌。
步驟 3 中收到的訪問令牌是任何請求服務提供商 REST API 都必須附帶的“代客鑰匙”。在 OAuth 1 中,這意味著訪問令牌、請求 URL、引數以及其他一些資訊被收集到一個基本字串中,進行加密,然後作為 Authorization 標頭髮送到請求中。構造此標頭並將其附加到請求是一項複雜的任務。這就是為什麼使用 RestTemplate 訪問 OAuth 安全資源很困難的原因。如果操作錯誤,服務提供商將對您嘗試訪問的任何資源響應 HTTP 401,並且對加密的 Authorization 標頭進行除錯很棘手。
使用社交模板
Spring Social 的一個關鍵元件是其社交模板集合。這些模板(在底層利用 RestTemplate)暴露了它們所模擬的服務提供商的操作,並處理了新增 OAuth Authorization 標頭的複雜性。
Spring Social 1.0.0.M1 包含 4 個社交模板供您選擇:
TwitterTemplate
FacebookTemplate
LinkedInTemplate
TripItTemplate
要使用這些模板中的任何一個,只需建立一個例項,透過建構函式引數提供 OAuth 連線詳細資訊。例如,建立 TwitterTemplate 的例項:
TwitterTemplate twitter = new TwitterTemplate(apiKey, apiSecret, accessToken, accessTokenSecret);
TwitterTemplate 建構函式中的四個引數都是 String 型別。API 金鑰和 API 金鑰在您向 Twitter 註冊應用程式時獲得(請參閱 http://dev.twitter.com/apps/new)。訪問令牌和訪問令牌金鑰是在 OAuth 舞步與 Twitter 結束時按使用者授予您的應用程式的。此時,我將假設您已經獲得了這四個值;我們稍後會回到如何管理 API 金鑰和令牌。
建立其他社交模板的例項並沒有太大區別。LinkedInTemplate 和 TripItTemplate 各自具有與上面顯示的 TwitterTemplate 建構函式相同的引數列表的建構函式。由於 Facebook 的 API 安全性基於 OAuth 2,FacebookTemplate 的建構函式更簡單,只需要訪問令牌的值。
FacebookTemplate facebook = new FacebookTemplate(accessToken);
一旦您擁有了其中一個社交模板的例項,您可以用它做什麼?如果您使用的是 TwitterTemplate,也許您想知道已認證使用者的 Twitter 螢幕名稱?
String screenName = twitter.getProfileId();
或者,如果您想做一些更復雜的事情,也許您可以代表使用者傳送一條推文?
twitter.updateStatus("Hey, I'm tweeting with #Spring Social!");
同樣,有了 FacebookTemplate,您可以釋出到使用者的牆上。
facebook.updateStatus("Spring Social can also post to Facebook!");
如果您想檢視使用者的即將到來的旅行行程,TripItTemplate 的 getTrips() 可以滿足您的需求。
List trips = tripIt.getTrips();
for(Trip trip : trips) {
System.out.println("I'm traveling to " + trip.getPrimaryLocation() +
" on " + trip.getStartDate());
}
這只是 Spring Social 模板可以做的一些事情的示例。請檢視 API 文件以瞭解可用的其他操作。
管理 OAuth 連線
當我上面建立 TwitterTemplate 例項時,我省略了 API 金鑰/金鑰和訪問令牌的來源。起初,訪問令牌將在使用者授權應用程式訪問其在服務提供商處託管的資料後獲得。但您可能不希望每次使用者使用您的應用程式時都強制他們進行授權,因此您需要一種方法來長期儲存訪問令牌,以便在將來的會話中重複使用。
在其第一個里程碑版本中,Spring Social 沒有提供 OAuth 令牌管理策略,而是讓應用程式自行獲取和管理 OAuth 詳細資訊。這是我們計劃在 1.0 Milestone 2 中解決的問題。但在此之前,我們可以參考 Greenhouse 來了解這可能如何成形。
在 Greenhouse 中,有關服務提供商的所有資訊都儲存在關係資料庫的 ServiceProvider 表中,其架構如下:

如您所見,ServiceProvider 表包含提供商的 API 金鑰和金鑰等資訊。為了訪問單個服務提供商記錄,Greenhouse 使用 JdbcServiceProviderFactory,它是 ServiceProvider 介面的實現。
package com.springsource…