基礎からのOAuth 2.0とSpring Security 5.1による実装 #jsug

124.6K Views

May 26, 22

スライド概要

JSUG Spring Fest 2018の資料です。
OAuth 2.0については始めから解説しています。
Spring Security 5.1のクライアント機能・リソースサーバー機能を紹介しています。認可サーバーはKeycloakです。

profile-image

Java、Spring、IntelliJ IDEA

シェア

またはPlayer版

埋め込む »CMSなどでJSが使えない場合

関連スライド

各ページのテキスト
1.

#jsug #sf_h4 Pivotal認定講師が解説! 基礎からのOAuth 2.0と Spring Security 5.1による実装 (株)カサレアル 多⽥真敏 2018年10⽉31⽇ JSUG Spring Fest (C) CASAREAL, Inc. All rights reserved. 1

2.

#jsug #sf_h4 ハッシュタグ このセッションについて ▸ OAuth 2.0の概要およびSpring Security 5.1の 関連機能について、基礎から分かりやすく解説 します ▸ 【中級者向け】Spring Securityの基礎知識はあ ることが前提です ▸ でもSpring Security成分は最後の30%くらい…💦 2 (C) CASAREAL, Inc. All rights reserved.

3.

#jsug #sf_h4 ⾃⼰紹介 ▸ 多⽥真敏(@suke_masa) ▸ 研修トレーナー@カサレアル ▸ Spring / Java EE / Microservices / Cloud Foundry ▸ Pivotal認定講師 ▸ ⽇本Springユーザ会スタッフ ▸ ⽇本GlassFishユーザー会運営メンバー 3 (C) CASAREAL, Inc. All rights reserved.

4.

#jsug #sf_h4 株式会社カサレアル ▸ 他社には無い⾊々なプログラミング⾔語の研修 を提供しています! 4 (C) CASAREAL, Inc. All rights reserved.

5.

#jsug #sf_h4 世界⼀ハイレベルなSpring研修 ▸ Pivotal認定 Core Spring (4⽇間) ▸ DI、AOP、Test、JDBC、Tx、Data、Boot、Web、 REST、Security、OAuth 2.0、Actuator ▸ ロジカルな講義+演習で徹底理解 ▸ アーキテクトやリーダー向け https://www.casareal.co.jp/ls/service/openseminar/pivotal/p016 (C) CASAREAL, Inc. All rights reserved. 5

6.

#jsug #sf_h4 オリジナルSpring研修 ▸ はじめてのSpring MVCによる Webアプリケーション開発 (2⽇間) ▸ エントリー向けSpringの基礎 ▸ Spring Security⼊⾨ (1⽇間) ▸ 認証/認可、アーキテクチャー、OAuth 2.0 ▸ Spring Batch⼊⾨ (1⽇間) ▸ バッチ処理 https://www.casareal.co.jp/ls/service/openseminar/java 6 (C) CASAREAL, Inc. All rights reserved.

7.

#jsug #sf_h4 コンテナはじめました ▸ Docker⼊⾨ (1⽇間) ▸ Kubernetes⼊⾨ (1⽇間) https://www.casareal.co.jp/ls/service/openseminar/cloudnative 7 (C) CASAREAL, Inc. All rights reserved.

8.

#jsug #sf_h4 11/29 SpringOneハイライト! ▸ 9⽉に⽶国で⾏われたPivotalのカンファレンス SpringOne Platformの内容をハイライトで ご紹介! ▸ 詳細はこちら 8 (C) CASAREAL, Inc. All rights reserved.

9.

#jsug #sf_h4 ⽬次 ① OAuth 2.0の基本⽤語 ② アクセストークンの取得 ③ アクセストークンを利⽤した リソースアクセス ④ 認可サーバーの実装 ⑤ クライアントの実装 ⑥ リソースサーバーの実装 9 (C) CASAREAL, Inc. All rights reserved.

10.

#jsug #sf_h4 ⽬次 ① OAuth 2.0の基本⽤語 ② アクセストークンの取得 ③ アクセストークンを利⽤した リソースアクセス ④ 認可サーバーの実装 ⑤ クライアントの実装 ⑥ リソースサーバーの実装 10 (C) CASAREAL, Inc. All rights reserved.

11.

#jsug #sf_h4 OAuth 2.0とは ▸ 認可の流れを規定したプロトコル ▸ RFC 6749 (⽇本語版もある) ▸ OAuth 1.0とは別物 ▸ Struts 1とStruts 2くらい違う ▸ 認証プロトコルOpenID Connect のベースになっている 11 (C) CASAREAL, Inc. All rights reserved.

