spring-socialを使用してFacebook、LinkedIn、Twitterのステータスを更新する方法

少し前に、新しいSpringSourceプロジェクトについて書いたspring-social 。 今日は、このライブラリをどのように使用できるかを伝えたい(または例を示したい)。 例として、最も単純なアプリケーションを使用します。これにより、3つすべてのサービスにログインし、3つすべてで同時にステータスを更新できます(注意-カットの下に多くの文字とコードがあり、画像がまったくありません)。

画像画像画像画像



ステータスの更新は、次の理由で例として取り上げられました。

*シンプルで明確です。

*この機能はLinkedInのspring-socialではサポートされていません。つまり、デフォルトでspring-socialに実装されていないサービスのAPIメソッドの実装を追加する方法を確認できます。

原則として、ステータス更新のサイトには他の機能があります。



開発者自身は、ライブラリを使用する例としてアプリケーションGreenHouseを参照することをお勧めします-しかし、アプリケーションは非常に大きく、「ソーシャル」部分の分離はそれほど簡単ではありません。 いくつかの例も公開されましたが、「完全な画像」を提供することなく、かなり原始的なものです。 そのため、一方ではサービスへのログインからステータスの送信までの完全な例を表し、一方ではできる限り簡単な小さな例を作成することにしました(自分で理解し、他の人に見せるため)。 したがって-スタイルなしでhtmlが裸であることに失礼します-さらに、Javaコードは常に「美しい」とは限りません-一部の場所では、たとえば継承によってコードを「より正確に」することができますが、例を洗い流してしまうでしょう追加のクラス階層。



この投稿は私の英語投稿の無料翻訳です。

すべてのソースはsvnで入手できます: http : //svn.emforge.net/svnroot/akakunin-experiments/update-status

ソースは、EmForge Webサイトでも表示できます。



基本アプリケーション



「ベース」として、spring frameworkおよびspring-mvcで最も単純なアプリケーションを使用します。 このアプリケーションは、標準の紳士のセットを使用します。

*アセンブリ用のMaven。

* Spring Framework 3.0.5;

* Spring-Security 3.0.5;

* JPA(Hibernate経由);

*ベースとしてのHSQL。



原則として、すべてが可能な限り標準的でシンプルです。 ユーザー(userName、password)を格納するエンティティは、 net.emforge.updatestatus.entity.Userのみです。 ユーザーごとにトークンも保存され、各サービスでの作業に使用されます。

DAOクラスUserDaoUserServiceImplサービスがあります。

アプリケーションには2つのページがあります-メインページ(ログイン)と登録( UserControllerによって処理される)のフォームを持つインデックス(ステータスページはログインユーザーのみ利用可能です-後で説明します)。



一緒に、これはユーザーが登録またはログインでき、ステータスページでサービスの1つに接続してステータスを更新できる最も単純なアプリケーションです。



アプリケーション登録



この例を機能させるには、まず、使用するサービスにアプリケーションを登録する必要があります。

* Facebookへの登録はページhttp://developers.facebook.com/setup/で実行されます-SiteURLとしてlocalhostのみを使用してください:8080 / update-status /-そうでない場合、コールバックは機能しません。

* Twitterで登録: http : //dev.twitter.com/apps/new ;

* LinkedInに参加: https : //www.linkedin.com/secure/developer



いずれの場合も、アプリケーションキー(またはアプリケーションID)とセキュリティトークンの2つのキーを受け取ります。これらはsrc / main / resources / config.propertiesに保存する必要があります



速く走る



すぐにそれがどのように機能し、javaとmavenを持っているかを確認したい場合(これがそうであることを願っています:))-svnからソースを取得して実行します(config.propertiesにキーを書き込んだ後)

mvn tomcat:run







その後、アプリケーションはhttp:// localhost:8080 / update-statusで利用可能になります。

新しいユーザーを作成します-そして、行くと、それがどのように実装されているかがわかります



LinkedInおよびTwitter Connect



OAuthは両方のサービスを操作するために使用され、接続手順も同様です。したがって、Twitterの例を紹介します。

