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