狠狠撸

狠狠撸Share a Scribd company logo
Copyright?2016 NTT corp. All Rights Reserved.
Spring Socialの基礎
2016年3月9日
NTT ソフトウェアイノベーションセンタ
岩塚 卓弥
2Copyright?2016 NTT corp. All Rights Reserved.
? 名前:岩塚 卓弥
? 所属:NTT ソフトウェアイノベーションセンタ
? 専門:ソフトウェア工学 / プログラミング言語理論
グループ向けフレームワーク整備の担当でSpringを利用
自己紹介
3Copyright?2016 NTT corp. All Rights Reserved.
Spring Social
Main Project
Spring Social Core
Spring Social Facebook
Spring Social Twitter
Spring Social LinkedIn
Incubator Project
Spring Social GitHub
Spring Social TripIt
コア以外は各API用のサブプロジェクト
4Copyright?2016 NTT corp. All Rights Reserved.
多数のCommunity Project
5Copyright?2016 NTT corp. All Rights Reserved.
何はともあれ、まずはサンプルを動かしてみる
https://github.com/spring-projects/spring-social-samples
さあ、はじめよう!
6Copyright?2016 NTT corp. All Rights Reserved.
何はともあれ、まずはサンプルを動かしてみる
https://github.com/spring-projects/spring-social-samples
さあ、はじめよう!
!?
7Copyright?2016 NTT corp. All Rights Reserved.
何はともあれ、まずはサンプルを動かしてみる
https://github.com/spring-projects/spring-social-samples
さあ、はじめよう!
_人人人人人人人人_
> BUILD FAILED <
 ̄Y^Y^Y^Y^Y^Y^Y ̄