12.

#jsug #sf_h4 アクセストークンとは ▸ サーバーのデータにアクセスするための許可証 クライアント アクセス トークン サーバー ①リクエスト こんにちは! ②レスポンス 楽しみだなー 12 (C) CASAREAL, Inc. All rights reserved.

13.

#jsug #sf_h4 スコープとは スコープ= そのアクセストークンが やれることの範囲 13 (C) CASAREAL, Inc. All rights reserved.

14.

#jsug #sf_h4 ID+パスワードじゃダメなの?🤔 ▸ パスワードを持っている⼈は全権限を持つ ▸ 盗んだ⼈は何でもやりたい放題😇 ▸ アクセストークンなら ▸ 盗まれても、そのトークンを無効化すればいいだけ ▸ スコープにより、できることが制限されている 14 (C) CASAREAL, Inc. All rights reserved.

15.

#jsug #sf_h4 OAuth 2.0の登場⼈物 ① リソースオーナー (Resource Owner) ▸ 情報の持ち主。ほぼ⼈間。 クラス名などで頻出! 正確に理解しましょう ② リソースサーバー (Resource Server) ▸ 情報を保持するサーバー。 ③ クライアント (Client) ▸ リソースサーバーからもらった情報を扱うアプリケーション。 ④ 認可サーバー (Authorization Server) ▸ ユーザー情報を保持するサーバー。 15 (C) CASAREAL, Inc. All rights reserved.

16.

#jsug #sf_h4 Twitterの例で登場⼈物まとめ クライアント リソース オーナー 認可 twitter.com アクセス トークン 付与 アクセス トークン 認可サーバー リソースサーバー こんにちは! 楽しみだなー つぶやき ※本当はTwitterはOAuth 1.0を使っています (C) CASAREAL, Inc. All rights reserved. 16

17.

#jsug #sf_h4 今回のサンプルアプリ ▸ TODO管理アプリ ▸ 認可サーバー ▸ リソースサーバー HTML ▸ クライアント アクセス トークン JSON 検証 請求書作成 資料郵送 17 (C) CASAREAL, Inc. All rights reserved.

18.

#jsug #sf_h4 DEMO ソースコード -> https://github.com/MasatoshiTada/oauth2-with-spring-security-51 18 (C) CASAREAL, Inc. All rights reserved.

19.

#jsug #sf_h4 ⽬次 ① OAuth 2.0の基本⽤語 ② アクセストークンの取得 ③ アクセストークンを利⽤した リソースアクセス ④ 認可サーバーの実装 ⑤ クライアントの実装 ⑥ リソースサーバーの実装 19 (C) CASAREAL, Inc. All rights reserved.

20.

#jsug #sf_h4 グラントタイプ(アクセストークンの取得⽅法) 今⽇はコレ ① 認可コード ▸ 主にサーバーサイドWebアプリケーション ② インプリシット ▸ 主にクライアントサイドWebアプリケーション ③ リソースオーナーパスワードクレデンシャル ▸ 主に公式のスマホアプリなど ④ クライアントクレデンシャル ▸ クライアント⾃⾝の情報取得 20 (C) CASAREAL, Inc. All rights reserved.

21.

#jsug #sf_h4 認可コードとは ▸ アクセストークンの引換券 認可サーバー クライアント 1. 認可コード発⾏ 2. 認可コード 3. アクセストークン ※このページの図はイメージです。正確な図は後ほど。 (C) CASAREAL, Inc. All rights reserved. 21

22.

#jsug #sf_h4 なぜ認可コードが必要? ▸ アクセストークンがWebブラウザに渡らないよ うにするため! ▸ 認可コードとリダイレクトを組み合わせて実現 22 (C) CASAREAL, Inc. All rights reserved.

23.

#jsug #sf_h4 アクセストークン取得の流れ リソース オーナー Web ブラウザ※ 認可 エンドポイント 認可サーバー ②認可エンドポイントにリダイレクト ③認可画⾯ ④認可 ①初回アクセス ⑤認可コード発⾏+リダイレクト ⑥認可コード クライアント ⑦アクセストークン ※Webブラウザは、仕様書では「ユーザーエージェント」と記載されています (C) CASAREAL, Inc. All rights reserved. 23

24.

