spring social の基礎

39
Copyright©2016 NTT corp. All Rights Reserved. Spring Socialの基礎 2016年3月9日 NTT ソフトウェアイノベーションセンタ 岩塚 卓弥

Upload: takuya-iwatsuka

Post on 22-Jan-2017

1.301 views

Category:

Engineering


0 download

TRANSCRIPT

Copyright©2016 NTT corp. All Rights Reserved.

Spring Socialの基礎

2016年3月9日 NTT ソフトウェアイノベーションセンタ 岩塚 卓弥

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用のサブプロジェクト

4 Copyright©2016 NTT corp. All Rights Reserved.

多数のCommunity Project

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のサンプル

9 Copyright©2016 NTT corp. All Rights Reserved.

プロジェクト構成の確認

Javaファイルは2つだけ

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を識別・認証するために発行する情報

ダミー値なので差し替える必要がある

アプリケーション登録の方法は割愛

!

12 Copyright©2016 NTT corp. All Rights Reserved.

Application.java

お馴染みの定義

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をプロパティ定義することだけ

まとめ

39 Copyright©2016 NTT corp. All Rights Reserved.

• リファレンス

• http://docs.spring.io/spring-social/docs/current/reference/htmlsingle/

参考資料