社交化 Spring 应用程序
越来越多的网民使用互联网与朋友、家人和同事通过社交网站联系。曾经通过电子邮件进行的对话,现在则变成了在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
构造函数的四个参数都是字符串值。当您向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…