ソーシャルネットワークは今日、人々の生活に欠かせない部分となっています。 Facebook、LinkedIn、Twitter、Sina Weiboなどの人気ソーシャルネットワーキングサイトは非常に高い人気を集めており、毎日多くの人が訪れるサイトとなっています。ソーシャルネットワークでは大量の情報が共有されています。アプリケーションにはソーシャル ネットワークのサポートを提供する必要があります。アプリはソーシャル ネットワークと統合することで急速に人気を博します。ソーシャル ネットワークとの統合には主に 2 つの機能があります。1 つ目は比較的単純なユーザー ログイン統合で、これによりユーザーはソーシャル ネットワーク Web サイト上の既存のアカウントを使用してアプリケーションにログインできるようになります。この利点は、ユーザーが再登録するプロセスを節約できることと、ユーザーの既存のソーシャル ネットワークとの接続を確立できることです。2 つ目は、ユーザーがアプリケーション内で関連するコンテンツを共有できる緊密な統合方法です。ソーシャルネットワークミドルへ。この利点は、アプリケーション自体を宣伝しながら、ユーザーの粘着性を維持できることです。
ソーシャル ネットワークをアプリケーションに統合するのは複雑な作業ではありません。多くのソーシャル ネットワーキング サービスは、サードパーティ アプリケーションを統合できるオープン API を提供しています。関連するドキュメントを参照して完了してください。ただし、統合自体にはある程度の作業が必要です。統合する必要がある Web サイトの数が増えるほど、それに対応する作業負荷も増加します。 Spring Social は、Spring フレームワーク コンポーネント ファミリの一部として、ソーシャル ネットワーク サービスの抽象化を提供し、操作に関連する API を提供します。
Spring Social を使用する最大の利点は、主流のソーシャル ネットワーキング サイトのサポートがすでに提供されており、必要なのは簡単な構成のみであることです。あまり使用されていない一部のソーシャル ネットワーキング サイトについては、コミュニティから対応するコンポーネントを見つけることもできます。この記事では、サンプル アプリケーションを使用して Spring Social の使用法を説明します。
サンプル アプリケーション
このサンプルでは、ユーザーがソーシャル ネットワーキング サイトにログインして友達の情報を表示できるようにします。これは、Spring MVC フレームワークを使用して構築された Web アプリケーションです。アプリケーションは、組み込みの H2 データベースを使用してデータを保存します。フロントエンドはJSP、JSTL、Springが提供するタグライブラリを使用し、ページレイアウトにはApache Tilesを使用します。 Spring Securityを使用してユーザー認証を管理します。このページは Twitter Bootstrap ライブラリを使用してスタイル設定されています。プロジェクトは Gradle を使用して構築されます。フロントエンド ライブラリは Bower を通じて管理されます。
この例で提供される機能は比較的単純で、主にログイン ページと登録ページ、ユーザーのホームページが含まれます。ログイン時に、ユーザーはサードパーティのソーシャル ネットワークのアカウントを使用することを選択できます。ログインするとSNSの友達情報を確認できます。
既存のソーシャル ネットワーク アカウントを使用してログインします
ソーシャル ネットワークと統合された最も基本的な機能は、ユーザーが既存のアカウントを使用してログインできるようにすることです。ユーザーは、新しいアカウントを登録するだけでなく、他の Web サイトの既存のアカウントを使用してログインすることもできます。この方法は、サードパーティの Web サイトへの接続と呼ばれることがよくあります。ユーザーにとっての通常のシナリオは、登録ページまたはログイン ページで接続するサードパーティのソーシャル ネットワークを選択することです。次に、ログインと認証のためにサードパーティの Web サイトに移動します。上記の手順を完了すると、新しいユーザーが作成されます。接続プロセス中に、アプリケーションはサードパーティのソーシャル ネットワーキング サイトからユーザーのプロファイル情報を取得して、新しいユーザーの作成を完了できます。新しいユーザーが作成されると、ユーザーは次回からサードパーティのソーシャル ネットワークのアカウントを使用して直接ログインできるようになります。
基本構成
Spring Social は、サードパーティ Web サイトのユーザーのログインと登録を処理する Spring MVC コントローラー (Controller) の実装を提供し、ソーシャル ネットワーク アカウントを使用したログインと登録の機能を自動的に完了できます。これらのコントローラーを使用する前に、いくつかの基本的な構成が必要です。 Spring Social の設定は、 org.springframework.social.config.annotation.SocialConfigurer インターフェースを実装することで完了します。 SocialConfigurer インターフェイスを実装する SocialConfig クラスの一部が提供されます。アノテーション「@EnableSocial」は、Spring Social関連の機能を有効にするために使用されます。注釈「@Configuration」は、このクラスに Spring フレームワークに関連する構成情報も含まれていることを示します。 SocialConfigurer インターフェイスには、実装する必要がある 3 つのメソッドがあります:
addConnectionFactories: このコールバック メソッドは、サポートする必要があるソーシャル ネットワークに対応する接続ファクトリーの実装をアプリケーションが追加できるようにするために使用されます。
getUserIdSource: このコールバック メソッドは、現在のユーザーを一意に識別するために使用される org.springframework.social.UserIdSource インターフェースの実装オブジェクトを返します。
getUsersConnectionRepository: このコールバック メソッドは、ユーザーとソーシャル ネットワーク サービス プロバイダー間の通信を管理するために使用される org.springframework.social.connect.UsersConnectionRepository インターフェイスの実装オブジェクトを返します。
特にサンプル アプリケーションの場合、org.springframework.social.linkedin.connect.LinkedInConnectionFactory クラスで表される LinkedIn 接続ファクトリの実装が addConnectionFactories メソッドの実装に追加されます。 getUserIdSource メソッドの実装では、現在ログインしているユーザーの情報を取得するために Spring Security が使用されます。 getUsersConnectionRepository メソッドは、データベースベースの JdbcUsersConnectionRepository クラスの実装オブジェクトを作成します。 LinkedInConnectionFactory クラスは、Spring Social の機能を反映する方法で作成されます。 LinkedIn が提供する機能を直接使用するには、LinkedIn で適用される API キーを提供するだけで済みます。 OAuth に関連する詳細は Spring Social によってカプセル化されます。
1. Spring Social の基本構成の使用
@Configuration@EnableSocialpublic class SocialConfig implements SocialConfigurer { @Inject private DataSource dataSource; @Override public void addConnectionFactories(ConnectionFactoryConfigurer cfConfig, Environment env) { cfConfig.addConnectionFactory(new LinkedInConnectionFactory(env.getProperty("linkedin.consumerKey"), env.getProperty("linkedin.consumerSecret"))); } @Override public UserIdSource getUserIdSource() { return new UserIdSource() { @Override public String getUserId() { Authentication authentication = SecurityContextHolder.getContext().getAuthentication(); if (authentication == null) { throw new IllegalStateException("Unable to get a ConnectionRepository: no user signed in"); } return authentication.getName(); } }; } @Override public UsersConnectionRepository getUsersConnectionRepository(ConnectionFactoryLocator connectionFactoryLocator) { return new JdbcUsersConnectionRepository(dataSource, connectionFactoryLocator, Encryptors.noOpText()); } }
ログイン コントローラー
Spring Social を構成した後の次のステップは、ユーザーの登録とログインを処理するための対応する Spring MVC コントローラーを作成することです。 Spring Social は対応するコントローラー実装をすでに提供しているため、リクエストを行うためのインターフェイスを作成するだけで済みます。最初に作成するのは、サードパーティのソーシャル ネットワーク経由でログインするためのコントローラーです。示されているように、Spring Bean を作成するだけで、必要なコントローラーを作成できます。このコントローラーは、デフォルトで「/signin」URL にバインドされます。各サードパーティ サービス プロバイダーは、LinkedIn の識別子「linkedin」など、対応する識別子を持っています。サービス プロバイダーの識別子は、さまざまなコントローラーの URL の一部として含まれることがよくあります。たとえば、ユーザーが LinkedIn アカウントを通じてログインする必要がある場合、対応する URL は「/signin/linkedin」です。 Twitterアカウントでログインする場合、対応するURLは「/signin/twitter」となります。
2. サードパーティのソーシャル ネットワーク経由でログインするためのコントローラー
@Beanpublic ProviderSignInController providerSignInController(ConnectionFactoryLocator connectionFactoryLocator, UsersConnectionRepository usersConnectionRepository) { return new ProviderSignInController(connectionFactoryLocator, usersConnectionRepository, new SimpleSignInAdapter(new HttpSessionRequestCache())); }
上記では、SimpleSignInAdapter クラスは、ProviderSignInController クラスのログイン ロジックとして機能する org.springframework.social.connect.web.SignInAdapter インターフェイスを実装します。アプリケーション自体が間の橋渡しをします。ユーザーがサードパーティ Web サイトへのログインを完了すると、ユーザーは SignInAdapter インターフェイスを通じてアプリケーションに自動的にログインします。 SimpleSignInAdapter クラスの実装を以下に示します。
3. SimpleSignInAdapter クラスの実装
public class SimpleSignInAdapter implements SignInAdapter { private final RequestCache requestCache; @Inject public SimpleSignInAdapter(RequestCache requestCache) { this.requestCache = requestCache; } @Override public String signIn(String localUserId, Connection<?> connection, NativeWebRequest request) { SignInUtils.signin(localUserId); return extractOriginalUrl(request); } private String extractOriginalUrl(NativeWebRequest request) { HttpServletRequest nativeReq = request.getNativeRequest(HttpServletRequest.class); HttpServletResponse nativeRes = request.getNativeResponse(HttpServletResponse.class); SavedRequest saved = requestCache.getRequest(nativeReq, nativeRes); if (saved == null) { return null; } requestCache.removeRequest(nativeReq, nativeRes); removeAutheticationAttributes(nativeReq.getSession(false)); return saved.getRedirectUrl(); } private void removeAutheticationAttributes(HttpSession session) { if (session == null) { return; } session.removeAttribute(WebAttributes.AUTHENTICATION_EXCEPTION); } }
コード リスト 3 では、SimpleSignInAdapter クラスの SignIn メソッドが SignInUtils クラスの Signin メソッドを呼び出してログインします。その実装については、コード リスト 4 を参照してください。 SignIn メソッドの戻り値は、ログイン成功後のジャンプ URL です。
4. SignInUtils クラスのsignIn メソッドの実装
public class SignInUtils { public static void signin(String userId) { SecurityContextHolder.getContext().setAuthentication(new UsernamePasswordAuthenticationToken(userId, null, null)); } }
フロントエンド ページ
LinkedIn 経由でログイン プロセスを開始するには、このページを通じてログイン コントローラーの URL に POST リクエストを発行するだけです。図に示すように、フォームを送信することでログイン プロセスを開始できます。ユーザーはまず、アプリケーションを認証するために LinkedIn Web サイトの認証ページに移動します。認証が完了すると、ユーザーは登録できます。
5. ログインページ
<form id="linkedin-signin-form" action="signin/linkedin" method="POST" class="form-signin" role="form"> <h2 class="form-signin-heading">Or Connect by</h2> <input type="hidden" name="${_csrf.parameterName}" value="${_csrf.token}"/> <button type="submit" class="btn btn-primary">LinkedIn</button> </form>
デフォルトでは、サードパーティ Web サイトの認証が完了すると、ユーザーは URL「/signup」に対応するページにリダイレクトされます。このページでは、ユーザーは関連する登録情報を追加できます。同時に、ユーザーの名前など、サードパーティの Web サイトから取得したユーザー プロファイル情報を事前に入力することができます。フォームが送信された後のこのページのアクションは、表示されているコントローラーによって処理されます。
6. ユーザー登録コントローラーの実装
@RequestMapping(value="/signup", method=RequestMethod.POST) public String signup(@Valid @ModelAttribute("signup") SignupForm form, BindingResult formBinding, WebRequest request) { if (formBinding.hasErrors()) { return null; } Account account = createAccount(form, formBinding); if (account != null) { SignInUtils.signin(account.getUsername()); ProviderSignInUtils.handlePostSignUp(account.getUsername(), request); return "redirect:/"; } return null; }
ユーザーが登録フォームを送信した後、ユーザーが入力した情報に基づいて対応するアカウントを作成し、新しく登録されたアカウントにログインしてホームページに戻ります。
APIを使用する
Spring Social 的另外一个重要的作用在于提供了很多社交网络服务的 API 的封装。当用户通过社交网络的账号登录之后,可以通过相应的 API 获取到相关的信息,或执行一些操作。比如获取到用户的好友信息,或是根据用户的要求发布新的消息。一般来说,很多社交网络服务提供商都有自己的 API 来提供给开发人员使用。不过一般只提供 REST API,并没有 Java 封装。Spring Social 的一个目标是为主流的社交网络提供相应的 Java 封装的 API。对于社区已经有良好的 Java 库的社交网络,如 Twitter,Spring Social 会进行整合与封装;而对于暂时没有 Java 实现的,Spring Social 的组件会提供相应的支持。如示例应用中使用的 LinkedIn 的 Java API 是由 Spring Social 开发的。
在使用 LinkedIn 的 Java API 之前,首先要创建相应的 Spring Bean,如所示。
7. 创建 LinkedIn API 对应的 Bean
@Bean@Scope(value="request", proxyMode=ScopedProxyMode.INTERFACES)public LinkedIn linkedin(ConnectionRepository repository) { Connection<LinkedIn> connection = repository.findPrimaryConnection(LinkedIn.class); return connection != null ? connection.getApi() : null; }
LinkedIn Java API 的核心接口是 org.springframework.social.linkedin.api.LinkedIn。如果当前用户已经连接了 LinkedIn 的账号,就可以通过 ConnectionRepository 接口找到该用户对应的连接的信息,并创建出 API 接口的实现。是展示 LinkedIn 上好友信息的控制器的实现。
8. 展示 LinkedIn 上好友信息的控制器的实现
@Controllerpublic class LinkedInConnectionsController { private LinkedIn linkedIn; @Inject public LinkedInConnectionsController(LinkedIn linkedIn) { this.linkedIn = linkedIn; } @RequestMapping(value="/connections", method= RequestMethod.GET) public String connections(Model model) { model.addAttribute("connections", linkedIn.connectionOperations().getConnections()); return "connections"; } }
通过 LinkedIn 接口的 connectionOperations 方法可以获取到 org.springframework.social.linkedin.api.ConnectionOperations 接口的实现,然后就可以再通过 getConnections 方法获取到包含好友信息的 org.springframework.social.linkedin.api.LinkedInProfile 类的对象列表。然后就可以在网页上展示,如所示。
9. 展示 LinkedIn 好友信息的页面
<ul class="media-list"> <c:forEach items="${connections}" var="connection"> <li class="media"> <a href="" class="pull-left"> <img class="lazy-load" data-original="${connection.profilePictureUrl}" alt="" class="media-object"> </a> <div class="media-body"> <h4 class="media-heading">${connection.firstName} ${connection.lastName}</h4> <p><c:out value="${connection.headline}" /></p> </div> </li> </c:forEach> </ul>
结束语
在社交网络日益流行的今天,Web 应用都应该考虑增加对社交网络的支持。这样既方便了用户,让他们省去了重新注册的麻烦,又可以增加用户粘性,同时可以通过社交网络进行推广。虽然很多社交网站都提供了开放 API 来让应用使用其服务,但是集成所需的工作量是不小的。Spring Social 作为 Spring 框架中的一部分,为在 Web 应用中集成社交网络提供了良好支持。本文详细介绍了如何通过 Spring Social 来实现通过社交网络账号进行登录以及使用社交网络提供的 API。
以上がSpring Social を使用してソーシャル ネットワークに接続する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。