#jsug #sf_h4 なぜ認可コードが必要? リソース オーナー Web ブラウザ アクセストークンが Webブラウザに 渡らない! 認可サーバー ②認可エンドポイントにリダイレクト ③認可画⾯ ④認可 ①初回アクセス ⑤認可コード発⾏+リダイレクト ⑥認可コード クライアント ⑦アクセストークン 24 (C) CASAREAL, Inc. All rights reserved.

25.

#jsug #sf_h4 認可コード発⾏+リダイレクト 認可サーバー 302 Found Location: https://クライアント/リダ イレクトエンドポイント?code=認可コード ⑤認可コード発⾏+リダイレクト GET https://クライアント/リダイレクト エンドポイント?code=認可コード リダイレクト エンドポイント クライアント 25 (C) CASAREAL, Inc. All rights reserved.

26.

#jsug #sf_h4 認可コードでアクセストークンをリクエスト 認可サーバー POST https://認可サーバー/トークンエ ンドポイント grant_type=authorization_code&cod e=認可コード&redirect_uri=リダイレク トエンドポイント ⑥認可コード クライアント トークン エンドポイント 26 (C) CASAREAL, Inc. All rights reserved.

27.

#jsug #sf_h4 アクセストークンをレスポンス 認可サーバー 200 OK { "access_token":"アクセストークン", "expires_in":3600, "refresh_token":"リフレッシュトークン" } ⑦アクセストークン クライアント トークン エンドポイント 27 (C) CASAREAL, Inc. All rights reserved.

28.

#jsug #sf_h4 OAuth 2.0仕様で未定義の部分 リソース オーナー Web ブラウザ どう認可するかは決まっていない →開発者が作り込む or ライブラリ依存 認可サーバー ②認可エンドポイントにリダイレクト ③認可画⾯ ④認可 ①初回アクセス ⑤認可コード発⾏+リダイレクト ⑥認可コード クライアント ⑦アクセストークン 28 (C) CASAREAL, Inc. All rights reserved.

29.

#jsug #sf_h4 認証が必要な箇所① リソース オーナー Web ブラウザ 認可したのは本当にリソースオーナー? →リソースオーナーのID・パスワードで認証 認可サーバー ②認可エンドポイントにリダイレクト ③認可画⾯ ④認可 ①初回アクセス ⑤認可コード発⾏+リダイレクト ⑥認可コード クライアント ⑦アクセストークン 29 (C) CASAREAL, Inc. All rights reserved.

30.

#jsug #sf_h4 認証が必要な箇所② リソース オーナー Web ブラウザ 認可コードを送ってきたのは本当にクライアント? →client_id・client_secretでBASIC認証 認可サーバー ②認可エンドポイントにリダイレクト ③認可画⾯ ④認可 ①初回アクセス ⑤認可コード発⾏+リダイレクト ⑥認可コード クライアント ⑦アクセストークン ※client_idとclient_secretは、認可サーバーに事前に発⾏してもらう (C) CASAREAL, Inc. All rights reserved. 30

31.

#jsug #sf_h4 ⽬次 ① OAuth 2.0の基本⽤語 ② アクセストークンの取得 ③ アクセストークンを利⽤した リソースアクセス ④ 認可サーバーの実装 ⑤ クライアントの実装 ⑥ リソースサーバーの実装 31 (C) CASAREAL, Inc. All rights reserved.

32.

#jsug #sf_h4 アクセストークンを利⽤したリソースアクセス 認可サーバー リソース オーナー ③アクセス トークン 検証 ①リクエスト ④ユーザー情報やスコープ クライアント ⑦レスポンス ②リソースにアクセス with アクセストークン リソース サーバー 請求書作成 資料郵送 ⑥レスポンス Web ブラウザ ⑤スコープを チェック 32 (C) CASAREAL, Inc. All rights reserved.

33.

#jsug #sf_h4 アクセストークンを利⽤したリソースアクセス 認可サーバー リソース オーナー GET ③アクセス https://リソースサーバー/foo/barトークン 検証 ①リクエスト Authorization: Bearer アクセストークン ④ユーザー情報やスコープ クライアント ⑦レスポンス ②リソースにアクセス with アクセストークン リソース サーバー 請求書作成 資料郵送 ⑥レスポンス Web ブラウザ ⑤スコープを チェック 33 (C) CASAREAL, Inc. All rights reserved.

34.

