Spring 應用的社交化

工程 | Craig Walls | 2010 年 11 月 03 日 | ...

如今,網民越來越多地使用網際網路透過社交網站與朋友、家人和同事建立聯絡。曾經透過電子郵件進行的對話,現在正在某人 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 APIs。因此,OAuth 對於開發具備社交功能的應用至關重要。

在受 OAuth 保護的互動開始時,有一個來回的對話,通常被稱為“OAuth Dance”(OAuth 舞蹈)。在典型的 OAuth Dance 中,涉及三方

  • 服務提供商(例如 Twitter 或 LinkedIn)
  • 想要訪問或更新該服務提供商託管資料的使用者。
  • 使用者想要分享資料的消費應用。

此舞蹈的關鍵步驟如下

  1. 消費應用將使用者重定向到服務提供商的網站,讓使用者登入並授權給該消費應用。
  2. 假設使用者同意授予消費應用訪問其資料的許可權,流程將返回到消費應用。
  3. 消費應用從服務提供商接收一個訪問令牌。

在步驟 3 中收到的訪問令牌是必須附帶任何請求傳送給服務提供商 REST API 的“代客金鑰”(valet key)。在 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 型別的值。當您在 Twitter 上註冊應用時會獲得 API key 和 API secret(參見 http://dev.twitter.com/apps/new)。access token 和 access token secret 是在與 Twitter 進行 OAuth Dance 結束時,按每個使用者授權給您的應用。在此,我假設您已經獲得了這四個值;稍後我們將回到如何管理 API key 和 token。

建立其他社交模板的例項差別不大。LinkedInTemplateTripItTemplate 各自的建構函式與上面顯示的 TwitterTemplate 建構函式具有相同的引數列表。由於 Facebook 的 API 安全基於 OAuth 2,FacebookTemplate 的建構函式略微簡單,只需要 access token 的值

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!");

如果您想檢視使用者的即將到來的旅行行程,TripItTemplategetTrips() 方法可以滿足您的需求

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 key/secret 和 access token 的來源。最初,access token 是在使用者授權應用訪問服務提供商託管的資料後收到的。但您可能不希望每次使用者使用您的應用時都強制他們進行授權,因此您需要一種方法來長期儲存 access token,以便在未來的會話中重複使用。

在其第一個里程碑版本中,Spring Social 不提供 OAuth token 管理策略,由應用自行獲取和管理 OAuth 詳細資訊。這是我們計劃在 1.0 里程碑版本 2 中解決的問題。然而,在此期間,我們可以參考 Greenhouse 來了解這可能如何實現。

在 Greenhouse 中,關於服務提供商的所有資訊都儲存在關係資料庫中的一個 ServiceProvider 表中,其模式如下

如您所見,ServiceProvider 表除其他資訊外,還包括提供商的 API key 和 secret。要訪問單個服務提供商記錄,Greenhouse 使用 JdbcServiceProviderFactory,它是 ServiceProvider 介面的一個實現

package com.springsource.greenhouse.connect;

public interface ServiceProviderFactory {

    ServiceProvider getServiceProvider(String name);

    <S> ServiceProvider<S> getServiceProvider(String name, Class<S> serviceType);

}

要從資料庫中檢索 Twitter 服務提供商,Greenhouse 只需呼叫 getServiceProvider() 方法,將“twitter”(提供商名稱)作為引數傳入。對於 Twitter,這最終會返回 TwitterServiceProvider 的一個例項,它是 ServiceProvider 介面的一個實現。

ServiceProvider 有幾個方法,但其中兩個方法在 token 管理方面很有趣。第一個是 connect(),Greenhouse 用它來建立其使用者與他們在服務提供商上的社交身份之間的連線

void connect(Long accountId, AuthorizedRequestToken requestToken);

在呼叫 connect() 方法時,Greenhouse 已經完成了足夠的 OAuth dance 流程,手頭擁有了一個已授權的請求 token。將這些以及使用者帳戶 ID 一同傳遞,將在 AccountConnection 表中建立一個連線。AccountConnection 表的模式如下

建立連線後,您可以使用 ServiceProvidergetServiceOperations() 方法來獲取 TwitterOperationsTwitterTemplate 基於的介面)的一個例項

TwitterOperations twitter = twitterProvider.getServiceOperations(accountId);

getServiceOperations() 內部,ServiceProvider 實現會檢索 access token,並將其與其自身的 API key 和 secret 一起使用來構建一個 TwitterTemplate,從而使應用無需直接處理 access token。

在 Greenhouse 中,TwitterOperations 例項是一個請求範圍的 bean,透過 ServiceProvidersApiConfiguration 中的工廠方法使用 Spring JavaConfig 建立,如下所示

@Bean
@Scope(value="request", proxyMode=ScopedProxyMode.INTERFACES)
public TwitterOperations twitter(ServiceProvider<TwitterOperations> twitterProvider, @Value("#{request.getAttribute('account')}") Account account) {

    return twitterProvider.getServiceOperations(accountId(account));

}

作為 Spring bean,TwitterOperations 可以注入到任何需要與 Twitter 交換資料的其他 Spring bean 中。例如,在 Greenhouse 中,EventsController 是處理所有面向事件請求的 Spring MVC 控制器。它使用 TwitterOperations 代表使用者釋出關於事件的推文。它是透過其建構函式注入 TwitterOperations bean 的


@Inject
public EventsController(EventRepository eventRepository, TwitterOperations twitterApi) {
    this.eventRepository = eventRepository;
    this.twitterApi = twitterApi;
}

正如我提到的,我們計劃在里程碑版本 2 中將 ServiceProvider 功能從 Greenhouse 遷移到 Spring Social。顯然,目前的實現支援關係型資料庫儲存 OAuth 詳細資訊,但我們渴望聽取您關於在其他型別的儲存中維護 OAuth 資訊的其他實現的建議。

執行 Greenhouse

雖然您可以在 http://greenhouse.springsource.org 檢視正在執行的 Greenhouse 應用,但在探索 Spring Social 時,您可能希望 checkout Greenhouse 原始碼並親自嘗試一下。為此,請按照以下步驟操作

  1. Checkout Greenhouse 原始碼
    git clone git://git.springsource.org/greenhouse/greenhouse.git
  2. 將 Greenhouse 專案匯入 SpringSource Tool Suite
  3. 將 Greenhouse 專案拖到 SpringSource tcServer 中(在 Servers 標籤頁下)以部署應用。
  4. 編輯 tcServer 的執行配置,在 VM arguments 列表末尾新增 "-DspringProfiles=embedded"。
  5. 啟動伺服器並在您的 Web 瀏覽器中訪問 https://:8080/greenhouse。

需要執行步驟 4,因為 Greenhouse 使用了 Spring 3.1 的新環境 bean 特性,該特性使得只為特定 profiles 建立 bean 成為可能。設定該屬性表示應用應以“embedded” profile 執行。

結論

Spring Social 1.0 M1 是將社交網路功能引入 Spring 的激動人心的探索的第一步。我鼓勵您下載 Spring Social檢視程式碼,並透過問題跟蹤系統Spring Social 論壇Greenhouse 郵件列表提供反饋。

訂閱 Spring 時事通訊

透過 Spring 時事通訊保持聯絡

訂閱

領先一步

VMware 提供培訓和認證,助您加速進步。

瞭解更多

獲取支援

Tanzu Spring 透過一項簡單的訂閱提供 OpenJDK™、Spring 和 Apache Tomcat® 的支援和二進位制檔案。

瞭解更多

即將舉行的活動

檢視 Spring 社群所有即將舉行的活動。

檢視全部