8Copyright?2016 NTT corp. All Rights Reserved.
? 解説付きの別のサンプルがある
https://spring.io/guides/gs/accessing-facebook
https://spring.io/guides/gs/accessing-twitter
? 次スライドからFacebookのサンプルの中身を見ていく
? まずは動かしてみる
? こっちは正しく動くのでご安心を
Spring Social + Bootのサンプル
9Copyright?2016 NTT corp. All Rights Reserved.
プロジェクト構成の確認
Javaファイルは2つだけ
10Copyright?2016 NTT corp. All Rights Reserved.
pom.xml
Spring Social Facebookを使用
テンプレートにThymeleafを使用
11Copyright?2016 NTT corp. All Rights Reserved.
application.property
OAuth Server(ここではFacebook)が
OAuth Clientを識別?認証するために発行する情報
ダミー値なので差し替える必要がある
アプリケーション登録の方法は割愛
!
12Copyright?2016 NTT corp. All Rights Reserved.
Application.java
お馴染みの定義
13Copyright?2016 NTT corp. All Rights Reserved.
HomeController.java (1/2)
Facebook? ConnectionRepository?
“/”へのリクエストマッピング
14Copyright?2016 NTT corp. All Rights Reserved.
HomeController.java (2/2)
このあたりでAPIを叩いているのは見れば分かる
他のAPIの使用方法も大体想像できる
リクエストマッピングは?
15Copyright?2016 NTT corp. All Rights Reserved.
facebookConnect.html
“/connect/facebook”へPOST
リクエストマッピングは?
16Copyright?2016 NTT corp. All Rights Reserved.
? 使うのはとても簡単そう
? Dependencyの追加
? AppID / AppSecretを設定
? ControllerとViewを実装
でもちょっとマジカル(に見える)
?Facebook, ConnectionRepositoryオブジェクト
?”/connect/facebook”へのリクエストマッピング
→ 以降、裏で何が起こっているのかを見ていく
サンプルを通して
17Copyright?2016 NTT corp. All Rights Reserved.
Spring Socialの接続処理の大まかな流れ
ConnectionController
ConnectionFactory<A>
Connection<A>
ConnectionRepository
OAuth Server
接続用のリクエストマッピングを定義
接続処理を移譲
OAuth Danth
永続化
18Copyright?2016 NTT corp. All Rights Reserved.
接続処理の大まかな流れ
ConnectionController
ConnectionFactory<A>
Connection<A>
ConnectionRepository
OAuth Server
接続用のリクエストマッピングを定義
接続用処理を移譲
OAuth Danth
永続化
Auto Configurationで
暗黙的に生成
19Copyright?2016 NTT corp. All Rights Reserved.
Spring MVCのController
接続の作成?更新?切断のためのリクエストマッピングを定義
接続処理を適切なConnectionFactoryに移譲
ConnectionController
GET /connect
GET /connect/{providerId}
POST /connect/{providerId}
GET /connect/{providerId}?code={code}
DELETE /connect/{providerId}
DELETE /connect/{providerId}/{providerUserId}
GET /connect/{providerId}?oauth_token={request_token}
&oauth_verifier={verifier}
OAuth2用
OAuth1用
20Copyright?2016 NTT corp. All Rights Reserved.
? OAuth Serverとの接続処理を担うクラス
? Service Providerごとに継承したクラスが存在
? AppID/AppSecretはConnectionFactoryに設定
ConnectionFactory
ConnectionFactory<A>
OAuth2ConnectionFactory<A> OAuth1ConnectionFactory<A>
FacebookConnectionFactory TwitterConnectionFactory
21Copyright?2016 NTT corp. All Rights Reserved.
? ConnectionControllerとConnectionFactoryがア
クセストークン取得時のやり取りを隠蔽
OAuth Danceの隠蔽
Connection
Controller
Connection
Factory
OAuth Server
/connect/{providerId}へPOST
22Copyright?2016 NTT corp. All Rights Reserved.
? ConnectionControllerとConnectionFactoryがア
クセストークン取得時のやり取りを隠蔽
OAuth Danceの隠蔽
Connection
Controller
Connection
Factory
OAuth Server
appIDを取得
23Copyright?2016 NTT corp. All Rights Reserved.
? ConnectionControllerとConnectionFactoryがア
クセストークン取得時のやり取りを隠蔽
OAuth Danceの隠蔽
Connection
Controller
Connection
Factory
OAuth Server
appIDとリダイレクトURLを渡す
アクセスしたいリソースもパラメータで指定する
リダイレクトURLはデフォルトで/connect/{providerId}
24Copyright?2016 NTT corp. All Rights Reserved.
? ConnectionControllerとConnectionFactoryがア
クセストークン取得時のやり取りを隠蔽
OAuth Danceの隠蔽
Connection
Controller
Connection
Factory
OAuth Server
アクセス許可を与える
25Copyright?2016 NTT corp. All Rights Reserved.
? ConnectionControllerとConnectionFactoryがア
クセストークン取得時のやり取りを隠蔽
OAuth Danceの隠蔽
Connection
Controller
Connection
Factory
OAuth Server
認可コードを付けてリダイレクト
26Copyright?2016 NTT corp. All Rights Reserved.
? ConnectionControllerとConnectionFactoryがア
クセストークン取得時のやり取りを隠蔽
OAuth Danceの隠蔽
Connection
Controller
Connection
Factory
OAuth Server
appSecretを渡してアクセストークンを取得
アクセスにはRestTemplateを使用
27Copyright?2016 NTT corp. All Rights Reserved.
? ConnectionControllerとConnectionFactoryがア
クセストークン取得時のやり取りを隠蔽
OAuth Danceの隠蔽
Connection
Controller
Connection
Factory
OAuth Server
Connectionを作成
28Copyright?2016 NTT corp. All Rights Reserved.
? ConnectionControllerとConnectionFactoryがア
クセストークン取得時のやり取りを隠蔽
OAuth Danceの隠蔽
Connection
Controller
Connection
Factory
OAuth Server
/connect/{providerId} へリダイレクトしてViewを表示
29Copyright?2016 NTT corp. All Rights Reserved.
? 実際にはConnectionControllerには
ConnectionFactoryではなく
ConnectionFactoryLocatorを設定する
? ConnectionFactoryLocatorを利用することで適切な
ConnectionFactoryに接続処理を移譲できる
補足
ConnectionFactoryLocator
FacebookConnectionFactory
TwitterConnectionFactory
.
.
.
複数のOAuth Serverに
対応するためには
複数のConnectionFactoryが
必要
30Copyright?2016 NTT corp. All Rights Reserved.
? 文字通りOAuth Serverとの「接続」を表すクラス
? 以下の基本的な情報やアクセストークンを保持
? OAuth Server名
? ユーザID
? ユーザ表示名
? プロフィールURL
? アイコン画像URL
? Connection#getApi で取得したオブジェクトを利用
してAPIを叩く
? Connection<Facebook>なら,Facebookオブジェクトが取
得できる
Connection
31Copyright?2016 NTT corp. All Rights Reserved.
API利用の例
Connection<Facebook> fbConnection = ...; //Connectionを取得
Facebook fb = fbConnection.getApi(); // APIを取得
List<String> friendIds =
fb.friendOperations().getFriendIds(); // APIを叩く
どんなAPIが利用できるかは当然Server次第
詳細はリファレンスを参照
32Copyright?2016 NTT corp. All Rights Reserved.
? 作成したConnectionを永続化
? Connectionに対するCRUD処理を持つ
? 接続時にConnectionControllerが保存してくれる
? ユーザに対して複数のConnectionを保持できる
? FacebookとTwitterそれぞれと連係する場合など
? JDBC版とインメモリ版の2種類が提供されている
? JdbcUsersConnectionRepository
? InMemoryUsersConnectionRepository
ConnectionRepository
スキーマ定義(SQL)も提供されている
Auto Configurationで作られるのはこっち
DBに保存したければ差し替えが必要
33Copyright?2016 NTT corp. All Rights Reserved.
ConnectionRepositoryからConnectionを取得
ConnectionRepository repository = ...;
Connection<Facebook> fbConnection =
repository.findPrimaryConnection(Facebook.class);
Facebook fb =
fbConnection != null ? fbConnection.getApi() : null
?ConnectionRepository自体はシングルユーザ前提
?マルチユーザの場合にはユーザとConnectionRepositoryの
対応付けが必要
?そのためにUsersConnectionRepositoryを使用
?詳細は割愛
!
34Copyright?2016 NTT corp. All Rights Reserved.
Spring SocialでOAuth Serverに接続するために必
要なもの
? AppID / AppSecret
? OAuth Clientの識別?認証情報
? ConnectionController
? リクエストマッピングの定義
? ConnectionFactory
? 接続処理の定義
? ConnectionRepository
? Connectionの永続化
ここまでのまとめ
Spring Bootでは
Auto Configurationで作成
URLを叩くだけで接続できる
35Copyright?2016 NTT corp. All Rights Reserved.
? OAuth Serverのアカウントを使ってサインイン
? 自サービスへのログインやアカウント作成のために
FacebookやTwitterのアカウント情報を使用する
? 二つの方法から選択する
? ProviderSignInControllerを使う方法
? ConnectionControllerと似たような使い方
? SpringSecurityを使わない場合に使用する
? SocialAuthenticationFilterを使う方法
? SpringSecurityの認証の仕組みに乗っかって使用する
Spring Socialのその他の機能
36Copyright?2016 NTT corp. All Rights Reserved.
? 今まで提供されていないOAuth Server用のモジュール
を作成することもできる
? OAuthの接続処理等はSpring Socialの仕組みを利用で
きる
? APIをバインディングしたクラスや
ConnectionFactory等,OAuth Serverに依存した部
分の実装が必要
新しいOAuth Serverのサポート
37Copyright?2016 NTT corp. All Rights Reserved.
例:Gitter APIへのバインディング
…
Roomクラスは要作成 各APIを叩く処理は要作成
RestTemplateを使用
38Copyright?2016 NTT corp. All Rights Reserved.
? Spring Socialを使うと
? OAuthを意識せずに各種SaaSのAPIを利用できる
? 自サービスのログイン/アカウント作成にSaaSのアカウント情
報を利用できる
? 新しいサービスのAPIへのサポートも可能
? BootのAuto Configurationによって
? ConnectionControllerやConnectionFactory等が自動的に作
成される
? 必要なのはappId/appSecretをプロパティ定義することだけ
まとめ
39Copyright?2016 NTT corp. All Rights Reserved.
? リファレンス
? http://docs.spring.io/spring-
social/docs/current/reference/htmlsingle/
参考資料