#jsug #sf_h4 OAuth 2.0で未定義の部分 リソース オーナー 認可サーバー アクセストークンを 送る部分以外は ほとんど未定義 ①リクエスト ③アクセス トークン 検証 ④ユーザー情報やスコープ クライアント ⑦レスポンス ②リソースにアクセス with アクセストークン リソース サーバー 請求書作成 資料郵送 ⑥レスポンス Web ブラウザ ⑤スコープを チェック 34 (C) CASAREAL, Inc. All rights reserved.

35.

#jsug #sf_h4 アクセストークンやスコープの検証⽅法 A) 認可サーバーに問い合わせる(Basic認証など が必要) B) 共有データベースなどを利⽤する C) アクセストークン⾃⾝に情報を含めておく ↑今回はコレ 35 (C) CASAREAL, Inc. All rights reserved.

36.

#jsug #sf_h4 JWT (JSON Web Token : ジョット) ▸ 平たく⾔うとアクセストークンの形式の⼀種 ▸ アクセストークン⾃⾝にユーザー情報やスコー プなどの情報を含めることができる ▸ 「.(ピリオド)」で3つの部分に分けられる ▸ それぞれの部分は、JSONをBase64URLでエンコード したもの 36 (C) CASAREAL, Inc. All rights reserved.

37.

#jsug #sf_h4 JWTの構造 eyJhbGciOiJSUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICJzbGcyMG9uOVg2c . zZFOExmNDZfQmRuaExHQy1xZnIyMVlvWE9nQVFKRlIwIn0 eyJqdGkiOiI4YzUyN mMzZC03OTA0LTQ2MWItOGU5ZS1jNDE5YTQ1NmFlNDMiLCJleHAiOjE1Mzg4MTM0Mj YsIm5iZiI6MCwiaWF0IjoxNTM4ODEzMTI2LCJpc3MiOiJodHRwOi8vbG9jYWxob3N 0OjkwMDAvYXV0aC9yZWFsbXMvaGVsbG8tYXBpIiwiYXVkIjoidHJhaW5pbmc2LWZy b250LXNlcnZpY2UiLCJzdWIiOiIxYWI5Yjg4Ny0yNDRhLTRjZTktYTBjMy1iZTc2Z GE4NzZiMTQiLCJ0eXAiOiJCZWFyZXIiLCJhenAiOiJ0cmFpbmluZzYtZnJvbnQtc2 VydmljZSIsImF1dGhfdGltZSI6MCwic2Vzc2lvbl9zdGF0ZSI6IjA4MjU3OTFlLTE 3ODQtNGQxMC1hMjYyLTAzM2U4YmE3OWViMCIsImFjciI6IjEiLCJhbGxvd2VkLW9y aWdpbnMiOlsiaHR0cDovL2xvY2FsaG9zdDo4MDgwIl0sInJlYWxtX2FjY2VzcyI6e yJyb2xlcyI6WyJvZmZsaW5lX2FjY2VzcyIsInVtYV9hdXRob3JpemF0aW9uIl19LC JyZXNvdXJjZV9hY2Nlc3MiOnsiYWNjb3VudCI6eyJyb2xlcyI6WyJtYW5hZ2UtYWN jb3VudCIsIm1hbmFnZS1hY2NvdW50LWxpbmtzIiwidmlldy1wcm9maWxlIl19fSwi c2NvcGUiOiJoZWxsbzpyZWFkIHByb2ZpbGUiLCJwcmVmZXJyZWRfdXNlcm5hbWUiO . iJ1c2VyIn0 fH8s3HaOFjC1CiZeWUP2O1AB2ruDPh9VRnFqSkRoM2zCTpqWgrkiQ BKW3r9RQAD_gsZCi3G7s0tQSCmuAMoht7gLgH9rFKzdKhuKiISeDUF7v2baPva8fH VN8zP1YF84XnVxq-zVThXLBdDgTRXWWI0_RG6xvJVDRv00gvDwPPvA3WxxIGcekuEjl3ChQhFHozDiEglAlNvlkDV2IvxVtON4GJ1UAwIj9uTpyAoIVY8oOy_0mMuevzxBSXk2HUxWr2Vrvhj3c2a RrchCOHPsDELtX0CmEBj_bU38d1XbHL30Ar7PWGvpPeSkM3mIykRosPDSXJwq8gUSAda0JeQ ヘッダー ペイロード 電⼦署名 37 (C) CASAREAL, Inc. All rights reserved.

38.

#jsug #sf_h4 ペイロードをデコードすると スコープと ユーザー名 38 ※Powered by jwt.io (C) CASAREAL, Inc. All rights reserved.

39.

