Copyright©2016 NTT corp. All Rights Reserved.
Microservices /w Spring Security
OAuth
NTT ソフトウェアイノベーションセンタ
角田誠
2016年3月9日
2Copyright©2016 NTT corp. All Rights Reserved.
• 認可フレームワークであるOAuthを,マイクロサービ
ス・アーキテクチャで構築されたアプリケーションを構
成する各サービスへのアクセス時に利用することを想定
して,OAuthの実装であるSpring Security OAuth
を用いて行ったいくつかの実験についての報告。
本日の内容
3Copyright©2016 NTT corp. All Rights Reserved.
• 「In short, the microservice architectural
style is an approach to developing a single
application as a suite of small services, each
running in its own process and
communicating with lightweight mechanisms,
often an HTTP resource API.」
• James Lewis, Martin Fowler,
• “Microservices a definition of this new architectual
term”,
• http://martinfowler.com/articles/microservices.html
おさらい(Microservices)
4Copyright©2016 NTT corp. All Rights Reserved.
• 単一のアプリケーションを小さなサービス群の組み合わ
せとして構築する手法。
• 個々のサービスは自身のプロセス上で動作する。
おさらい(Microservices)
5Copyright©2016 NTT corp. All Rights Reserved.
• スケールさせるときは,アプリケーション全体ではな
く,個々のサービスごとに多重化できるので効率が良
い。
おさらい(Microservices)
6Copyright©2016 NTT corp. All Rights Reserved.
• サードパーティ製のアプリケーション(≒クライアント)
から,Webサービスを提供するサーバ(≒リソース,
サービス)への,限定的なアクセスを可能にする認可フ
レームワーク。
• RFC6749(OAuth2)
おさらい(OAuth)
7Copyright©2016 NTT corp. All Rights Reserved.
• OAuth以前 - クライアントサーバ型の認証モデル
• エンドユーザは,Webサービスにアクセスするための認証情報
をサードパーティ製のアプリケーションに伝える。
おさらい(OAuth)
サードパーティ製の
アプリケーション
(クライアント)
Webサービス
エンドユーザの権限の
範囲内での
無制限のアクセス
8Copyright©2016 NTT corp. All Rights Reserved.
• OAuthの認証・認可モデル
• エンドユーザは,Webサービスにアクセスするための認証情報
をサードパーティ製のアプリケーションに伝える必要がない。
おさらい(OAuth)
Webサービス限定されたアクセス
アクセスの限定
サードパーティ製の
アプリケーション
(クライアント)
9Copyright©2016 NTT corp. All Rights Reserved.
• OAuthの四つのロール
おさらい(OAuth)
クライアント
認可サーバ
リソースサーバ
・リソースオーナの許可を得てリソースサー
バにアクセスする,ブラウザ上またはWeb
サーバ上で動作するアプリケーション。
リソースオーナ
・保護されたリソースを
ホストするサーバ。
・リソースオーナの認証と,リソース
オーナから認可を取得し,クライアント
にアクセストークンを発行するサーバ。
・クライアントにリソースサーバ
へのアクセスを許可する。
・エンドユーザ。
アクセストークン
10Copyright©2016 NTT corp. All Rights Reserved.
• 認可グラント
• リソースオーナによる認可を示す。
• 認可サーバは認可グラントに基づき,クライアントにアクセス
トークンを発行する。
• 四つのタイプがあり,それぞれでアクセストークン発行手順が
異なる。
おさらい(OAuth)
クライアントがリソースサーバに
アクセスするときに必要なトークン
11Copyright©2016 NTT corp. All Rights Reserved.
• 四つのグラントタイプ
• 認可コード
• インプリシット
• リソースオーナパスワードクレデンシャル
• クライアントクレデンシャル
おさらい(OAuth)
OAuthといって普通にイメージするのはこのあたり。
エンドユーザはクライアントに対し認可の範囲を限定
できる。
12Copyright©2016 NTT corp. All Rights Reserved.
• 認可コードグラント
• クライアントからリソースサーバへのアクセスを,エンドユー
ザが認可することで,アクセストークンを発行する。
おさらい(OAuth)
クライアント
認可サーバ
ユーザ
エージェント
(Webブラウザ)
(1)リソースサーバへのアクセス事象発生
(2)認可サーバへの
リダイレクト指示
(3)リダイレクト
(4)認可要求
(5)認可
要求
(7)認可
(8)認可コード + クライアントへのリダイレクト指示
(10)認可コードによりア
クセストークン要求
(9)リダイレクト
/w 認可コード (11)アクセストークン
(6)認可(エンドユーザはクライアントに対して認可の範囲を限定できる。)
リソースサーバ(12)リソースサーバへのアクセス
13Copyright©2016 NTT corp. All Rights Reserved.
• クライアントクレデンシャルグラント
• エンドユーザとは関係なく,クライアントを認証し,アクセス
トークンを発行する。
おさらい(OAuth)
クライアント 認可サーバ
(1)リソースサーバへの
アクセス事象発生
(2)クライアントの認証情報
(3)アクセストークン
リソースサーバ(4)リソースサーバへのアクセス
14Copyright©2016 NTT corp. All Rights Reserved.
• Spring Bootによるサービスの実現
• Eurekaによるサービスの登録・発見
SpringとMicroservices
15Copyright©2016 NTT corp. All Rights Reserved.
• Spring Security OAuth
• Spring Securityの関連プロジェクト
• 認可サーバ,リソースサーバ,クライアントの作成をサポート
• 今回は,Spring Security OAuthの細かな設定などの説明は割
愛。
SpringとOAuth
16Copyright©2016 NTT corp. All Rights Reserved.
• Spring BootやSpring Security OAuthを使った
Microservicesなアプリケーションで,サービス(リ
ソースサーバ)から他のサービスの呼び出しでも,エン
ドユーザが認可した範囲に限定したアクセスを行う。
実現したいこと(1)
クライアント
エンドユーザが認可した範囲での限定したアクセス
Microservicesでいうところのサービスを
OAuthのリソースサーバとして実現
17Copyright©2016 NTT corp. All Rights Reserved.
認可サーバ
認可サーバ
• Spring Security OAuthで作ったクライアントやリ
ソースサーバが,Eurekaサーバに登録された,多重化
されたリソースサーバや認可サーバのうちのどれかを選
んでアクセスする。
実現したいこと(2)
クライアント
18Copyright©2016 NTT corp. All Rights Reserved.
• クライアントからリソースサーバへのアクセス
• リソースサーバはクライアントに対して,REST APIを提供す
る。
• クライアントは,REST APIに普通にアクセスするときに使う
RestTemplateの代わりにOAuth2RestTemplateを使って,リ
ソースサーバにアクセスする。
Spring Security OAuth
@RestController
public class ClientController {
@Value("${config.oauth2.resourceURI}")
private String resourceUri;
@Autowired
private OAuth2RestTemplate restTemplate;
@RequestMapping("/")
public String home() {
return restTemplate.getForObject(resourceUri, String.class);
}
}
19Copyright©2016 NTT corp. All Rights Reserved.
• 認可コードグラントによるリソースサーバへのアクセス
の流れ
• クライアントからリソースサーバへのアクセスが必要になる。
Spring Security OAuth
クライアント
リソースサーバ
20Copyright©2016 NTT corp. All Rights Reserved.
• 認可コードグラントによるリソースサーバへのアクセス
の流れ
• クライアントからリソースサーバへのアクセスが必要になる。
• クライアントは,OAuth2RestTemplateを使いリソースサー
バにアクセスしようとする。
Spring Security OAuth
クライアント
リソースサーバOAuth2
RestTemplate
Controller
21Copyright©2016 NTT corp. All Rights Reserved.
• 認可コードグラントによるリソースサーバへのアクセス
の流れ
• クライアントからリソースサーバへのアクセスが必要になる。
• クライアントは,OAuth2RestTemplateを使いリソースサー
バにアクセスしようとする。
• UserRedirectRequiredExceptionが投げられる。
Spring Security OAuth
クライアント
リソースサーバOAuth2
RestTemplate
Controller UserRedirect
RequiredException
22Copyright©2016 NTT corp. All Rights Reserved.
• 認可コードグラントによるリソースサーバへのアクセス
の流れ
• OAuth2ClientContextFilterがキャッチしてブラウザのロケー
ションを認可サーバにリダイレクトさせる。
Spring Security OAuth
クライアント
リソースサーバOAuth2
RestTemplate
Controller
OAuth2
ClientContextFilter
UserRedirect
RequiredException
認可サーバ
23Copyright©2016 NTT corp. All Rights Reserved.
• 認可コードグラントによるリソースサーバへのアクセス
の流れ
• OAuth2ClientContextFilterがキャッチしてブラウザのロケー
ションを認可サーバにリダイレクトさせる。
• ユーザの認証・認可が行われる。
Spring Security OAuth
クライアント
リソースサーバOAuth2
RestTemplate
Controller
OAuth2
ClientContextFilter
認可サーバ認証・認可
24Copyright©2016 NTT corp. All Rights Reserved.
• 認可コードグラントによるリソースサーバへのアクセス
の流れ
• OAuth2ClientContextFilterがキャッチしてブラウザのロケー
ションを認可サーバにリダイレクトさせる。
• ユーザの認証・認可が行われる。
• 元のクライアントのURLにリダイレクトされ,再度コントロー
ラが呼ばれる。
Spring Security OAuth
クライアント
リソースサーバOAuth2
RestTemplate
Controller
OAuth2
ClientContextFilter
認可サーバ
認可コード
25Copyright©2016 NTT corp. All Rights Reserved.
• 認可コードグラントによるリソースサーバへのアクセス
の流れ
• 再度,OAuth2RestTemplateを使いリソースサーバにアクセ
スしようとする。
Spring Security OAuth
クライアント
リソースサーバOAuth2
RestTemplate
Controller
OAuth2
ClientContextFilter
認可サーバ
認可コード
26Copyright©2016 NTT corp. All Rights Reserved.
• 認可コードグラントによるリソースサーバへのアクセス
の流れ
• 再度,OAuth2RestTemplateを使いリソースサーバにアクセ
スしようとする。
• 認可サーバからアクセストークンを取得する。
Spring Security OAuth
クライアント
リソースサーバOAuth2
RestTemplate
Controller
OAuth2
ClientContextFilter
認可サーバ
認可コード
認可コード
アクセストークン
27Copyright©2016 NTT corp. All Rights Reserved.
• 認可コードグラントによるリソースサーバへのアクセス
の流れ
• 再度,OAuth2RestTemplateを使いリソースサーバにアクセ
スしようとする。
• 認可サーバからアクセストークンを取得する。
• リソースサーバにアクセスする。
Spring Security OAuth
クライアント
リソースサーバOAuth2
RestTemplate
Controller
OAuth2
ClientContextFilter
認可サーバ
認可コード
認可コード
アクセストークン
アクセストークン
28Copyright©2016 NTT corp. All Rights Reserved.
• Spring BootやSpring Security OAuthを使った
Microservicesなアプリケーションで,サービス(リ
ソースサーバ)から他のサービスの呼び出しでも,エン
ドユーザが認可した範囲に限定したアクセスを行う。
実現したいこと(1)
クライアント
エンドユーザが認可した範囲での限定したアクセス
Microservicesでいうところのサービスを
OAuthのリソースサーバとして実現
29Copyright©2016 NTT corp. All Rights Reserved.
• リソースサーバ(A)(サービス)から他のリソースサーバ
(B)へのアクセスにOAuthを使うには…。
リソースサーバ(A)から他のリソースサーバ(B)へのアクセス
クライアント
リソースサーバ
(B)
リソースサーバ
(A)
アクセストークン
アクセストークン
認可サーバ
30Copyright©2016 NTT corp. All Rights Reserved.
• リソースサーバ(A)(サービス)から他のリソースサーバ
(B)へのアクセスにOAuthを使うには…。
• 認可コードグラント?
• リソースサーバ(A)にアクセスしているのはクライアントや他のリ
ソースサーバであって,エンドユーザではない。
• エンドユーザに認可を求めることができない。
リソースサーバ(A)から他のリソースサーバ(B)へのアクセス
クライアント
リソースサーバ
(B)
リソースサーバ
(A)
アクセストークン
アクセストークン
認証・認可 認可サーバ
31Copyright©2016 NTT corp. All Rights Reserved.
• リソースサーバ(A)(サービス)から他のリソースサーバ
(B)へのアクセスにOAuthを使うには…。
• クライアントクレデンシャルグラントを使うのが普通(多分)。
• エンドユーザは介入しない。
• リソースサーバ(A)をクライアントとして認可サーバが認証でき
る。
• リソースサーバ(A)に与えられたスコープで,リソースサーバ(B)
にアクセスできる。
• つまり,エンドユーザの認可は反映されない。
リソースサーバ(A)から他のリソースサーバ(B)へのアクセス
認可サーバ
リソースサーバ(A)の認証情報
アクセストークン
リソースサーバ
(B)
リソースサーバ(B)へのアクセス
リソースサーバ
(A)
32Copyright©2016 NTT corp. All Rights Reserved.
• リソースサーバ(A)(サービス)から他のリソースサーバ
(B)へのアクセスにOAuthを使うには…。
• エンドユーザの認可を反映しつつ,リソースサーバ(A)からリ
ソースサーバ(B)にアクセスしたい。
リソースサーバ(A)から他のリソースサーバ(B)へのアクセス
33Copyright©2016 NTT corp. All Rights Reserved.
• リソースサーバ(A)(サービス)から他のリソースサーバ
(B)へのアクセスにOAuthを使うには…。
• クライアントは,リソースサーバ(A)にアクセスするとき,認
可コードグラントで,ユーザの認可が反映されたアクセストー
クンを受け取ることができる。
• リソースサーバ(A)はこのアクセストークンをクライアントか
ら受け取る。
リソースサーバ(A)から他のリソースサーバ(B)へのアクセス
クライアント
リソースサーバ
(B)
リソースサーバ
(A)
アクセストークン
アクセストークン
認可サーバ
34Copyright©2016 NTT corp. All Rights Reserved.
• リソースサーバ(A)(サービス)から他のリソースサーバ
(B)へのアクセスにOAuthを使うには…。
• リソースサーバ(A)がクライアントから受け取ったアクセス
トークンをそのままリソースサーバ(B)へのアクセスに使えば
…。
• JWT(JSON Web Token)なアクセストークンを使えば,改ざん防
止とリソースサーバ内での検証が可能。
リソースサーバ(A)から他のリソースサーバ(B)へのアクセス
クライアント
リソースサーバ
(B)
リソースサーバ
(A)
アクセストークン
アクセストークン
認可サーバ
アクセストークン
35Copyright©2016 NTT corp. All Rights Reserved.
• リソースサーバ(A)(サービス)から他のリソースサーバ
(B)へのアクセスにOAuthを使うには…。
• リソースサーバ(A)がクライアントから受け取ったアクセス
トークンをそのままリソースサーバ(B)へのアクセスに使えば
…。
リソースサーバから他のリソースサーバへのアクセス
@RequestMapping("/")
public String resource(OAuth2Authentication principal) {
// 認証情報に含まれるアクセストークンを取得し,
String tokenValue =
((OAuth2AuthenticationDetails)principal.getDetails()).getTokenValue();
// リソーサーバ(B)へのアクセスに使う
// OAuth2RestTemplateのOAuth2ClientContextに埋め込む
OAuth2ClientContext context =
((OAuth2RestTemplate)restTemplate).getOAuth2ClientContext();
context.setAccessToken(new DefaultOAuth2AccessToken(tokenValue));
return "resource server! -> " +
restTemplate.getForObject(resourceUri, String.class);
}
36Copyright©2016 NTT corp. All Rights Reserved.
• リソースサーバ(A)(サービス)から他のリソースサーバ
(B)へのアクセスにOAuthを使うには…。
• リソースサーバ(A)がクライアントから受け取ったアクセス
トークンをそのままリソースサーバ(B)へのアクセスに使えば
…。
• 期待通りにエンドユーザが認可した権限の範囲で,リソース
サーバ(A)からリソースサーバ(B)へのアクセスが可能になる。
リソースサーバから他のリソースサーバへのアクセス
37Copyright©2016 NTT corp. All Rights Reserved.
認可サーバ
認可サーバ
• Spring Security OAuthで作ったクライアントやリ
ソースサーバが,Eurekaサーバに登録された,多重化
されたリソースサーバや認可サーバのうちのどれかを選
んでアクセスする。
実現したいこと(2)
クライアント
38Copyright©2016 NTT corp. All Rights Reserved.
• クライアントから多重化されたリソースサーバにアクセ
スする。
EurekaとSpring Security OAuth
認可サーバ
認可サーバ
クライアント
39Copyright©2016 NTT corp. All Rights Reserved.
• クライアントから多重化されたリソースサーバにアクセ
スする。
• クライアントから多重化された認可サーバにアクセスす
る。
EurekaとSpring Security OAuth
認可サーバ
認可サーバ
クライアント
40Copyright©2016 NTT corp. All Rights Reserved.
• クライアントから多重化されたリソースサーバにアクセ
スする。
• クライアントから多重化された認可サーバにアクセスす
る。
• リソースサーバから多重化された認可サーバにアクセス
する。
EurekaとSpring Security OAuth
認可サーバ
認可サーバ
クライアント
41Copyright©2016 NTT corp. All Rights Reserved.
• クライアントから多重化されたリソースサーバにアクセ
スする。
EurekaとSpring Security OAuth
認可サーバ
認可サーバ
クライアント
42Copyright©2016 NTT corp. All Rights Reserved.
• クライアントから多重化されたリソースサーバにアクセ
スする。
• Eurekaに登録されたサービスに普通にアクセスするときとほぼ
一緒。
EurekaとSpring Security OAuth
@Autowired
private OAuth2RestOperations restTemplate;
@Autowired
private LoadBalancerClient loadBalancer;
@RequestMapping("/")
public String home() {
// resourceNameに該当するサービスを一つ選択しURIを構築する。
String uri = loadBalancer.choose(resourceName).getUri() + resourcePath;
return restTemplate.getForObject(uri, String.class);
}
43Copyright©2016 NTT corp. All Rights Reserved.
• クライアントから多重化された認可サーバにアクセスす
る。
EurekaとSpring Security OAuth
認可サーバ
認可サーバ
クライアント
44Copyright©2016 NTT corp. All Rights Reserved.
• クライアントから多重化された認可サーバにアクセスす
る。
EurekaとSpring Security OAuth
あらかじめ設定した内容に
基づいてSpring Security
OAuthが勝手に認可サーバ
にアクセスする。
45Copyright©2016 NTT corp. All Rights Reserved.
• クライアントから多重化された認可サーバにアクセスす
る。
EurekaとSpring Security OAuth
Spring Security OAuth
で提供されているクラス
を拡張する必要がある。
あらかじめ設定した内容に
基づいてSpring Security
OAuthが勝手に認可サーバ
にアクセスする。
46Copyright©2016 NTT corp. All Rights Reserved.
• リソースサーバから多重化された認可サーバにアクセス
する。
EurekaとSpring Security OAuth
認可サーバ
認可サーバ
クライアント
47Copyright©2016 NTT corp. All Rights Reserved.
• リソースサーバから多重化された認可サーバにアクセス
する。
• JWT使用時,リソースサーバから認可サーバにアクセスするの
は,起動時の一度のみ。
• アクセストークン検証用の鍵を認可サーバに取りに行く。
• org.springframework.boot.autoconfigure.security.oauth2.r
esource.ResourceServerTokenServicesConfigurationの中
• リソースサーバ起動時に,Eurekaで見つけた認可サーバに鍵を
取りに行くようにすればOK。
• そもそも,設定ファイル(e.g. application.yml)に鍵を書いて
おけば,認可サーバにアクセスする必要はない…。
EurekaとSpring Security OAuth
48Copyright©2016 NTT corp. All Rights Reserved.
• OAuthで,リソースサーバ(A)が他のリソースサーバ
(B)にアクセスするときに必要となるアクセストークン
は,リソースサーバ(A)がクライアントから受け取った
アクセストークンを流用できる。
• OAuthで,クライアントから多重化されたリソース
サーバへのアクセスは,多重化されたサービスに普通に
アクセスするときとほぼ一緒。
• クライアントやリソースサーバから多重化された認可
サーバへのアクセスは,少し頑張れば可能。
まとめ