More Related Content

Spring social の基礎

  • 1. Copyright?2016 NTT corp. All Rights Reserved. Spring Socialの基礎 2016年3月9日 NTT ソフトウェアイノベーションセンタ 岩塚 卓弥
  • 2. 2Copyright?2016 NTT corp. All Rights Reserved. ? 名前:岩塚 卓弥 ? 所属:NTT ソフトウェアイノベーションセンタ ? 専門:ソフトウェア工学 / プログラミング言語理論 グループ向けフレームワーク整備の担当でSpringを利用 自己紹介
  • 3. 3Copyright?2016 NTT corp. All Rights Reserved. Spring Social Main Project Spring Social Core Spring Social Facebook Spring Social Twitter Spring Social LinkedIn Incubator Project Spring Social GitHub Spring Social TripIt コア以外は各API用のサブプロジェクト
  • 4. 4Copyright?2016 NTT corp. All Rights Reserved. 多数のCommunity Project
  • 5. 5Copyright?2016 NTT corp. All Rights Reserved. 何はともあれ、まずはサンプルを動かしてみる https://github.com/spring-projects/spring-social-samples さあ、はじめよう!
  • 6. 6Copyright?2016 NTT corp. All Rights Reserved. 何はともあれ、まずはサンプルを動かしてみる https://github.com/spring-projects/spring-social-samples さあ、はじめよう! !?
  • 7. 7Copyright?2016 NTT corp. All Rights Reserved. 何はともあれ、まずはサンプルを動かしてみる https://github.com/spring-projects/spring-social-samples さあ、はじめよう! _人人人人人人人人_ > BUILD FAILED <  ̄Y^Y^Y^Y^Y^Y^Y ̄
  • 8. 8Copyright?2016 NTT corp. All Rights Reserved. ? 解説付きの別のサンプルがある https://spring.io/guides/gs/accessing-facebook https://spring.io/guides/gs/accessing-twitter ? 次スライドからFacebookのサンプルの中身を見ていく ? まずは動かしてみる ? こっちは正しく動くのでご安心を Spring Social + Bootのサンプル
  • 9. 9Copyright?2016 NTT corp. All Rights Reserved. プロジェクト構成の確認 Javaファイルは2つだけ
  • 10. 10Copyright?2016 NTT corp. All Rights Reserved. pom.xml Spring Social Facebookを使用 テンプレートにThymeleafを使用
  • 11. 11Copyright?2016 NTT corp. All Rights Reserved. application.property OAuth Server(ここではFacebook)が OAuth Clientを識別?認証するために発行する情報 ダミー値なので差し替える必要がある アプリケーション登録の方法は割愛 !
  • 12. 12Copyright?2016 NTT corp. All Rights Reserved. Application.java お馴染みの定義
  • 13. 13Copyright?2016 NTT corp. All Rights Reserved. HomeController.java (1/2) Facebook? ConnectionRepository? “/”へのリクエストマッピング
  • 14. 14Copyright?2016 NTT corp. All Rights Reserved. HomeController.java (2/2) このあたりでAPIを叩いているのは見れば分かる 他のAPIの使用方法も大体想像できる リクエストマッピングは?
  • 15. 15Copyright?2016 NTT corp. All Rights Reserved. facebookConnect.html “/connect/facebook”へPOST リクエストマッピングは?
  • 16. 16Copyright?2016 NTT corp. All Rights Reserved. ? 使うのはとても簡単そう ? Dependencyの追加 ? AppID / AppSecretを設定 ? ControllerとViewを実装 でもちょっとマジカル(に見える) ?Facebook, ConnectionRepositoryオブジェクト ?”/connect/facebook”へのリクエストマッピング → 以降、裏で何が起こっているのかを見ていく サンプルを通して
  • 17. 17Copyright?2016 NTT corp. All Rights Reserved. Spring Socialの接続処理の大まかな流れ ConnectionController ConnectionFactory<A> Connection<A> ConnectionRepository OAuth Server 接続用のリクエストマッピングを定義 接続処理を移譲 OAuth Danth 永続化
  • 18. 18Copyright?2016 NTT corp. All Rights Reserved. 接続処理の大まかな流れ ConnectionController ConnectionFactory<A> Connection<A> ConnectionRepository OAuth Server 接続用のリクエストマッピングを定義 接続用処理を移譲 OAuth Danth 永続化 Auto Configurationで 暗黙的に生成
  • 19. 19Copyright?2016 NTT corp. All Rights Reserved. Spring MVCのController 接続の作成?更新?切断のためのリクエストマッピングを定義 接続処理を適切なConnectionFactoryに移譲 ConnectionController GET /connect GET /connect/{providerId} POST /connect/{providerId} GET /connect/{providerId}?code={code} DELETE /connect/{providerId} DELETE /connect/{providerId}/{providerUserId} GET /connect/{providerId}?oauth_token={request_token} &oauth_verifier={verifier} OAuth2用 OAuth1用
  • 20. 20Copyright?2016 NTT corp. All Rights Reserved. ? OAuth Serverとの接続処理を担うクラス ? Service Providerごとに継承したクラスが存在 ? AppID/AppSecretはConnectionFactoryに設定 ConnectionFactory ConnectionFactory<A> OAuth2ConnectionFactory<A> OAuth1ConnectionFactory<A> FacebookConnectionFactory TwitterConnectionFactory
  • 21. 21Copyright?2016 NTT corp. All Rights Reserved. ? ConnectionControllerとConnectionFactoryがア クセストークン取得時のやり取りを隠蔽 OAuth Danceの隠蔽 Connection Controller Connection Factory OAuth Server /connect/{providerId}へPOST
  • 22. 22Copyright?2016 NTT corp. All Rights Reserved. ? ConnectionControllerとConnectionFactoryがア クセストークン取得時のやり取りを隠蔽 OAuth Danceの隠蔽 Connection Controller Connection Factory OAuth Server appIDを取得
  • 23. 23Copyright?2016 NTT corp. All Rights Reserved. ? ConnectionControllerとConnectionFactoryがア クセストークン取得時のやり取りを隠蔽 OAuth Danceの隠蔽 Connection Controller Connection Factory OAuth Server appIDとリダイレクトURLを渡す アクセスしたいリソースもパラメータで指定する リダイレクトURLはデフォルトで/connect/{providerId}
  • 24. 24Copyright?2016 NTT corp. All Rights Reserved. ? ConnectionControllerとConnectionFactoryがア クセストークン取得時のやり取りを隠蔽 OAuth Danceの隠蔽 Connection Controller Connection Factory OAuth Server アクセス許可を与える
  • 25. 25Copyright?2016 NTT corp. All Rights Reserved. ? ConnectionControllerとConnectionFactoryがア クセストークン取得時のやり取りを隠蔽 OAuth Danceの隠蔽 Connection Controller Connection Factory OAuth Server 認可コードを付けてリダイレクト
  • 26. 26Copyright?2016 NTT corp. All Rights Reserved. ? ConnectionControllerとConnectionFactoryがア クセストークン取得時のやり取りを隠蔽 OAuth Danceの隠蔽 Connection Controller Connection Factory OAuth Server appSecretを渡してアクセストークンを取得 アクセスにはRestTemplateを使用
  • 27. 27Copyright?2016 NTT corp. All Rights Reserved. ? ConnectionControllerとConnectionFactoryがア クセストークン取得時のやり取りを隠蔽 OAuth Danceの隠蔽 Connection Controller Connection Factory OAuth Server Connectionを作成
  • 28. 28Copyright?2016 NTT corp. All Rights Reserved. ? ConnectionControllerとConnectionFactoryがア クセストークン取得時のやり取りを隠蔽 OAuth Danceの隠蔽 Connection Controller Connection Factory OAuth Server /connect/{providerId} へリダイレクトしてViewを表示
  • 29. 29Copyright?2016 NTT corp. All Rights Reserved. ? 実際にはConnectionControllerには ConnectionFactoryではなく ConnectionFactoryLocatorを設定する ? ConnectionFactoryLocatorを利用することで適切な ConnectionFactoryに接続処理を移譲できる 補足 ConnectionFactoryLocator FacebookConnectionFactory TwitterConnectionFactory . . . 複数のOAuth Serverに 対応するためには 複数のConnectionFactoryが 必要
  • 30. 30Copyright?2016 NTT corp. All Rights Reserved. ? 文字通りOAuth Serverとの「接続」を表すクラス ? 以下の基本的な情報やアクセストークンを保持 ? OAuth Server名 ? ユーザID ? ユーザ表示名 ? プロフィールURL ? アイコン画像URL ? Connection#getApi で取得したオブジェクトを利用 してAPIを叩く ? Connection<Facebook>なら,Facebookオブジェクトが取 得できる Connection
  • 31. 31Copyright?2016 NTT corp. All Rights Reserved. API利用の例 Connection<Facebook> fbConnection = ...; //Connectionを取得 Facebook fb = fbConnection.getApi(); // APIを取得 List<String> friendIds = fb.friendOperations().getFriendIds(); // APIを叩く どんなAPIが利用できるかは当然Server次第 詳細はリファレンスを参照
  • 32. 32Copyright?2016 NTT corp. All Rights Reserved. ? 作成したConnectionを永続化 ? Connectionに対するCRUD処理を持つ ? 接続時にConnectionControllerが保存してくれる ? ユーザに対して複数のConnectionを保持できる ? FacebookとTwitterそれぞれと連係する場合など ? JDBC版とインメモリ版の2種類が提供されている ? JdbcUsersConnectionRepository ? InMemoryUsersConnectionRepository ConnectionRepository スキーマ定義(SQL)も提供されている Auto Configurationで作られるのはこっち DBに保存したければ差し替えが必要
  • 33. 33Copyright?2016 NTT corp. All Rights Reserved. ConnectionRepositoryからConnectionを取得 ConnectionRepository repository = ...; Connection<Facebook> fbConnection = repository.findPrimaryConnection(Facebook.class); Facebook fb = fbConnection != null ? fbConnection.getApi() : null ?ConnectionRepository自体はシングルユーザ前提 ?マルチユーザの場合にはユーザとConnectionRepositoryの 対応付けが必要 ?そのためにUsersConnectionRepositoryを使用 ?詳細は割愛 !
  • 34. 34Copyright?2016 NTT corp. All Rights Reserved. Spring SocialでOAuth Serverに接続するために必 要なもの ? AppID / AppSecret ? OAuth Clientの識別?認証情報 ? ConnectionController ? リクエストマッピングの定義 ? ConnectionFactory ? 接続処理の定義 ? ConnectionRepository ? Connectionの永続化 ここまでのまとめ Spring Bootでは Auto Configurationで作成 URLを叩くだけで接続できる
  • 35. 35Copyright?2016 NTT corp. All Rights Reserved. ? OAuth Serverのアカウントを使ってサインイン ? 自サービスへのログインやアカウント作成のために FacebookやTwitterのアカウント情報を使用する ? 二つの方法から選択する ? ProviderSignInControllerを使う方法 ? ConnectionControllerと似たような使い方 ? SpringSecurityを使わない場合に使用する ? SocialAuthenticationFilterを使う方法 ? SpringSecurityの認証の仕組みに乗っかって使用する Spring Socialのその他の機能
  • 36. 36Copyright?2016 NTT corp. All Rights Reserved. ? 今まで提供されていないOAuth Server用のモジュール を作成することもできる ? OAuthの接続処理等はSpring Socialの仕組みを利用で きる ? APIをバインディングしたクラスや ConnectionFactory等,OAuth Serverに依存した部 分の実装が必要 新しいOAuth Serverのサポート
  • 37. 37Copyright?2016 NTT corp. All Rights Reserved. 例:Gitter APIへのバインディング … Roomクラスは要作成 各APIを叩く処理は要作成 RestTemplateを使用
  • 38. 38Copyright?2016 NTT corp. All Rights Reserved. ? Spring Socialを使うと ? OAuthを意識せずに各種SaaSのAPIを利用できる ? 自サービスのログイン/アカウント作成にSaaSのアカウント情 報を利用できる ? 新しいサービスのAPIへのサポートも可能 ? BootのAuto Configurationによって ? ConnectionControllerやConnectionFactory等が自動的に作 成される ? 必要なのはappId/appSecretをプロパティ定義することだけ まとめ
  • 39. 39Copyright?2016 NTT corp. All Rights Reserved. ? リファレンス ? http://docs.spring.io/spring- social/docs/current/reference/htmlsingle/ 参考資料