#jsug #sf_h4 署名を利⽤したJWTの検証 ▸ リソースサーバーは、 JWTの署名で検証する ▸ 署名は、認可サーバーの秘 密鍵で暗号化されている →認可サーバーの公開鍵で 復号化する ※Powered by jwt.io (C) CASAREAL, Inc. All rights reserved. 39

40.

#jsug #sf_h4 JWK (JSON Web Key) JWK Set JWK ▸ 認可サーバーの公開鍵 の素となる情報が含ま れたJSON ▸ 認可サーバーからJWK Set形式(JWKの配列を含んだ JSON)で取得する ※具体的な検証⽅法は下記ブログが参考になります OpenID Connect の署名検証 (C) CASAREAL, Inc. All rights reserved. 40

41.

#jsug #sf_h4 JWTの弱点と対策 ▸ 弱点:アクセストークンの剥奪が不可能👎 ▸ リソースサーバーが認可サーバーに問い合わせしない ため、認可サーバー側での制御が不可能 ▸ 対策:アクセストークンの有効期限を短くする👌 ▸ だいたい数分間くらい ▸ 期限が切れたらリフレッシュトークンで再取得する 41 (C) CASAREAL, Inc. All rights reserved.

42.

#jsug #sf_h4 リフレッシュトークン ▸ アクセストークンを再取得するためのトークン ▸ アクセストークン取得時に⼀緒に受け取る 200 OK { "access_token":"アクセストークン", "expires_in":300, "refresh_token":"リフレッシュトークン" } 42 (C) CASAREAL, Inc. All rights reserved.

43.
[beta]
#jsug #sf_h4

アクセストークンのリフレッシュ⽅法
POST https://認可サーバー/トークンエンドポイント
Authorization: Basic <client_id : client_secret>
grant_type=refresh_token&refresh_token=リフレッシュ
トークン
200 OK
{
"access_token":"新しいアクセストークン",
"expires_in":300,
"refresh_token":"リフレッシュトークン"
}
※リフレッシュトークンも新しくするかはOAuth 2.0仕様には定められていない
(Keycloakではリフレッシュトークンも新しくなる)
(C) CASAREAL, Inc. All rights reserved.

43

44.

#jsug #sf_h4 ⽬次 ① OAuth 2.0の基本⽤語 ② アクセストークンの取得 ③ アクセストークンを利⽤した リソースアクセス ④ 認可サーバーの実装 ⑤ クライアントの実装 ⑥ リソースサーバーの実装 44 (C) CASAREAL, Inc. All rights reserved.

45.

#jsug #sf_h4 Spring SecurityのOAuth 2.0対応の歴史 ▸ 4.x以前 ▸ 5.0以降 ▸ 姉妹ライブラリに 機能が分散していた ▸ Spring Security OAuth2 ▸ Spring Cloud ▸ Spring Social... ▸ OAuth 2.0の機能を Spring Security 本体に新規開発 ▸ Spring Security OAuth2はメンテナンス モードへ (バグフィックスは継続) 45 (C) CASAREAL, Inc. All rights reserved.

46.

#jsug #sf_h4 個⼈的な所⾒ ▸ Spring Security OAuth2は難しすぎる😇 ▸ ドキュメントが少ない ▸ Javadocがほとんど書いてない ▸ 似たような名前のプロパティが多い ▸ OAuth 2.0仕様で未定義な部分の独⾃実装が多い ▸ 作るべきConfigが多い 46 (C) CASAREAL, Inc. All rights reserved.

47.

#jsug #sf_h4 Spring Security 5のOAuth 2.0対応状況 機能 説明 クライアント 5.0で対応済み リソースサーバー 5.1で対応済み 認可サーバー 未対応(5.2以降?) 47 (C) CASAREAL, Inc. All rights reserved.

48.

#jsug #sf_h4 認可サーバーを作るには? A) Spring Security OAuth2を利⽤する B) 認可サーバー機能を持ったサービスを利⽤する C) Keycloakなど既成の認可サーバーを利⽤する ↑今回はコレ ※Spring Security OAuth2の例は下記を参照 https://github.com/Pivotal-Japan/spring-security-oauth-workshop 48 (C) CASAREAL, Inc. All rights reserved.

49.

#jsug #sf_h4 Keycloakとは ▸ OAuth2やOpenID Connectに 対応したシングルサインオン基 盤 ▸ Red Hat社がオープンソースで 開発 ▸ https://www.keycloak.org 49 (C) CASAREAL, Inc. All rights reserved.