サービスを操作するために、getOAuthServiceのメインメソッドである最も単純なクラスTwitterProviderを作成します。

public OAuthService getOAuthService() {

OAuthConfig config = new OAuthConfig();

config.setRequestTokenEndpoint( "https://api.twitter.com/oauth/request_token" );

config.setAccessTokenEndpoint( "https://api.twitter.com/oauth/access_token" );

config.setAccessTokenVerb(Verb.POST);

config.setRequestTokenVerb(Verb.POST);

config.setApiKey(apiKey);

config.setApiSecret(apiSecret);

config.setCallback(callbackUrl);



return new OAuth10aServiceImpl(

new HMACSha1SignatureService(),

new TimestampServiceImpl(),

new BaseStringExtractorImpl(),

new HeaderExtractorImpl(),

new TokenExtractorImpl(),

new TokenExtractorImpl(),

config);

}








apiKey、apiSecret、 callbackUrlは config.propertiesから注入されます (最初から記述しています)。



接続のために、リンク/ connet / twitterを追加し、ハンドラーを切断します( SocialController内 ):

@RequestMapping(value = "/connect/twitter" , method = RequestMethod.GET)

public String requestConnectionToTwitter(WebRequest request) {

// get request token

Token requestToken = twitterProvider.getOAuthService().getRequestToken();

// store request token in session

request.setAttribute( "twitter_request_token" , requestToken, WebRequest.SCOPE_SESSION);



return "redirect:" + twitterProvider.getAuthorizeUrl() + "?oauth_token=" + requestToken.getToken();

}










実際、このハンドラーはTwitterにリダイレクトしてログインを行います。 ログインに成功した場合、TwitterはcallbackUrlにリダイレクトし、そこにユーザーのキーを渡します。 SocialControllerにコールバックハンドラーを追加します。

/** Callback from twitter on success login

*

* @param verifier

* @param request

* @return

*/

@RequestMapping(value = "/callback/twitter" , method = RequestMethod.GET, params = "oauth_token" )

public String authorizeTwitterCallback(@RequestParam(value = "oauth_verifier" , defaultValue = "verifier" ) String verifier,

WebRequest request) {

// get request token from session

Token requestToken = (Token)request.getAttribute( "twitter_request_token" , WebRequest.SCOPE_SESSION);



// get access token

Token accessToken = twitterProvider.getOAuthService().getAccessToken(requestToken, new Verifier(verifier));

String userName = getCurrentUser().getName();

userService.updateTwitterAuthentication(userName, accessToken.getToken(), accessToken.getSecret());



return "redirect:/status" ;



}







このハンドラでは、トークンを受け取り、将来使用するためにユーザー用にトークンを保存します。



Facebook Connect



Facebookではすべてが少し複雑です。 Facebookに接続するには、次のコードを使用してstatus.jspページに「Facebookに接続」ボタンを配置します。

< form id ="fb_signin" action ="<c:url value=" / connect / facebook " /> " method="post" >

< div class ="formInfo" >

</ div >

< div id ="fb-root" ></ div >

< p >< fb:login-button perms ="email,publish_stream,offline_access" onlogin ="$('#fb_signin').submit();" v ="2" length ="long" > Connect to Facebook </ fb:login-button ></ p >

</ form >



< facebook:init />








次の点に注意することが重要です。

* facebook:initタグはspring-socialライブラリーに実装され、 $ {facebookProvider}ビンがspringコンテキストにある必要があります-FacebookProviderクラスに実装されてます。 実際、タグはこのBeanからキーのみを取得します。

* fb:login-buttonはConnect to Facebookボタンを生成します;

* form-action / connect / facebookは、ログインに成功した場合のコールバックとして使用されます。



また、このコードが機能するためには、tagLibを接続する必要があります

<%@ taglib uri="http://www.springframework.org/spring-social/facebook/tags" prefix="facebook" %>







jQueryを接続します-私の場合は、











さて、あなたは/ connect / facebookに来るコールバックハンドラを書く必要があります:

@RequestMapping(value= "/connect/facebook" , method=RequestMethod.POST)

