如今,网民越来越多地使用互联网通过社交网站与朋友、家人和同事建立联系。曾经通过电子邮件进行的对话现在发生在 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…