50.

#jsug #sf_h4 Keycloakのインストールや設定など ▸ クライアント・ユーザー・スコープ等を設定 ▸ 詳細はブログに書きました ▸ OAuth 2.0 with Spring Security 5.1の認可サーバーとして Keycloakを使う 50 (C) CASAREAL, Inc. All rights reserved.

51.

#jsug #sf_h4 重要エンドポイント ▸ 認可エンドポイント クライアントや リソースサーバーから アクセスする ▸ http://サーバー名/auth/realms/レルム名/protocol/openid-connect/auth ▸ トークンエンドポイント ▸ http://サーバー名/auth/realms/レルム名/protocol/openid-connect/token ▸ ユーザー情報 ▸ http://サーバー名/auth/realms/レルム名/protocol/openid-connect/userinfo ▸ JWK Set ▸ http://サーバー名/auth/realms/レルム名/protocol/openid-connect/cert 51 (C) CASAREAL, Inc. All rights reserved.

52.

#jsug #sf_h4 トークンのレスポンス 200 OK { "access_token" : "JWT形式のアクセストークン", "expires_in" : 有効時間(秒単位), "refresh_expires_in" : 有効時間(秒単位), "refresh_token" : "JWT形式のリフレッシュトークン", "scope" : "scope1 scope2 scope3 ...", ... } 52 (C) CASAREAL, Inc. All rights reserved.

53.

#jsug #sf_h4 ⽬次 ① OAuth 2.0の基本⽤語 ② アクセストークンの取得 ③ アクセストークンを利⽤した リソースアクセス ④ 認可サーバーの実装 ⑤ クライアントの実装 ⑥ リソースサーバーの実装 53 (C) CASAREAL, Inc. All rights reserved.

54.

#jsug #sf_h4 依存性 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-security</artifactId> </dependency> <!-- OAuth2クライアント機能 --> <dependency> <groupId>org.springframework.security</groupId> <artifactId>spring-security-oauth2-client</artifactId> </dependency> <!-- JWT関連機能 --> <dependency> <groupId>org.springframework.security</groupId> <artifactId>spring-security-oauth2-jose</artifactId> </dependency> 54 (C) CASAREAL, Inc. All rights reserved.

55.

#jsug #sf_h4 application.yml spring.security.oauth2.client.registration.todo: provider: 任意の名前(.registrationの後にも指定する) client-id: クライアントID client-secret: クライアントシークレット client-name: 任意の名前(画⾯表⽰で使われる) client-authentication-method: クライアント認証⽅法 authorization-grant-type: グラントタイプ redirect-uri: リダイレクトエンドポイントのURL scope: このアプリのスコープをカンマ区切りで指定 ※スペースの都合上でYAML形式で書いていますが、個⼈的にはproperties派です 55 (C) CASAREAL, Inc. All rights reserved.

56.

#jsug #sf_h4 application.yml(続き) spring.security.oauth2.client.provider.todo: authorization-uri: 認可エンドポイントのURL token-uri: トークンエンドポイントのURL user-info-uri: ユーザー情報のJSONが返ってくるURL user-name-attribute: JSONの中のユーザー名を表す属性名 user-info-authentication-method: ユーザー情報取得時の認証⽅式 jwk-set-uri: JWK Setが返ってくるURL issuer-uri: 認可サーバーのIssuer Identifier ※Keycloakの場合、issuer-uriを指定すれば他のプロパティは指定不要(user-name-attributeは任意) 56 (C) CASAREAL, Inc. All rights reserved.

57.

#jsug #sf_h4 Java Config @EnableWebSecurity public class SecurityConfig extends WebSecurityConfigurerAdapter { @Override protected void configure(HttpSecurity http) throws Exception { ... OAuth2Loginを有効化 http.oauth2Login() .loginPage("/login") .permitAll(); ... } } 57 (C) CASAREAL, Inc. All rights reserved.

58.
[beta]
#jsug #sf_h4

ログイン画⾯
/oauth2/authorization/provider名
<html ...>
<head>...</head>
<body>
<h1>OAuth2ログインページ</h1>
<a th:href="@{/oauth2/authorization/todo}">
Keycloakでログイン
</a>
</body>
</html>

58
(C) CASAREAL, Inc. All rights reserved.

59.

