越来越多的网民正在使用互联网通过社交网站与朋友、家人和同事联系。曾经通过电子邮件进行的对话现在正在通过写在某人 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
)公开其建模的服务提供商的操作,为您处理添加 OAuthAuthorization
标头的复杂性。
Spring Social 1.0.0.M1 包含 4 个可供选择的社交模板:
TwitterTemplate
FacebookTemplate
LinkedInTemplate
TripItTemplate
要使用任何这些模板,只需创建一个实例,通过构造函数参数提供 OAuth 连接详细信息。例如,要创建一个TwitterTemplate
实例:
TwitterTemplate twitter = new TwitterTemplate(apiKey, apiSecret, accessToken, accessTokenSecret);
TwitterTemplate
构造函数的四个参数都是字符串值。当您在 Twitter 上注册您的应用程序时,会为您提供 API 密钥和 API 密钥秘密(参见http://dev.twitter.com/apps/new)。访问令牌和访问令牌密钥在与 Twitter 的 OAuth 认证流程结束时,会按用户授予您的应用程序。在这一点上,我假设您已经获得了所有这四个值;稍后我们将回到如何管理 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 里程碑 2 中解决的问题。但是,与此同时,我们可以查看Greenhouse,了解这可能如何形成。
在 Greenhouse 中,关于服务提供商的所有信息都存储在关系数据库的ServiceProvider
表中,其模式如下:
如您所见,ServiceProvider
表包含(除其他外)提供商的 API 密钥和密钥秘密。为了访问单个服务提供商记录,Greenhouse 使用JdbcServiceProviderFactory
,这是ServiceProvider
接口的实现。
package com.springsource…