Ce diaporama a bien été signalé.
Nous utilisons votre profil LinkedIn et vos données d’activité pour vous proposer des publicités personnalisées et pertinentes. Vous pouvez changer vos préférences de publicités à tout moment.

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

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

  • Identifiez-vous pour voir les commentaires

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

  1. 1. (C) CASAREAL, Inc. All rights reserved. #jsug #sf_h4 Pivotal認定講師が解説! 基礎からのOAuth 2.0と Spring Security 5.1による実装 (株)カサレアル 多⽥真敏 2018年10⽉31⽇ JSUG Spring Fest 1
  2. 2. (C) CASAREAL, Inc. All rights reserved. #jsug #sf_h4 このセッションについて ▸ OAuth 2.0の概要およびSpring Security 5.1の 関連機能について、基礎から分かりやすく解説 します ▸ 【中級者向け】Spring Securityの基礎知識はあ ることが前提です ▸ でもSpring Security成分は最後の30%くらい…💦 2 ハッシュタグ
  3. 3. (C) CASAREAL, Inc. All rights reserved. #jsug #sf_h4 ⾃⼰紹介 ▸ 多⽥真敏(@suke_masa) ▸ 研修トレーナー@カサレアル ▸ Spring / Java EE / Microservices
 / Cloud Foundry ▸ Pivotal認定講師 ▸ ⽇本Springユーザ会スタッフ ▸ ⽇本GlassFishユーザー会運営メンバー 3
  4. 4. (C) CASAREAL, Inc. All rights reserved. #jsug #sf_h4 株式会社カサレアル ▸ 他社には無い⾊々なプログラミング⾔語の研修 を提供しています! 4
  5. 5. (C) CASAREAL, Inc. All rights reserved. #jsug #sf_h4 世界⼀ハイレベルなSpring研修 ▸ Pivotal認定 Core Spring (4⽇間) ▸ DI、AOP、Test、JDBC、Tx、Data、Boot、Web、 REST、Security、OAuth 2.0、Actuator ▸ ロジカルな講義+演習で徹底理解 ▸ アーキテクトやリーダー向け 5 https://www.casareal.co.jp/ls/service/openseminar/pivotal/p016
  6. 6. (C) CASAREAL, Inc. All rights reserved. #jsug #sf_h4 オリジナルSpring研修 ▸ はじめてのSpring MVCによる
 Webアプリケーション開発 (2⽇間) ▸ エントリー向けSpringの基礎 ▸Spring Security⼊⾨ (1⽇間) ▸ 認証/認可、アーキテクチャー、OAuth 2.0 ▸Spring Batch⼊⾨ (1⽇間) ▸ バッチ処理 6 https://www.casareal.co.jp/ls/service/openseminar/java
  7. 7. (C) CASAREAL, Inc. All rights reserved. #jsug #sf_h4 コンテナはじめました ▸ Docker⼊⾨ (1⽇間) ▸ Kubernetes⼊⾨ (1⽇間) 7 https://www.casareal.co.jp/ls/service/openseminar/cloudnative
  8. 8. (C) CASAREAL, Inc. All rights reserved. #jsug #sf_h4 11/29 SpringOneハイライト! ▸ 9⽉に⽶国で⾏われたPivotalのカンファレンス
 SpringOne Platformの内容をハイライトで
 ご紹介! ▸ 詳細はこちら 8
  9. 9. (C) CASAREAL, Inc. All rights reserved. #jsug #sf_h4 ⽬次 ① OAuth 2.0の基本⽤語 ② アクセストークンの取得 ③ アクセストークンを利⽤した
 リソースアクセス ④ 認可サーバーの実装 ⑤ クライアントの実装 ⑥ リソースサーバーの実装 9
  10. 10. (C) CASAREAL, Inc. All rights reserved. #jsug #sf_h4 ⽬次 ① OAuth 2.0の基本⽤語 ② アクセストークンの取得 ③ アクセストークンを利⽤した
 リソースアクセス ④ 認可サーバーの実装 ⑤ クライアントの実装 ⑥ リソースサーバーの実装 10
  11. 11. (C) CASAREAL, Inc. All rights reserved. #jsug #sf_h4 OAuth 2.0とは ▸ 認可の流れを規定したプロトコル ▸ RFC 6749 (⽇本語版もある) ▸ OAuth 1.0とは別物 ▸ Struts 1とStruts 2くらい違う ▸ 認証プロトコルOpenID Connect
 のベースになっている 11
  12. 12. (C) CASAREAL, Inc. All rights reserved. #jsug #sf_h4 アクセストークンとは ▸ サーバーのデータにアクセスするための許可証 12 アクセス トークン こんにちは!
 楽しみだなー ①リクエスト ②レスポンス クライアント サーバー
  13. 13. (C) CASAREAL, Inc. All rights reserved. #jsug #sf_h4 スコープとは 13 スコープ= そのアクセストークンが やれることの範囲
  14. 14. (C) CASAREAL, Inc. All rights reserved. #jsug #sf_h4 ID+パスワードじゃダメなの?🤔 ▸ パスワードを持っている⼈は全権限を持つ ▸ 盗んだ⼈は何でもやりたい放題😇 ▸ アクセストークンなら ▸ 盗まれても、そのトークンを無効化すればいいだけ ▸ スコープにより、できることが制限されている 14
  15. 15. (C) CASAREAL, Inc. All rights reserved. #jsug #sf_h4 OAuth 2.0の登場⼈物 ① リソースオーナー (Resource Owner) ▸ 情報の持ち主。ほぼ⼈間。 ② リソースサーバー (Resource Server) ▸ 情報を保持するサーバー。 ③ クライアント (Client) ▸ リソースサーバーからもらった情報を扱うアプリケーション。 ④ 認可サーバー (Authorization Server) ▸ ユーザー情報を保持するサーバー。 15 クラス名などで頻出! 正確に理解しましょう
  16. 16. (C) CASAREAL, Inc. All rights reserved. #jsug #sf_h4 Twitterの例で登場⼈物まとめ 16 twitter.com こんにちは!
 楽しみだなー リソース
 オーナー クライアント リソースサーバー 認可サーバー 認可 アクセス
 トークン
 付与 アクセス
 トークン つぶやき ※本当はTwitterはOAuth 1.0を使っています
  17. 17. (C) CASAREAL, Inc. All rights reserved. #jsug #sf_h4 今回のサンプルアプリ 17 ▸ TODO管理アプリ ▸ 認可サーバー ▸ リソースサーバー ▸ クライアント 請求書作成
 資料郵送 JSON HTML アクセス
 トークン 検証
  18. 18. (C) CASAREAL, Inc. All rights reserved. #jsug #sf_h4 18 DEMO ソースコード -> https://github.com/MasatoshiTada/oauth2-with-spring-security-51
  19. 19. (C) CASAREAL, Inc. All rights reserved. #jsug #sf_h4 ⽬次 ① OAuth 2.0の基本⽤語 ② アクセストークンの取得 ③ アクセストークンを利⽤した
 リソースアクセス ④ 認可サーバーの実装 ⑤ クライアントの実装 ⑥ リソースサーバーの実装 19
  20. 20. (C) CASAREAL, Inc. All rights reserved. #jsug #sf_h4 グラントタイプ(アクセストークンの取得⽅法) ① 認可コード ▸ 主にサーバーサイドWebアプリケーション ② インプリシット ▸ 主にクライアントサイドWebアプリケーション ③ リソースオーナーパスワードクレデンシャル ▸ 主に公式のスマホアプリなど ④ クライアントクレデンシャル ▸ クライアント⾃⾝の情報取得 20 今⽇はコレ
  21. 21. (C) CASAREAL, Inc. All rights reserved. #jsug #sf_h4 認可コードとは ▸ アクセストークンの引換券 21 認可サーバークライアント 1. 認可コード発⾏ 2. 認可コード 3. アクセストークン ※このページの図はイメージです。正確な図は後ほど。
  22. 22. (C) CASAREAL, Inc. All rights reserved. #jsug #sf_h4 なぜ認可コードが必要? ▸ アクセストークンがWebブラウザに渡らないよ うにするため! ▸ 認可コードとリダイレクトを組み合わせて実現 22
  23. 23. (C) CASAREAL, Inc. All rights reserved. #jsug #sf_h4 アクセストークン取得の流れ 23 認可サーバー クライアント リソース
 オーナー Web
 ブラウザ※ ※Webブラウザは、仕様書では「ユーザーエージェント」と記載されています ①初回アクセス ⑤認可コード発⾏+リダイレクト ⑥認可コード ⑦アクセストークン ②認可エンドポイントにリダイレクト 認可 エンドポイント ③認可画⾯ ④認可
  24. 24. (C) CASAREAL, Inc. All rights reserved. #jsug #sf_h4 なぜ認可コードが必要? 24 認可サーバー クライアント リソース
 オーナー Web
 ブラウザ ①初回アクセス ⑤認可コード発⾏+リダイレクト ⑥認可コード ⑦アクセストークン ②認可エンドポイントにリダイレクト ③認可画⾯ ④認可 アクセストークンが Webブラウザに 渡らない!
  25. 25. (C) CASAREAL, Inc. All rights reserved. #jsug #sf_h4 認可コード発⾏+リダイレクト 25 認可サーバー クライアント ⑤認可コード発⾏+リダイレクト リダイレクト エンドポイント 302 Found Location: https://クライアント/リダ イレクトエンドポイント?code=認可コード GET https://クライアント/リダイレクト エンドポイント?code=認可コード
  26. 26. (C) CASAREAL, Inc. All rights reserved. #jsug #sf_h4 認可コードでアクセストークンをリクエスト 26 認可サーバー クライアント ⑥認可コード トークン エンドポイント POST https://認可サーバー/トークンエ ンドポイント grant_type=authorization_code&cod e=認可コード&redirect_uri=リダイレク トエンドポイント
  27. 27. (C) CASAREAL, Inc. All rights reserved. #jsug #sf_h4 アクセストークンをレスポンス 27 認可サーバー クライアント ⑦アクセストークン トークン エンドポイント 200 OK { "access_token":"アクセストークン", "expires_in":3600, "refresh_token":"リフレッシュトークン" }
  28. 28. (C) CASAREAL, Inc. All rights reserved. #jsug #sf_h4 OAuth 2.0仕様で未定義の部分 28 認可サーバー クライアント リソース
 オーナー Web
 ブラウザ ①初回アクセス ⑤認可コード発⾏+リダイレクト ⑥認可コード ⑦アクセストークン ②認可エンドポイントにリダイレクト ③認可画⾯ ④認可 どう認可するかは決まっていない →開発者が作り込む or ライブラリ依存
  29. 29. (C) CASAREAL, Inc. All rights reserved. #jsug #sf_h4 認証が必要な箇所① 29 認可サーバー クライアント リソース
 オーナー Web
 ブラウザ ①初回アクセス ⑤認可コード発⾏+リダイレクト ⑥認可コード ⑦アクセストークン ②認可エンドポイントにリダイレクト ③認可画⾯ ④認可 認可したのは本当にリソースオーナー? →リソースオーナーのID・パスワードで認証
  30. 30. (C) CASAREAL, Inc. All rights reserved. #jsug #sf_h4 認証が必要な箇所② 30 認可サーバー クライアント リソース
 オーナー Web
 ブラウザ ①初回アクセス ⑤認可コード発⾏+リダイレクト ⑥認可コード ⑦アクセストークン ②認可エンドポイントにリダイレクト ③認可画⾯ ④認可 認可コードを送ってきたのは本当にクライアント? →client_id・client_secretでBASIC認証 ※client_idとclient_secretは、認可サーバーに事前に発⾏してもらう
  31. 31. (C) CASAREAL, Inc. All rights reserved. #jsug #sf_h4 ⽬次 ① OAuth 2.0の基本⽤語 ② アクセストークンの取得 ③ アクセストークンを利⽤した
 リソースアクセス ④ 認可サーバーの実装 ⑤ クライアントの実装 ⑥ リソースサーバーの実装 31
  32. 32. (C) CASAREAL, Inc. All rights reserved. #jsug #sf_h4 アクセストークンを利⽤したリソースアクセス 32 認可サーバー クライアント リソース
 オーナー Web
 ブラウザ 請求書作成
 資料郵送 リソース
 サーバー ①リクエスト ③アクセス
  トークン
  検証 ④ユーザー情報やスコープ ⑥レスポンス⑦レスポンス ⑤スコープを
  チェック ②リソースにアクセス
 with アクセストークン
  33. 33. (C) CASAREAL, Inc. All rights reserved. #jsug #sf_h4 アクセストークンを利⽤したリソースアクセス 33 認可サーバー クライアント リソース
 オーナー Web
 ブラウザ 請求書作成
 資料郵送 リソース
 サーバー ①リクエスト ③アクセス
  トークン
  検証 ④ユーザー情報やスコープ ⑥レスポンス⑦レスポンス ⑤スコープを
  チェック ②リソースにアクセス
 with アクセストークン GET https://リソースサーバー/foo/bar Authorization: Bearer アクセストークン
  34. 34. (C) CASAREAL, Inc. All rights reserved. #jsug #sf_h4 OAuth 2.0で未定義の部分 34 認可サーバー クライアント リソース
 オーナー Web
 ブラウザ 請求書作成
 資料郵送 リソース
 サーバー ①リクエスト ③アクセス
  トークン
  検証 ④ユーザー情報やスコープ ⑥レスポンス⑦レスポンス ⑤スコープを
  チェック ②リソースにアクセス
 with アクセストークン アクセストークンを
 送る部分以外は
 ほとんど未定義
  35. 35. (C) CASAREAL, Inc. All rights reserved. #jsug #sf_h4 アクセストークンやスコープの検証⽅法 A) 認可サーバーに問い合わせる(Basic認証など が必要) B) 共有データベースなどを利⽤する C) アクセストークン⾃⾝に情報を含めておく 35 ↑今回はコレ
  36. 36. (C) CASAREAL, Inc. All rights reserved. #jsug #sf_h4 JWT (JSON Web Token : ジョット) ▸ 平たく⾔うとアクセストークンの形式の⼀種 ▸ アクセストークン⾃⾝にユーザー情報やスコー プなどの情報を含めることができる ▸ 「.(ピリオド)」で3つの部分に分けられる ▸ それぞれの部分は、JSONをBase64URLでエンコード したもの 36
  37. 37. (C) CASAREAL, Inc. All rights reserved. #jsug #sf_h4 JWTの構造 37 eyJhbGciOiJSUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICJzbGcyMG9uOVg2c zZFOExmNDZfQmRuaExHQy1xZnIyMVlvWE9nQVFKRlIwIn0.eyJqdGkiOiI4YzUyN mMzZC03OTA0LTQ2MWItOGU5ZS1jNDE5YTQ1NmFlNDMiLCJleHAiOjE1Mzg4MTM0Mj YsIm5iZiI6MCwiaWF0IjoxNTM4ODEzMTI2LCJpc3MiOiJodHRwOi8vbG9jYWxob3N 0OjkwMDAvYXV0aC9yZWFsbXMvaGVsbG8tYXBpIiwiYXVkIjoidHJhaW5pbmc2LWZy b250LXNlcnZpY2UiLCJzdWIiOiIxYWI5Yjg4Ny0yNDRhLTRjZTktYTBjMy1iZTc2Z GE4NzZiMTQiLCJ0eXAiOiJCZWFyZXIiLCJhenAiOiJ0cmFpbmluZzYtZnJvbnQtc2 VydmljZSIsImF1dGhfdGltZSI6MCwic2Vzc2lvbl9zdGF0ZSI6IjA4MjU3OTFlLTE 3ODQtNGQxMC1hMjYyLTAzM2U4YmE3OWViMCIsImFjciI6IjEiLCJhbGxvd2VkLW9y aWdpbnMiOlsiaHR0cDovL2xvY2FsaG9zdDo4MDgwIl0sInJlYWxtX2FjY2VzcyI6e yJyb2xlcyI6WyJvZmZsaW5lX2FjY2VzcyIsInVtYV9hdXRob3JpemF0aW9uIl19LC JyZXNvdXJjZV9hY2Nlc3MiOnsiYWNjb3VudCI6eyJyb2xlcyI6WyJtYW5hZ2UtYWN jb3VudCIsIm1hbmFnZS1hY2NvdW50LWxpbmtzIiwidmlldy1wcm9maWxlIl19fSwi c2NvcGUiOiJoZWxsbzpyZWFkIHByb2ZpbGUiLCJwcmVmZXJyZWRfdXNlcm5hbWUiO iJ1c2VyIn0.fH8s3HaOFjC1CiZeWUP2O1AB2ruDPh9VRnFqSkRoM2zCTpqWgrkiQ BKW3r9RQAD_gsZCi3G7s0tQSCmuAMoht7gLgH9rFKzdKhuKiISeDUF7v2baPva8fH VN8zP1YF84XnVxq-zVThXLBdDgTRXWWI0_RG6x- vJVDRv00gvDwPPvA3WxxIGcekuEjl3ChQhFHozDiEglAlN- vlkDV2IvxVtON4GJ1UAwIj9uTpyAoIVY8oOy_0mMuevzxBSXk2HUxWr2Vrvhj3c2a RrchCOHPsDELtX0CmEBj_bU38d1XbHL30Ar7PWGvpPeSkM3mIykR- osPDSXJwq8gUSAda0JeQ ヘッダー ペイロード 電⼦署名
  38. 38. (C) CASAREAL, Inc. All rights reserved. #jsug #sf_h4 ペイロードをデコードすると 38※Powered by jwt.io スコープと ユーザー名
  39. 39. (C) CASAREAL, Inc. All rights reserved. #jsug #sf_h4 署名を利⽤したJWTの検証 ▸ リソースサーバーは、
 JWTの署名で検証する ▸ 署名は、認可サーバーの秘 密鍵で暗号化されている
 →認可サーバーの公開鍵で 復号化する 39 ※Powered by jwt.io
  40. 40. (C) CASAREAL, Inc. All rights reserved. #jsug #sf_h4 JWK (JSON Web Key) ▸ 認可サーバーの公開鍵 の素となる情報が含ま れたJSON ▸ 認可サーバーからJWK Set形式(JWKの配列を含んだ JSON)で取得する 40 JWK Set JWK ※具体的な検証⽅法は下記ブログが参考になります
  OpenID Connect の署名検証
  41. 41. (C) CASAREAL, Inc. All rights reserved. #jsug #sf_h4 JWTの弱点と対策 ▸ 弱点:アクセストークンの剥奪が不可能👎 ▸ リソースサーバーが認可サーバーに問い合わせしない ため、認可サーバー側での制御が不可能 ▸ 対策:アクセストークンの有効期限を短くする👌 ▸ だいたい数分間くらい ▸ 期限が切れたらリフレッシュトークンで再取得する 41
  42. 42. (C) CASAREAL, Inc. All rights reserved. #jsug #sf_h4 リフレッシュトークン ▸ アクセストークンを再取得するためのトークン ▸ アクセストークン取得時に⼀緒に受け取る 42 200 OK { "access_token":"アクセストークン", "expires_in":300, "refresh_token":"リフレッシュトークン" }
  43. 43. (C) CASAREAL, Inc. All rights reserved. #jsug #sf_h4 アクセストークンのリフレッシュ⽅法 43 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ではリフレッシュトークンも新しくなる)
  44. 44. (C) CASAREAL, Inc. All rights reserved. #jsug #sf_h4 ⽬次 ① OAuth 2.0の基本⽤語 ② アクセストークンの取得 ③ アクセストークンを利⽤した
 リソースアクセス ④ 認可サーバーの実装 ⑤ クライアントの実装 ⑥ リソースサーバーの実装 44
  45. 45. (C) CASAREAL, Inc. All rights reserved. #jsug #sf_h4 Spring SecurityのOAuth 2.0対応の歴史 ▸ 4.x以前 ▸ 姉妹ライブラリに
 機能が分散していた ▸ Spring Security OAuth2 ▸ Spring Cloud ▸ Spring Social... 45 ▸ 5.0以降 ▸ OAuth 2.0の機能を
 Spring Security
 本体に新規開発 ▸ Spring Security OAuth2はメンテナンス モードへ
 (バグフィックスは継続)
  46. 46. (C) CASAREAL, Inc. All rights reserved. #jsug #sf_h4 個⼈的な所⾒ ▸ Spring Security OAuth2は難しすぎる😇 ▸ ドキュメントが少ない ▸ Javadocがほとんど書いてない ▸ 似たような名前のプロパティが多い ▸ OAuth 2.0仕様で未定義な部分の独⾃実装が多い ▸ 作るべきConfigが多い 46
  47. 47. (C) CASAREAL, Inc. All rights reserved. #jsug #sf_h4 Spring Security 5のOAuth 2.0対応状況 47 機能 説明 クライアント 5.0で対応済み リソースサーバー 5.1で対応済み 認可サーバー 未対応(5.2以降?)
  48. 48. (C) CASAREAL, Inc. All rights reserved. #jsug #sf_h4 認可サーバーを作るには? A) Spring Security OAuth2を利⽤する B) 認可サーバー機能を持ったサービスを利⽤する C) Keycloakなど既成の認可サーバーを利⽤する 48 ↑今回はコレ ※Spring Security OAuth2の例は下記を参照
 https://github.com/Pivotal-Japan/spring-security-oauth-workshop
  49. 49. (C) CASAREAL, Inc. All rights reserved. #jsug #sf_h4 Keycloakとは ▸ OAuth2やOpenID Connectに 対応したシングルサインオン基 盤 ▸ Red Hat社がオープンソースで 開発 ▸ https://www.keycloak.org 49
  50. 50. (C) CASAREAL, Inc. All rights reserved. #jsug #sf_h4 Keycloakのインストールや設定など ▸ クライアント・ユーザー・スコープ等を設定 ▸ 詳細はブログに書きました ▸ OAuth 2.0 with Spring Security 5.1の認可サーバーとして Keycloakを使う 50
  51. 51. (C) CASAREAL, Inc. All rights reserved. #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 クライアントや リソースサーバーから アクセスする
  52. 52. (C) CASAREAL, Inc. All rights reserved. #jsug #sf_h4 トークンのレスポンス 52 200 OK { "access_token" : "JWT形式のアクセストークン", "expires_in" : 有効時間(秒単位), "refresh_expires_in" : 有効時間(秒単位), "refresh_token" : "JWT形式のリフレッシュトークン", "scope" : "scope1 scope2 scope3 ...", ... }
  53. 53. (C) CASAREAL, Inc. All rights reserved. #jsug #sf_h4 ⽬次 ① OAuth 2.0の基本⽤語 ② アクセストークンの取得 ③ アクセストークンを利⽤した
 リソースアクセス ④ 認可サーバーの実装 ⑤ クライアントの実装 ⑥ リソースサーバーの実装 53
  54. 54. (C) CASAREAL, Inc. All rights reserved. #jsug #sf_h4 依存性 54 <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>
  55. 55. (C) CASAREAL, Inc. All rights reserved. #jsug #sf_h4 application.yml 55 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派です
  56. 56. (C) CASAREAL, Inc. All rights reserved. #jsug #sf_h4 application.yml(続き) 56 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は任意)
  57. 57. (C) CASAREAL, Inc. All rights reserved. #jsug #sf_h4 Java Config 57 @EnableWebSecurity public class SecurityConfig extends WebSecurityConfigurerAdapter { @Override protected void configure(HttpSecurity http) throws Exception { ... http.oauth2Login() .loginPage("/login") .permitAll(); ... } } OAuth2Loginを有効化
  58. 58. (C) CASAREAL, Inc. All rights reserved. #jsug #sf_h4 ログイン画⾯ 58 <html ...> <head>...</head> <body> <h1>OAuth2ログインページ</h1> <a th:href="@{/oauth2/authorization/todo}"> Keycloakでログイン </a> </body> </html> /oauth2/authorization/provider名
  59. 59. (C) CASAREAL, Inc. All rights reserved. #jsug #sf_h4 アーキテクチャー概要 59 メモリ OAuth2AuthorizedClient OAuth2
 Access
 Token OAuth2
 Refresh
 Token OAuth2AuthorizedClient OAuth2
 Access
 Token OAuth2
 Refresh
 Token ・・・ OAuth2
 Authorized
 Client
 Service ※Spring Bootを利⽤している場合、
  OAuth2AuthorizedClientServiceは
  Bean定義済になっています 取得・削除・追加
  60. 60. (C) CASAREAL, Inc. All rights reserved. #jsug #sf_h4 アクセストークンの取得 60 @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();
  61. 61. (C) CASAREAL, Inc. All rights reserved. #jsug #sf_h4 リソースサーバーにアクセス 61 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);
  62. 62. (C) CASAREAL, Inc. All rights reserved. #jsug #sf_h4 Spring WebFluxでは… ▸ WebClientだと、アクセストークンのヘッダー への追加やリフレッシュを⾃動的にやってくれ るらしい(未検証) ▸ https://docs.spring.io/spring-security/site/docs/ current/reference/htmlsingle/#servlet-webclient 62
  63. 63. (C) CASAREAL, Inc. All rights reserved. #jsug #sf_h4 ログアウト ▸ 必要に応じて認可サーバー からもログアウトする ▸ 認可サーバーのログアウト 処理はLogoutHandlerで実 装する 63 請求書作成
 資料郵送 クライアント リソースサーバー 認可サーバー ログアウト ログアウト
  64. 64. (C) CASAREAL, Inc. All rights reserved. #jsug #sf_h4 Keycloakからのログアウト ▸ ログアウトエンドポイントにPOSTでアクセス ▸ 必要なリクエストパラメーターは下記3つ ① クライアントID ② クライアントシークレット ③ リフレッシュトークン 64
  65. 65. (C) CASAREAL, Inc. All rights reserved. #jsug #sf_h4 LogoutHandlerの実装 65 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); }; } ※リフレッシュトークンなどの取得方法はソースコード参照
  66. 66. (C) CASAREAL, Inc. All rights reserved. #jsug #sf_h4 LogoutHandlerの実装 66 @EnableWebSecurity public class SecurityConfig extends WebSecurityConfigurerAdapter { @Override protected void configure(HttpSecurity http) throws Exception { ... http.logout() .addLogoutHandler(logoutHandler()) .invalidateHttpSession(true) .permitAll(); ... } } 作成したLogoutHandlerを追加
  67. 67. (C) CASAREAL, Inc. All rights reserved. #jsug #sf_h4 ⽬次 ① OAuth 2.0の基本⽤語 ② アクセストークンの取得 ③ アクセストークンを利⽤した
 リソースアクセス ④ 認可サーバーの実装 ⑤ クライアントの実装 ⑥ リソースサーバーの実装 67
  68. 68. (C) CASAREAL, Inc. All rights reserved. #jsug #sf_h4 依存性 68 <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>
  69. 69. (C) CASAREAL, Inc. All rights reserved. #jsug #sf_h4 application.yml 69 spring.security.oauth2.resourceserver.jwt: jwk-set-uri: JWK Setが返ってくるURL issuer-uri: 認可サーバーのIssuer Identifier ※Keycloakの場合、issuer-uriを指定すればjwk-set-uriは指定不要
  70. 70. (C) CASAREAL, Inc. All rights reserved. #jsug #sf_h4 JWK Setの取得フロー ① 起動時にissuer_uriで指定されたURLにリク エストを送信する ② レスポンスJSONのjwks_uri属性をJWK Set を取得するURLとする ③ クライアントからの初回アクセス時にJWK Set をリクエストする 70
  71. 71. (C) CASAREAL, Inc. All rights reserved. #jsug #sf_h4 Java Config 71 @EnableWebSecurity public class SecurityConfig extends WebSecurityConfigurerAdapter { @Override protected void configure(HttpSecurity http) throws Exception { ... http.authorizeRequests() .mvcMatchers("保護対象のURL") .hasAuthority("SCOPE_スコープ名") ...; http.oauth2ResourceServer() .jwt(); ... } }
  72. 72. (C) CASAREAL, Inc. All rights reserved. #jsug #sf_h4 最後に 72
  73. 73. (C) CASAREAL, Inc. All rights reserved. #jsug #sf_h4 OAuth 2.0のセキュリティ考慮事項 ▸ 秘匿情報が⾶び交うためHTTPS必須 ▸ その他、必ずOAuth 2.0仕様書をチェックしましょ う! ▸ 10.6 認可コードリダイレクトURIの操作 ▸ 10.11 フィッシングアタック ▸ 10.12 クロスサイトリクエストフォージェリ
 ・・・など 73
  74. 74. (C) CASAREAL, Inc. All rights reserved. #jsug #sf_h4 セキュリティ関連の別の仕様書 ▸ RFC 6819 - OAuth 2.0 Threat Model and Security Considerations ▸ RFC 7009 : OAuth 2.0 Token Revocation 74
  75. 75. (C) CASAREAL, Inc. All rights reserved. #jsug #sf_h4 まとめ ▸ まずはOAuth 2.0そのものの理解が⼤事 ▸ Spring Security 5.1はクライアント機能と
 リソースサーバー機能に対応 ▸ 認可サーバーはSpring Security 5.2以降 ▸ 現時点ではSpring Security OAuth2、既存のサービス、
 既成の認可サーバーのいずれかを使う 75
  76. 76. (C) CASAREAL, Inc. All rights reserved. #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
  77. 77. (C) CASAREAL, Inc. All rights reserved. #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⽇ 77 https://www.casareal.co.jp/ls/service/openseminar/java
  78. 78. (C) CASAREAL, Inc. All rights reserved. #jsug #sf_h4 アンケート、お願いします! 78 アンケートへのリンク
  79. 79. (C) CASAREAL, Inc. All rights reserved. #jsug #sf_h4 Enjoy OAuth 2.0 & Spring Security 5.1!! ▸ ご清聴ありがとうございました! 79

×