#jsug #sf_h4 アーキテクチャー概要 メモリ OAuth2AuthorizedClient 取得・削除・追加 OAuth2 Authorized Client Service OAuth2 Access Token OAuth2 Refresh Token OAuth2AuthorizedClient OAuth2 Access Token ※Spring Bootを利⽤している場合、 OAuth2AuthorizedClientServiceは Bean定義済になっています OAuth2 Refresh Token ・・・ 59 (C) CASAREAL, Inc. All rights reserved.

60.

#jsug #sf_h4 アクセストークンの取得 @Autowired private OAuth2AuthorizedClientService clientService; // OAuth2AuthenticationTokenはAuthentication実装クラス OAuth2AuthenticationToken auth = (OAuth2AuthenticationToken) SecurityContextHolder .getContext().getAuthentication(); // OAuth2AuthorizedClientを取得 OAuth2AuthorizedClient client = clientService.loadAuthorizedClient( auth.getAuthorizedClientRegistrationId(), auth.getName()); // アクセストークンを取得 String token = client.getAccessToken().getTokenValue(); 60 (C) CASAREAL, Inc. All rights reserved.

61.
[beta]
#jsug #sf_h4

リソースサーバーにアクセス
RestTemplate restTemplate = ...;
String token = ...;
// "Authorization: Bearer アクセストークン"というヘッダーを追加
HttpHeaders headers = new HttpHeaders();
headers.add(HttpHeaders.AUTHORIZATION, "Bearer " + token);
HttpEntity<Object> httpEntity = new HttpEntity<>(headers);
// リソースサーバーにリクエストし、レスポンスを受け取る
ResponseEntity<String> responseEntity =
restTemplate.exchange("http://リソースサーバーのURL",
HttpMethod.GET, httpEntity, String.class);

61
(C) CASAREAL, Inc. All rights reserved.

62.

#jsug #sf_h4 Spring WebFluxでは… ▸ WebClientだと、アクセストークンのヘッダー への追加やリフレッシュを⾃動的にやってくれ るらしい(未検証) ▸ https://docs.spring.io/spring-security/site/docs/ current/reference/htmlsingle/#servlet-webclient 62 (C) CASAREAL, Inc. All rights reserved.

63.

#jsug #sf_h4 ログアウト 認可サーバー ログアウト ▸ 必要に応じて認可サーバー からもログアウトする ▸ 認可サーバーのログアウト 処理はLogoutHandlerで実 装する ログアウト 請求書作成 資料郵送 クライアント リソースサーバー 63 (C) CASAREAL, Inc. All rights reserved.

64.

#jsug #sf_h4 Keycloakからのログアウト ▸ ログアウトエンドポイントにPOSTでアクセス ▸ 必要なリクエストパラメーターは下記3つ ① クライアントID ② クライアントシークレット ③ リフレッシュトークン 64 (C) CASAREAL, Inc. All rights reserved.

65.
[beta]
#jsug #sf_h4

