認証・認可における
Keycloakの活用
株式会社カサレアル
プロフェッショナルソリューション第1技術部
山本 薫
© CASAREAL, Inc. All rights reserved.
アジェンダ
• カサレアルについて
• 認証・認可とその課題
• OAuth/OpenID Connectについて
• 認証・認可の流れ
• Keyclaokの利用
• 動作確認(デモ)
• まとめ
© CASAREAL, Inc. All rights reserved.
カサレアルについて
© CASAREAL, Inc. All rights reserved.
株式会社カサレアル
© CASAREAL, Inc. All rights reserved.
ラーニングサービス
技術者育成
オープン研修
カスタムメイド研修
新入社員研修
技術定着化ワークショップ
オリジナル教材販売
プロフェッショナル
サービス
クラウドネイティブ推進支援
GitLabソリューション
導入トレーニング
クラウドネイティブ
推進支援サービス
ビジネスソリューション
サービス
受託開発・SES
システム構築サービス
開発支援サービス
パッケージサービス
認証・認可とその課題
© CASAREAL, Inc. All rights reserved.
認証と認可について
• 認証(Authentication)
• システムを利用する対象を特定し本物であることを検証すること
• 認可(Authorization)
• リソースに対するアクセス権があるか判断し許可/拒否すること
© CASAREAL, Inc. All rights reserved.
アプリケーションにおけるセキュリティー確保の
もっとも基本的な機能
これまでのアプリケーション
© CASAREAL, Inc. All rights reserved.
アプリケーション データベース
1つのアプリケーションだけで認証・認可を実現
良くも悪くもすべてコントロール可能
認証・認可 認証情報
しかし、最近のアプリケーションは…
© CASAREAL, Inc. All rights reserved.
サービス
3rd Party
サービス
サービス
サービス
SPA(Single Page Application)や
マイクロサービス・アーキテクチャーの普及により
高度な分散システムへ
SPA
認証・認可の課題(その1)
© CASAREAL, Inc. All rights reserved.
すべてのサービスに直接アクセスさせるのは危険!
それぞれのサービスでアカウント管理するのも無駄!
集中管理するサービスが必要
どこに配置して
誰が管理する?
認証情報
認証・認可の課題(その2)
© CASAREAL, Inc. All rights reserved.
サービス
3rd Party
ユーザーのクレデンシャルを渡すのは論外!
認証・認可されたことを表現する情報が必要
どのようにして
第三者にアクセスを
許可する?
認証・認可の課題(その3)
© CASAREAL, Inc. All rights reserved.
サービス
3rd Party
サービス
サービス
サービス
平文での受け渡しは危険!
偽装・漏洩・改ざんされない仕組みが必要
SPA どのようにして
認証・認可の情報
を安全に受け渡す?
課題を解決するために
• シングル・サイン・オン(SSO)
• 1回の認証で複数のシステムを利用可能にするソリューション
• 標準規格としてSAMLとOAuth/OpenID Connectが存在
• SAML(Security Assertion Markup Language)
• XMLをベースとした認証・認可方式を提供
• 長い歴史があり社内システムを中心に多くのシステムで採用
• しかし、現在のWebシステムには重厚すぎると感じている人が多い
© CASAREAL, Inc. All rights reserved.
⇨ OAuth/OpenID Connectの採用が広まる
OAuth/OpenID Connect
について
© CASAREAL, Inc. All rights reserved.
OAuthとは?
• 3rd Partyアプリケーションに対する認可の標準規格
• RFC6749: The OAuth 2.0 Authorization Framework、etc.
• 特徴
• アクセス・トークン(認可情報)の発行・受け渡しについて規定
• 認可コード・フローなど、目的に応じた複数のフローを定義
• 注意すべき点
• 認証については扱っていない
• 現在、OAuth 2.1の仕様策定が進行中(非推奨・削除項目あり)
© CASAREAL, Inc. All rights reserved.
一目でわかるOAuth
© CASAREAL, Inc. All rights reserved.
SNS Z
次のアプリケーションが連携を求めています。
許可しますか?
チャット・ボットα
• プロフィールの読み取り
• 連絡先の読み取り
• メッセージの投稿
はい いいえ
OpenID Connectとは?
• 複数サービスにまたがる認証・認可に関する標準規格
• OpenID Connect Core 1.0
• OpenID Connect Discovery 1.0
• OpenID Connect Session Management 1.0
• etc.
• 特徴
• OAuth 2.0を拡張
• 認証フローやIDトークン(認証情報)の発行・受け渡しについて定義
• IDトークンの形式にJWTを採用
© CASAREAL, Inc. All rights reserved.
一目でわかるOpenID Connect
© CASAREAL, Inc. All rights reserved.
SNS Z
サイン・イン
ユーザーID
パスワード
または次でサイン・インします
Google
GitLab
JWTとは?
• JSONをベースとしたトークン形式の標準規格
• RFC7519: JSON Web Token (JWT)
• RFC7515: JSON Web Signature (JWS)
• RFC7516: JSON Web Encryption (JWE)
• RFC7517: JSON Web Key (JWK)
• RFC7518: JSON Web Algorithms (JWA)
• 特徴
• 様々な情報を含むトークンをコンパクトな文字列表現として扱える
• 暗号化や署名により偽装や改ざんが困難
© CASAREAL, Inc. All rights reserved.
一目でわかるJWT
© CASAREAL, Inc. All rights reserved.
https://jwt.io/
認証・認可の流れ
© CASAREAL, Inc. All rights reserved.
OAuth 2.0で定義されているフロー
• 認可コード・フロー
• インプリシット・フロー
• リソース・オーナー ・パスワード・クレデンシャル・フロー
• クライアント・クレデンシャル・フロー
• デバイス・フロー
© CASAREAL, Inc. All rights reserved.
非推奨
OpenID Connectで定義されているフロー
• 認可コード・フロー
• インプリシット・フロー
• ハイブリッド・フロー
• CIBA(Client-Initiated Backchannel Authentication)フロー
© CASAREAL, Inc. All rights reserved.
今回はOIDC認可コード・フローを利用して
SPAがWeb APIを呼び出す流れを説明します
非推奨
まずは用語について
• 登場人物
• エンド・ユーザー
• システムを利用する人
• OpenIDプロバイダー
• 認証を行い各種トークンを発行す
るサーバー
• クライアント(Relying Party)
• 認証やトークンを要求するアプリ
ケーション
• リソース・サーバー
• リソースを提供するサーバー
• やり取りされる情報
• 認可コード
• クライアントがエンド・ユーザー
により認可されたことを示す情報
• IDトークン
• 認証されたエンド・ユーザーに関
する情報
• アクセス・トークン
• クライアントに与えられたアクセ
ス権を示す情報
• リフレッシュ・トークン
• 有効期限が切れたアクセス・トー
クンを更新するために必要な情報
© CASAREAL, Inc. All rights reserved.
認証・認可の流れ(アプリケーション実行)
© CASAREAL, Inc. All rights reserved.
OpenID
プロバイダー
クライアント
(Webサーバー)
リソース
・サーバー
(Web API)
Webブラウザー
クライアント
(SPA)
URL
認証情報
認証・認可の流れ(ユーザー認証の要求)
© CASAREAL, Inc. All rights reserved.
OpenID
プロバイダー
クライアント
(Webサーバー)
リソース
・サーバー
(Web API)
Webブラウザー
クライアント
(SPA)
サイン・イン
・ページ
An Req
※An Req = 認証リクエスト(クライアントID、リダイレクトURI、レスポンス・タイプ、スコープ、etc.)
An Req
認証情報
認証・認可の流れ(認証と認可コード発行)
© CASAREAL, Inc. All rights reserved.
クライアント
(Webサーバー)
リソース
・サーバー
(Web API)
Webブラウザー
クライアント
(SPA)
サイン・イン
・ページ
OpenID
プロバイダー
Az Code
Az Code
※Az Code = 認可コード
An Req
認証情報
認証・認可の流れ(各種トークンの取得)
© CASAREAL, Inc. All rights reserved.
OpenID
プロバイダー
クライアント
(Webサーバー)
リソース
・サーバー
(Web API)
Webブラウザー
クライアント
(SPA)
Az Code
ID Token
Ac Token
Ref Token
※ID Token = IDトークン、Ac Token = アクセス・トークン、Ref Token = リフレッシュ・トークン
ID Ac Ref
認証情報
Az Code
認証・認可の流れ(リソースへのアクセス)
© CASAREAL, Inc. All rights reserved.
OpenID
プロバイダー
リソース
・サーバー
(Web API)
Webブラウザー
クライアント
(SPA)
Ac Token Ac Token
ID Ac Ref
認証情報
リソース
認証・認可の流れ(トークンの更新)
© CASAREAL, Inc. All rights reserved.
OpenID
プロバイダー
クライアント
(Webサーバー)
リソース
・サーバー
(Web API)
Webブラウザー
クライアント
(SPA)
Ref Token
Ac Token
Ref Token
※ID Token = IDトークン、Ac Token = アクセス・トークン、Ref Token = リフレッシュ・トークン
ID Ac Ref
New!
認証情報
Keyclaokの利用
© CASAREAL, Inc. All rights reserved.
サンプル・アプリケーションの構成
© CASAREAL, Inc. All rights reserved.
OpenID
プロバイダー
クライアント
(Webサーバー)
リソース
・サーバー
(Web API)
Webブラウザー
クライアント
(SPA)
認証情報
サイン・イン
・ページ
Keycloakとは?
• オープン・ソースのOpenIDプロバイダー
• CNCFインキュベーション・プロジェクトとして開発されている
• Red Hat社による強力なサポートにより人気が高い
• OAuth/OpenID ConnectおよびSAMLをサポート
• OpenID ConnectにおいてはFinancial-grade API (FAPI)認定
• クラウド・ネイティブに対応
• Java + Quarkusで実装
• コンテナ・イメージとして利用可能
© CASAREAL, Inc. All rights reserved.
Keycloakの実行(Docker Compose)
© CASAREAL, Inc. All rights reserved.
services:
keycloak:
image: quay.io/keycloak/keycloak:25.0.1
ports:
- "8080:8080"
restart: always
environment:
KEYCLOAK_ADMIN: admin
KEYCLOAK_ADMIN_PASSWORD: P@ssw0rd
command: start-dev
/keycloak-sample/compose.yaml
$ cd keycloak-sample
keycloak-sample $ docker compose up -d
Docker Compose
を利用すれば
簡単に実行できる
(※開発モード)
レルムの作成
• レルムとは?
• 同一の認証情報で
管理できる範囲のこと
• レルムの中にユーザーや
ロール、クライアント
などを登録する
© CASAREAL, Inc. All rights reserved.
クライアントの登録
• クライアントID
• クライアント・タイプ
• コンフィデンシャル・アクセス
• パブリック・アクセス
• 認証フロー
• 各種OAuth/OIDCのフロー
• 各種URI
• 有効なリダイレクトURI
• Webオリジン
• etc.
© CASAREAL, Inc. All rights reserved.
ロールの作成
• ロールの種類
• レルム・ロール
• クライアント・ロール
© CASAREAL, Inc. All rights reserved.
ユーザーとグループの作成
© CASAREAL, Inc. All rights reserved.
ロールの割り当て
• 割り当て対象
• グループ
• ユーザー
• 他のロール
© CASAREAL, Inc. All rights reserved.
クライアント・スコープの作成
• リソースのアクセス範囲を表現
• OIDC:プロフィール、メール・アドレス、住所、etc.
• OAuth:例)項目の参照、項目の編集、etc.
• 目的に応じて権限の付与方法が異なる
• ユーザーの権限:ロール(およびクライアント)に関連づける
• クライアントの権限:クライアントに関連づける
• マッパーを利用してトークンにその他の情報を追加
© CASAREAL, Inc. All rights reserved.
Spring Bootの実装(リソース・サーバー)
© CASAREAL, Inc. All rights reserved.
依存関係に
OAuth2 Resource
Serverを追加
Spring Bootの実装(リソース・サーバー)
© CASAREAL, Inc. All rights reserved.
spring:
security:
oauth2:
resourceserver:
jwt:
issuer-uri: http://localhost:8080/realms/todo
application.yaml
アプリケーション設定ファイルに
レルムのベースURIを記述
Spring Bootの実装(リソース・サーバー)
© CASAREAL, Inc. All rights reserved.
@Configuration
@EnableWebSecurity
@EnableMethodSecurity
public class SecurityConfig {
@Bean
public SecurityFilterChain securityFilterChain(HttpSecurity httpSecurity)
throws Exception {
httpSecurity
.authorizeHttpRequests(authorize -> authorize
.anyRequest().authenticated())
.oauth2ResourceServer(oauth2 -> oauth2.jwt(Customizer.withDefaults()));
return httpSecurity.build();
}
}
SecurityConfig.java
JWT Bearerトークンを
検証するように構成
Spring Bootの実装(リソース・サーバー)
© CASAREAL, Inc. All rights reserved.
@RestController
@RequestMapping("/todos")
public class TodoController {
@GetMapping
@PreAuthorize("hasAuthority('SCOPE_todo:view')")
public List<Todo> getAll() {
return todos;
}
}
TodoController.java コントローラーのメソッドに
アノテーションを付与して
JWTのスコープを検証
JavaScriptの実装(SPAクライアント)
© CASAREAL, Inc. All rights reserved.
"dependencies": {
"keycloak-js": "^25.0.1",
"vue": "^3.4.29"
},
package.json
依存関係にkeycloak-js
(Keycloak公式JavaScript
アダプター)を追加
JavaScriptの実装(SPAクライアント)
© CASAREAL, Inc. All rights reserved.
const keycloak = new Keycloak({
url: ‘http://localhost:8080',
realm: 'todo',
clientId: 'todo-client',
});
keycloak.init({
onLoad: 'check-sso’,
checkLoginIframe: false,
}).then(authenticated => {
console.log(`User is ${authenticated ? 'authenticated' : 'not authenticated'}`);
console.log(`Access Token is ${keycloak.token}`);
}).catch(error => {
console.error('Failed to initialize adapter:', error);
});
OpenIDConnect.js
OpenIDプロバイダーに
関する情報を指定して
オブジェクトを生成
初期化と同時に
ログイン・チェック
JavaScriptの実装(SPAクライアント)
• Keycloakオブジェクトの主要なプロパティ/メソッド
• login() : ログインを開始する
• logout() : ログアウトする
• updateToken() : 期限切れトークンを更新する
• authenticated : 認証済み or 未認証
• token : アクセス・トークン
• idToken : IDトークン
• onTokenExpired : アクセス・トークン期限切れイベント・ハンド
ラー
• etc.
© CASAREAL, Inc. All rights reserved.
JavaScriptの実装(SPAクライアント)
© CASAREAL, Inc. All rights reserved.
fetch(`${apiBaseUrl}/todos`, {
headers: {
'Authorization': `Bearer ${keycloak.token}`
}
}).then(response => {
if (response.ok) {
return response.json();
} else {
throw new Error(`API fetch failed.(status = ${response.status})`);
}
}).then(data => {
items.value = data;
}).catch(error => {
console.error('Failed to initialize adapter:', error);
});
OpenIDConnect.js
Authorizationヘッダーに
Bearerトークンとして
アクセス・トークンを指定
まとめ
© CASAREAL, Inc. All rights reserved.
まとめ
• OAuth/OpenID Connectは認証・認可の標準規格
• 分散Webシステムの認証・認可として広く普及
• Keycloakを利用すればOpenIDプロバイダーを簡単に利用可能
• 各種プログラミング言語のサポートも充実
© CASAREAL, Inc. All rights reserved.
© CASAREAL, Inc. All rights reserved.
ご清聴ありがとうございました。
© CASAREAL, Inc. All rights reserved.
〒108-0075
東京都港区港南1-2-70品川シーズンテラス 24階
営業部 ソリューション営業課
03-4405-7866 (9:00~17:00)
お問い合わせは下記へお気軽にご連絡ください。

株式会社カサレアル 山本による講演「認証・認可におけるKeycloakの活用」の資料