Microservices /w Spring Security OAuth

  • 1.
    Copyright©2016 NTT corp.All Rights Reserved. Microservices /w Spring Security OAuth NTT ソフトウェアイノベーションセンタ 角田誠 2016年3月9日
  • 2.
    2Copyright©2016 NTT corp.All Rights Reserved. • 認可フレームワークであるOAuthを,マイクロサービ ス・アーキテクチャで構築されたアプリケーションを構 成する各サービスへのアクセス時に利用することを想定 して,OAuthの実装であるSpring Security OAuth を用いて行ったいくつかの実験についての報告。 本日の内容
  • 3.
    3Copyright©2016 NTT corp.All Rights Reserved. • 「In short, the microservice architectural style is an approach to developing a single application as a suite of small services, each running in its own process and communicating with lightweight mechanisms, often an HTTP resource API.」 • James Lewis, Martin Fowler, • “Microservices a definition of this new architectual term”, • http://martinfowler.com/articles/microservices.html おさらい(Microservices)
  • 4.
    4Copyright©2016 NTT corp.All Rights Reserved. • 単一のアプリケーションを小さなサービス群の組み合わ せとして構築する手法。 • 個々のサービスは自身のプロセス上で動作する。 おさらい(Microservices)
  • 5.
    5Copyright©2016 NTT corp.All Rights Reserved. • スケールさせるときは,アプリケーション全体ではな く,個々のサービスごとに多重化できるので効率が良 い。 おさらい(Microservices)
  • 6.
    6Copyright©2016 NTT corp.All Rights Reserved. • サードパーティ製のアプリケーション(≒クライアント) から,Webサービスを提供するサーバ(≒リソース, サービス)への,限定的なアクセスを可能にする認可フ レームワーク。 • RFC6749(OAuth2) おさらい(OAuth)
  • 7.
    7Copyright©2016 NTT corp.All Rights Reserved. • OAuth以前 - クライアントサーバ型の認証モデル • エンドユーザは,Webサービスにアクセスするための認証情報 をサードパーティ製のアプリケーションに伝える。 おさらい(OAuth) サードパーティ製の アプリケーション (クライアント) Webサービス エンドユーザの権限の 範囲内での 無制限のアクセス
  • 8.
    8Copyright©2016 NTT corp.All Rights Reserved. • OAuthの認証・認可モデル • エンドユーザは,Webサービスにアクセスするための認証情報 をサードパーティ製のアプリケーションに伝える必要がない。 おさらい(OAuth) Webサービス限定されたアクセス アクセスの限定 サードパーティ製の アプリケーション (クライアント)
  • 9.
    9Copyright©2016 NTT corp.All Rights Reserved. • OAuthの四つのロール おさらい(OAuth) クライアント 認可サーバ リソースサーバ ・リソースオーナの許可を得てリソースサー バにアクセスする,ブラウザ上またはWeb サーバ上で動作するアプリケーション。 リソースオーナ ・保護されたリソースを ホストするサーバ。 ・リソースオーナの認証と,リソース オーナから認可を取得し,クライアント にアクセストークンを発行するサーバ。 ・クライアントにリソースサーバ へのアクセスを許可する。 ・エンドユーザ。 アクセストークン
  • 10.
    10Copyright©2016 NTT corp.All Rights Reserved. • 認可グラント • リソースオーナによる認可を示す。 • 認可サーバは認可グラントに基づき,クライアントにアクセス トークンを発行する。 • 四つのタイプがあり,それぞれでアクセストークン発行手順が 異なる。 おさらい(OAuth) クライアントがリソースサーバに アクセスするときに必要なトークン
  • 11.
    11Copyright©2016 NTT corp.All Rights Reserved. • 四つのグラントタイプ • 認可コード • インプリシット • リソースオーナパスワードクレデンシャル • クライアントクレデンシャル おさらい(OAuth) OAuthといって普通にイメージするのはこのあたり。 エンドユーザはクライアントに対し認可の範囲を限定 できる。
  • 12.
    12Copyright©2016 NTT corp.All Rights Reserved. • 認可コードグラント • クライアントからリソースサーバへのアクセスを,エンドユー ザが認可することで,アクセストークンを発行する。 おさらい(OAuth) クライアント 認可サーバ ユーザ エージェント (Webブラウザ) (1)リソースサーバへのアクセス事象発生 (2)認可サーバへの リダイレクト指示 (3)リダイレクト (4)認可要求 (5)認可 要求 (7)認可 (8)認可コード + クライアントへのリダイレクト指示 (10)認可コードによりア クセストークン要求 (9)リダイレクト /w 認可コード (11)アクセストークン (6)認可(エンドユーザはクライアントに対して認可の範囲を限定できる。) リソースサーバ(12)リソースサーバへのアクセス
  • 13.
    13Copyright©2016 NTT corp.All Rights Reserved. • クライアントクレデンシャルグラント • エンドユーザとは関係なく,クライアントを認証し,アクセス トークンを発行する。 おさらい(OAuth) クライアント 認可サーバ (1)リソースサーバへの アクセス事象発生 (2)クライアントの認証情報 (3)アクセストークン リソースサーバ(4)リソースサーバへのアクセス
  • 14.
    14Copyright©2016 NTT corp.All Rights Reserved. • Spring Bootによるサービスの実現 • Eurekaによるサービスの登録・発見 SpringとMicroservices
  • 15.
    15Copyright©2016 NTT corp.All Rights Reserved. • Spring Security OAuth • Spring Securityの関連プロジェクト • 認可サーバ,リソースサーバ,クライアントの作成をサポート • 今回は,Spring Security OAuthの細かな設定などの説明は割 愛。 SpringとOAuth
  • 16.
    16Copyright©2016 NTT corp.All Rights Reserved. • Spring BootやSpring Security OAuthを使った Microservicesなアプリケーションで,サービス(リ ソースサーバ)から他のサービスの呼び出しでも,エン ドユーザが認可した範囲に限定したアクセスを行う。 実現したいこと(1) クライアント エンドユーザが認可した範囲での限定したアクセス Microservicesでいうところのサービスを OAuthのリソースサーバとして実現
  • 17.
    17Copyright©2016 NTT corp.All Rights Reserved. 認可サーバ 認可サーバ • Spring Security OAuthで作ったクライアントやリ ソースサーバが,Eurekaサーバに登録された,多重化 されたリソースサーバや認可サーバのうちのどれかを選 んでアクセスする。 実現したいこと(2) クライアント
  • 18.
    18Copyright©2016 NTT corp.All Rights Reserved. • クライアントからリソースサーバへのアクセス • リソースサーバはクライアントに対して,REST APIを提供す る。 • クライアントは,REST APIに普通にアクセスするときに使う RestTemplateの代わりにOAuth2RestTemplateを使って,リ ソースサーバにアクセスする。 Spring Security OAuth @RestController public class ClientController { @Value("${config.oauth2.resourceURI}") private String resourceUri; @Autowired private OAuth2RestTemplate restTemplate; @RequestMapping("/") public String home() { return restTemplate.getForObject(resourceUri, String.class); } }
  • 19.
    19Copyright©2016 NTT corp.All Rights Reserved. • 認可コードグラントによるリソースサーバへのアクセス の流れ • クライアントからリソースサーバへのアクセスが必要になる。 Spring Security OAuth クライアント リソースサーバ
  • 20.
    20Copyright©2016 NTT corp.All Rights Reserved. • 認可コードグラントによるリソースサーバへのアクセス の流れ • クライアントからリソースサーバへのアクセスが必要になる。 • クライアントは,OAuth2RestTemplateを使いリソースサー バにアクセスしようとする。 Spring Security OAuth クライアント リソースサーバOAuth2 RestTemplate Controller
  • 21.
    21Copyright©2016 NTT corp.All Rights Reserved. • 認可コードグラントによるリソースサーバへのアクセス の流れ • クライアントからリソースサーバへのアクセスが必要になる。 • クライアントは,OAuth2RestTemplateを使いリソースサー バにアクセスしようとする。 • UserRedirectRequiredExceptionが投げられる。 Spring Security OAuth クライアント リソースサーバOAuth2 RestTemplate Controller UserRedirect RequiredException
  • 22.
    22Copyright©2016 NTT corp.All Rights Reserved. • 認可コードグラントによるリソースサーバへのアクセス の流れ • OAuth2ClientContextFilterがキャッチしてブラウザのロケー ションを認可サーバにリダイレクトさせる。 Spring Security OAuth クライアント リソースサーバOAuth2 RestTemplate Controller OAuth2 ClientContextFilter UserRedirect RequiredException 認可サーバ
  • 23.
    23Copyright©2016 NTT corp.All Rights Reserved. • 認可コードグラントによるリソースサーバへのアクセス の流れ • OAuth2ClientContextFilterがキャッチしてブラウザのロケー ションを認可サーバにリダイレクトさせる。 • ユーザの認証・認可が行われる。 Spring Security OAuth クライアント リソースサーバOAuth2 RestTemplate Controller OAuth2 ClientContextFilter 認可サーバ認証・認可
  • 24.
    24Copyright©2016 NTT corp.All Rights Reserved. • 認可コードグラントによるリソースサーバへのアクセス の流れ • OAuth2ClientContextFilterがキャッチしてブラウザのロケー ションを認可サーバにリダイレクトさせる。 • ユーザの認証・認可が行われる。 • 元のクライアントのURLにリダイレクトされ,再度コントロー ラが呼ばれる。 Spring Security OAuth クライアント リソースサーバOAuth2 RestTemplate Controller OAuth2 ClientContextFilter 認可サーバ 認可コード
  • 25.
    25Copyright©2016 NTT corp.All Rights Reserved. • 認可コードグラントによるリソースサーバへのアクセス の流れ • 再度,OAuth2RestTemplateを使いリソースサーバにアクセ スしようとする。 Spring Security OAuth クライアント リソースサーバOAuth2 RestTemplate Controller OAuth2 ClientContextFilter 認可サーバ 認可コード
  • 26.
    26Copyright©2016 NTT corp.All Rights Reserved. • 認可コードグラントによるリソースサーバへのアクセス の流れ • 再度,OAuth2RestTemplateを使いリソースサーバにアクセ スしようとする。 • 認可サーバからアクセストークンを取得する。 Spring Security OAuth クライアント リソースサーバOAuth2 RestTemplate Controller OAuth2 ClientContextFilter 認可サーバ 認可コード 認可コード アクセストークン
  • 27.
    27Copyright©2016 NTT corp.All Rights Reserved. • 認可コードグラントによるリソースサーバへのアクセス の流れ • 再度,OAuth2RestTemplateを使いリソースサーバにアクセ スしようとする。 • 認可サーバからアクセストークンを取得する。 • リソースサーバにアクセスする。 Spring Security OAuth クライアント リソースサーバOAuth2 RestTemplate Controller OAuth2 ClientContextFilter 認可サーバ 認可コード 認可コード アクセストークン アクセストークン
  • 28.
    28Copyright©2016 NTT corp.All Rights Reserved. • Spring BootやSpring Security OAuthを使った Microservicesなアプリケーションで,サービス(リ ソースサーバ)から他のサービスの呼び出しでも,エン ドユーザが認可した範囲に限定したアクセスを行う。 実現したいこと(1) クライアント エンドユーザが認可した範囲での限定したアクセス Microservicesでいうところのサービスを OAuthのリソースサーバとして実現
  • 29.
    29Copyright©2016 NTT corp.All Rights Reserved. • リソースサーバ(A)(サービス)から他のリソースサーバ (B)へのアクセスにOAuthを使うには…。 リソースサーバ(A)から他のリソースサーバ(B)へのアクセス クライアント リソースサーバ (B) リソースサーバ (A) アクセストークン アクセストークン 認可サーバ
  • 30.
    30Copyright©2016 NTT corp.All Rights Reserved. • リソースサーバ(A)(サービス)から他のリソースサーバ (B)へのアクセスにOAuthを使うには…。 • 認可コードグラント? • リソースサーバ(A)にアクセスしているのはクライアントや他のリ ソースサーバであって,エンドユーザではない。 • エンドユーザに認可を求めることができない。 リソースサーバ(A)から他のリソースサーバ(B)へのアクセス クライアント リソースサーバ (B) リソースサーバ (A) アクセストークン アクセストークン 認証・認可 認可サーバ
  • 31.
    31Copyright©2016 NTT corp.All Rights Reserved. • リソースサーバ(A)(サービス)から他のリソースサーバ (B)へのアクセスにOAuthを使うには…。 • クライアントクレデンシャルグラントを使うのが普通(多分)。 • エンドユーザは介入しない。 • リソースサーバ(A)をクライアントとして認可サーバが認証でき る。 • リソースサーバ(A)に与えられたスコープで,リソースサーバ(B) にアクセスできる。 • つまり,エンドユーザの認可は反映されない。 リソースサーバ(A)から他のリソースサーバ(B)へのアクセス 認可サーバ リソースサーバ(A)の認証情報 アクセストークン リソースサーバ (B) リソースサーバ(B)へのアクセス リソースサーバ (A)
  • 32.
    32Copyright©2016 NTT corp.All Rights Reserved. • リソースサーバ(A)(サービス)から他のリソースサーバ (B)へのアクセスにOAuthを使うには…。 • エンドユーザの認可を反映しつつ,リソースサーバ(A)からリ ソースサーバ(B)にアクセスしたい。 リソースサーバ(A)から他のリソースサーバ(B)へのアクセス
  • 33.
    33Copyright©2016 NTT corp.All Rights Reserved. • リソースサーバ(A)(サービス)から他のリソースサーバ (B)へのアクセスにOAuthを使うには…。 • クライアントは,リソースサーバ(A)にアクセスするとき,認 可コードグラントで,ユーザの認可が反映されたアクセストー クンを受け取ることができる。 • リソースサーバ(A)はこのアクセストークンをクライアントか ら受け取る。 リソースサーバ(A)から他のリソースサーバ(B)へのアクセス クライアント リソースサーバ (B) リソースサーバ (A) アクセストークン アクセストークン 認可サーバ
  • 34.
    34Copyright©2016 NTT corp.All Rights Reserved. • リソースサーバ(A)(サービス)から他のリソースサーバ (B)へのアクセスにOAuthを使うには…。 • リソースサーバ(A)がクライアントから受け取ったアクセス トークンをそのままリソースサーバ(B)へのアクセスに使えば …。 • JWT(JSON Web Token)なアクセストークンを使えば,改ざん防 止とリソースサーバ内での検証が可能。 リソースサーバ(A)から他のリソースサーバ(B)へのアクセス クライアント リソースサーバ (B) リソースサーバ (A) アクセストークン アクセストークン 認可サーバ アクセストークン
  • 35.
    35Copyright©2016 NTT corp.All Rights Reserved. • リソースサーバ(A)(サービス)から他のリソースサーバ (B)へのアクセスにOAuthを使うには…。 • リソースサーバ(A)がクライアントから受け取ったアクセス トークンをそのままリソースサーバ(B)へのアクセスに使えば …。 リソースサーバから他のリソースサーバへのアクセス @RequestMapping("/") public String resource(OAuth2Authentication principal) { // 認証情報に含まれるアクセストークンを取得し, String tokenValue = ((OAuth2AuthenticationDetails)principal.getDetails()).getTokenValue(); // リソーサーバ(B)へのアクセスに使う // OAuth2RestTemplateのOAuth2ClientContextに埋め込む OAuth2ClientContext context = ((OAuth2RestTemplate)restTemplate).getOAuth2ClientContext(); context.setAccessToken(new DefaultOAuth2AccessToken(tokenValue)); return "resource server! -> " + restTemplate.getForObject(resourceUri, String.class); }
  • 36.
    36Copyright©2016 NTT corp.All Rights Reserved. • リソースサーバ(A)(サービス)から他のリソースサーバ (B)へのアクセスにOAuthを使うには…。 • リソースサーバ(A)がクライアントから受け取ったアクセス トークンをそのままリソースサーバ(B)へのアクセスに使えば …。 • 期待通りにエンドユーザが認可した権限の範囲で,リソース サーバ(A)からリソースサーバ(B)へのアクセスが可能になる。 リソースサーバから他のリソースサーバへのアクセス
  • 37.
    37Copyright©2016 NTT corp.All Rights Reserved. 認可サーバ 認可サーバ • Spring Security OAuthで作ったクライアントやリ ソースサーバが,Eurekaサーバに登録された,多重化 されたリソースサーバや認可サーバのうちのどれかを選 んでアクセスする。 実現したいこと(2) クライアント
  • 38.
    38Copyright©2016 NTT corp.All Rights Reserved. • クライアントから多重化されたリソースサーバにアクセ スする。 EurekaとSpring Security OAuth 認可サーバ 認可サーバ クライアント
  • 39.
    39Copyright©2016 NTT corp.All Rights Reserved. • クライアントから多重化されたリソースサーバにアクセ スする。 • クライアントから多重化された認可サーバにアクセスす る。 EurekaとSpring Security OAuth 認可サーバ 認可サーバ クライアント
  • 40.
    40Copyright©2016 NTT corp.All Rights Reserved. • クライアントから多重化されたリソースサーバにアクセ スする。 • クライアントから多重化された認可サーバにアクセスす る。 • リソースサーバから多重化された認可サーバにアクセス する。 EurekaとSpring Security OAuth 認可サーバ 認可サーバ クライアント
  • 41.
    41Copyright©2016 NTT corp.All Rights Reserved. • クライアントから多重化されたリソースサーバにアクセ スする。 EurekaとSpring Security OAuth 認可サーバ 認可サーバ クライアント
  • 42.
    42Copyright©2016 NTT corp.All Rights Reserved. • クライアントから多重化されたリソースサーバにアクセ スする。 • Eurekaに登録されたサービスに普通にアクセスするときとほぼ 一緒。 EurekaとSpring Security OAuth @Autowired private OAuth2RestOperations restTemplate; @Autowired private LoadBalancerClient loadBalancer; @RequestMapping("/") public String home() { // resourceNameに該当するサービスを一つ選択しURIを構築する。 String uri = loadBalancer.choose(resourceName).getUri() + resourcePath; return restTemplate.getForObject(uri, String.class); }
  • 43.
    43Copyright©2016 NTT corp.All Rights Reserved. • クライアントから多重化された認可サーバにアクセスす る。 EurekaとSpring Security OAuth 認可サーバ 認可サーバ クライアント
  • 44.
    44Copyright©2016 NTT corp.All Rights Reserved. • クライアントから多重化された認可サーバにアクセスす る。 EurekaとSpring Security OAuth あらかじめ設定した内容に 基づいてSpring Security OAuthが勝手に認可サーバ にアクセスする。
  • 45.
    45Copyright©2016 NTT corp.All Rights Reserved. • クライアントから多重化された認可サーバにアクセスす る。 EurekaとSpring Security OAuth Spring Security OAuth で提供されているクラス を拡張する必要がある。 あらかじめ設定した内容に 基づいてSpring Security OAuthが勝手に認可サーバ にアクセスする。
  • 46.
    46Copyright©2016 NTT corp.All Rights Reserved. • リソースサーバから多重化された認可サーバにアクセス する。 EurekaとSpring Security OAuth 認可サーバ 認可サーバ クライアント
  • 47.
    47Copyright©2016 NTT corp.All Rights Reserved. • リソースサーバから多重化された認可サーバにアクセス する。 • JWT使用時,リソースサーバから認可サーバにアクセスするの は,起動時の一度のみ。 • アクセストークン検証用の鍵を認可サーバに取りに行く。 • org.springframework.boot.autoconfigure.security.oauth2.r esource.ResourceServerTokenServicesConfigurationの中 • リソースサーバ起動時に,Eurekaで見つけた認可サーバに鍵を 取りに行くようにすればOK。 • そもそも,設定ファイル(e.g. application.yml)に鍵を書いて おけば,認可サーバにアクセスする必要はない…。 EurekaとSpring Security OAuth
  • 48.
    48Copyright©2016 NTT corp.All Rights Reserved. • OAuthで,リソースサーバ(A)が他のリソースサーバ (B)にアクセスするときに必要となるアクセストークン は,リソースサーバ(A)がクライアントから受け取った アクセストークンを流用できる。 • OAuthで,クライアントから多重化されたリソース サーバへのアクセスは,多重化されたサービスに普通に アクセスするときとほぼ一緒。 • クライアントやリソースサーバから多重化された認可 サーバへのアクセスは,少し頑張れば可能。 まとめ