LogoutHandlerの実装
private LogoutHandler logoutHandler() {
return (request, response, authentication) -> {
MultiValueMap<String, String> params = ...;
params.add("client_id", クライアントID);
params.add("client_secret", クライアントシークレット);
params.add("refresh_token", リフレッシュトークン);
HttpHeaders headers = new HttpHeaders();
headers.add(HttpHeaders.CONTENT_TYPE,
MediaType.APPLICATION_FORM_URLENCODED_VALUE);
RequestEntity<MultiValueMap<String, String>> requestEntity =
new RequestEntity<>(params, headers, HttpMethod.POST,
URI.create(Keycloakのログアウトエンドポイント);
ResponseEntity<String> responseEntity =
restTemplate.exchange(requestEntity, String.class);
};
}
※リフレッシュトークンなどの取得方法はソースコード参照
(C) CASAREAL, Inc. All rights reserved.

65

66.

#jsug #sf_h4 LogoutHandlerの実装 @EnableWebSecurity public class SecurityConfig extends WebSecurityConfigurerAdapter { @Override protected void configure(HttpSecurity http) throws Exception { ... http.logout() .addLogoutHandler(logoutHandler()) .invalidateHttpSession(true) .permitAll(); ... 作成したLogoutHandlerを追加 } } (C) CASAREAL, Inc. All rights reserved. 66

67.

#jsug #sf_h4 ⽬次 ① OAuth 2.0の基本⽤語 ② アクセストークンの取得 ③ アクセストークンを利⽤した リソースアクセス ④ 認可サーバーの実装 ⑤ クライアントの実装 ⑥ リソースサーバーの実装 67 (C) CASAREAL, Inc. All rights reserved.

68.

#jsug #sf_h4 依存性 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-security</artifactId> </dependency> <!-- OAuth2リソースサーバー機能 --> <dependency> <groupId>org.springframework.security</groupId> <artifactId>spring-security-oauth2-resource-server</ artifactId> </dependency> <!-- JWT関連機能 --> <dependency> <groupId>org.springframework.security</groupId> <artifactId>spring-security-oauth2-jose</artifactId> </dependency> 68 (C) CASAREAL, Inc. All rights reserved.

69.

#jsug #sf_h4 application.yml spring.security.oauth2.resourceserver.jwt: jwk-set-uri: JWK Setが返ってくるURL issuer-uri: 認可サーバーのIssuer Identifier ※Keycloakの場合、issuer-uriを指定すればjwk-set-uriは指定不要 69 (C) CASAREAL, Inc. All rights reserved.

70.

#jsug #sf_h4 JWK Setの取得フロー ① 起動時にissuer_uriで指定されたURLにリク エストを送信する ② レスポンスJSONのjwks_uri属性をJWK Set を取得するURLとする ③ クライアントからの初回アクセス時にJWK Set をリクエストする 70 (C) CASAREAL, Inc. All rights reserved.

71.

#jsug #sf_h4 Java Config @EnableWebSecurity public class SecurityConfig extends WebSecurityConfigurerAdapter { @Override protected void configure(HttpSecurity http) throws Exception { ... http.authorizeRequests() .mvcMatchers("保護対象のURL") .hasAuthority("SCOPE_スコープ名") ...; http.oauth2ResourceServer() .jwt(); ... } } (C) CASAREAL, Inc. All rights reserved. 71

72.

#jsug #sf_h4 最後に 72 (C) CASAREAL, Inc. All rights reserved.

73.

#jsug #sf_h4 OAuth 2.0のセキュリティ考慮事項 ▸ 秘匿情報が⾶び交うためHTTPS必須 ▸ その他、必ずOAuth 2.0仕様書をチェックしましょ う! ▸ 10.6 認可コードリダイレクトURIの操作 ▸ 10.11 フィッシングアタック ▸ 10.12 クロスサイトリクエストフォージェリ ・・・など 73 (C) CASAREAL, Inc. All rights reserved.

74.

#jsug #sf_h4 セキュリティ関連の別の仕様書 ▸ RFC 6819 - OAuth 2.0 Threat Model and Security Considerations ▸ RFC 7009 : OAuth 2.0 Token Revocation 74 (C) CASAREAL, Inc. All rights reserved.

75.

#jsug #sf_h4 まとめ ▸ まずはOAuth 2.0そのものの理解が⼤事 ▸ Spring Security 5.1はクライアント機能と リソースサーバー機能に対応 ▸ 認可サーバーはSpring Security 5.2以降 ▸ 現時点ではSpring Security OAuth2、既存のサービス、 既成の認可サーバーのいずれかを使う 75 (C) CASAREAL, Inc. All rights reserved.

76.

#jsug #sf_h4 参考資料 ▸ 基礎からのOAuth 2.0 ▸ JWTによるJSONに対する電⼦署名と、そのユースケース ▸ Spring Security Reference ▸ Securing OAuth 2.0 Resources in Spring Security 5 ▸ RFC 6749 - The OAuth 2.0 Authorization Framework ▸ RFC 7519 - JSON Web Token (JWT) ▸ Spring Boot 1/2のアプリにKeycloakのOpenID Connectを使ってシングルサイ ンオン ▸ SpringでOAuth 2.0 OpenID Connect 1.0を使う 76 (C) CASAREAL, Inc. All rights reserved.

77.

#jsug #sf_h4 研修、受けたくなりました? ▸ Pivotal認定Core Spring (4⽇間) ① 2019年1⽉10⽇・11⽇・17⽇・18⽇ ② 2019年3⽉11⽇・12⽇・27⽇・28⽇ ▸ Spring Security⼊⾨ (1⽇間) ① 2019年1⽉30⽇ ② 2019年3⽉1⽇ https://www.casareal.co.jp/ls/service/openseminar/java 77 (C) CASAREAL, Inc. All rights reserved.

78.

#jsug #sf_h4 アンケート、お願いします! アンケートへのリンク 78 (C) CASAREAL, Inc. All rights reserved.

79.

#jsug #sf_h4 Enjoy OAuth 2.0 & Spring Security 5.1!! ▸ ご清聴ありがとうございました! 79 (C) CASAREAL, Inc. All rights reserved.