public String connectAccountToFacebook(@FacebookAccessToken String accessToken,

@FacebookUserId String facebookUserId) {

if (facebookUserId != null && accessToken != null ) {

// store facebook information

String userName = getCurrentUser().getName();

userService.updateFacebookAuthentication(userName, accessToken, facebookUserId);

}

return "redirect:/status" ;

}



* This source code was highlighted with Source Code Highlighter .








この例では、2つの興味深いアノテーションが表示されます。@ FacebookAccessTokenと@FacebookUserIdは春のソーシャル機能の1つですが、機能させるには、特別なWebArgResolverをプロジェクトに追加する必要があります。 これを行うには、 applicationContext.xmlに追加します

< bean id ="facebookWebArgResolver" class ="org.springframework.social.facebook.FacebookWebArgumentResolver" >

< constructor-arg name ="apiKey" value ="${facebook.appId}" />

</ bean >



* This source code was highlighted with Source Code Highlighter .






コールバック処理はTiwtterとLinkedinに似ています-キーを保存し(この場合facebookUserIdとfacebookToken)、さらに使用します。



TwitterとFacebookでステータスを共有する



接続済み、接続済み、ステータスを更新できるようになりました。 ステータスページには、ユーザーがテキストを入力してメッセージを送信するtextAreaがあります。 フォームハンドラは次のようになります。

@RequestMapping(value = "/status" , method = RequestMethod.POST)

public String sendStatus(@Valid StatusForm statusForm, BindingResult result, ModelMap modelMap) {

User user = getCurrentUser();



LinkedInTemplateExt linkedInTemplate = linkedInProvider.createTemplate(user);

FacebookTemplate facebookTemplate = facebookProvider.createTemplate(user);

TwitterTemplate twitterTemplate = twitterProvider.createTemplate(user);



// send message to LinkedIn

if (linkedInTemplate != null ) {

linkedInTemplate.updateStatus(statusForm.getStatus());

}



// send message to Facebook

if (facebookTemplate != null ) {

facebookTemplate.updateStatus(statusForm.getStatus());

}



// send message to Twitter

if (twitterTemplate != null ) {

twitterTemplate.updateStatus(statusForm.getStatus());

}

return "redirect:/status" ;

}



* This source code was highlighted with Source Code Highlighter .






このハンドラーでは、現在のユーザーのキーを使用してFacebookTemplateTwitterTemplate (spring-socialの両方のクラス)を取得し、 updateStatusメソッドを呼び出します



LinkedInステータスの送信



LinkedInはもう少し複雑であることが判明しました-spring -socialに実装されているLinkedInTemplateにはステータスを更新するメソッドが含まれていないため、自分で作成する必要があります(REST-APIコールapi.linkedin.com/v1/people/~/personを使用します) -アクティビティ )。 これを行うには、 LinkedInTemplateExtクラスを作成します。これは、「元の」LinkedInTemplateの後継クラスです。

* RestOperationsクラスの独自のオブジェクトを初期化します-これは、「正しい」コールエンコーディング(別のスプリングソーシャル機能)に特別なOAuth1RequestSignerFactory.getRequestSignerを使用します。

* updateStatusメソッド自体を実装します。

public void updateStatus(String message) {

LinkedInPersonActivity personActivity = new LinkedInPersonActivity(message);



restOperationsExt.postForLocation( "http://api.linkedin.com/v1/people/~/person-activities" , personActivity);

}



* This source code was highlighted with Source Code Highlighter .








また、 LinkedInPersonActivityクラスを記述する必要があります-ステータスを渡すには:

@XmlRootElement(name = "activity" )

public class LinkedInPersonActivity {

public LinkedInPersonActivity() {

}

public LinkedInPersonActivity(String body) {

this .body = body;

}



@XmlElement(name = "content-type" )

String contentType = "linkedin-html" ;



@XmlElement(name = "body" )

String body;

}



* This source code was highlighted with Source Code Highlighter .








それだけです-メソッドは準備ができています-ご覧のとおり-LinkedInTemplateは最初はAPIからの関数をほとんどサポートしていませんが、新しい関数の追加はそれほど難しいタスクではありません。



以上で、この例が役立つことを願っています。



All Articles