こんにちは!サイオステクノロジーの貝野です。
今回は、keycloak を用いて簡単な SSO 認証を行うまでの手順をご紹介します。
keycloak を使うと様々なアプリケーションとやサービスと連携することができますが、今回は簡単なテストアプリを用いて SSO 認証を実現してみます。
環境構成・インストール
下記の構成で keycloak の構築を行いました。
テストアプリは python
- OS:RHEL9 (AWS 上)
- keycloak のバージョン:26.6.63 (検証時点での最新バージョン)
- Java のバージョン:OpenJDK21
またインストールの手順については、過去の記事 (keycloak インストール時につまずいた話) にてご紹介しているため、こちらも併せて見ていただければと思います。
簡単な手順としては、下記の通りとなります。
- Java 関連パッケージ (openjdk および openjdk-devel) をインストール
- https://www.keycloak.org/downloads から keycloak (tar.gz 形式) をダウンロード
- ダウンロードしたパッケージを、任意のディレクトリ配下に展開
- bin/kc.sh bootstrap-admin user で管理者アカウント作成
- bin/kc.sh start-dev を実行
- http://[ホスト名もしくは IP アドレス]:8080/admin へアクセス
※4 で作成したユーザ名とパスワードでログイン
# tar -xvf keycloak-26.6.63.tar.gz -C
レルムの作成
Keycloak では、レルムという単位でユーザ、アプリケーションを管理します。
デフォルトでは master というレルムがありますが、今回はテストアプリ用に新しいレルムを作成します。
- 画面左側より Manager realms → Create realm を押下します。

- Realm name に新しく作成するレルム名を入力し、Create を押下します。

- 1 の画面に戻るため、今作成したレルムが追加されていることを確認します。

ユーザの作成
新しく作成されたレルムにはユーザが存在しません。
そこで、新しくユーザを作成します。
- 画面左側より Users → Create new user を押下します。
※左上の Current realm が、先ほど作成したレルムになっているか確認して下さい。

- Username を入力し、Create を押下します。

- 保存が完了したら、下記の様な画面が表示されます。
次に、Credentials タブを押下します。

- Set password を押下します。

- パスワードを設定し、Save を押下します。

keycloak の設定 (クライアントの作成)
テストアプリ用に新しいクライアントを作成します。
- 画面左側より Clients → Create client を押下します。
※左上の Current realm が、先ほど作成したレルムになっているか確認して下さい。

- Client ID、Name (任意) を入力し、Next を押下します。

- Client Authentication を ON にし、Next を押下します (テストアプリが keycloak に対しクライアント認証を行うために必要な設定となります)。

- Valid redirect URIs、Web origins をそれぞれ下記のように入力し、Save を押下します。
・Valid redirect URIs: http://xxx.xxx.xxx.xxx:5000/callback
(認証時のリダイレクト先 URL)
・Web origins: http://xxx.xxx.xxx.xxx:5000
(keycloak へのリクエストを許可する URL)

- 保存が完了したら、下記の様な画面が表示されます。
【ここからテストアプリ用の作業】
次に、Credentials タブを押下します。

- Client Secret の内容をコピーします。
デフォルトでは非表示となっているため、目のマークを押下して内容を表示します (コピーした内容は、後ほどテストアプリで使用します)。

Credentials
テスト用アプリ (app.py) の作成
app.py というファイルを作成し、下記の内容を記述します。
★行を、任意の内容に変更してください。
from flask import Flask, url_for, session, redirect
from authlib.integrations.flask_client import OAuth
app = Flask(__name__)
app.secret_key = 'random-secret-string'
# --- 設定項目 ---
KEYCLOAK_IP = "xxx.xxx.xxx.xxx" ★IP アドレス
CLIENT_ID = "testapp1" ★アプリの名称
CLIENT_SECRET = "xxxxxxxxxxxxxxxxxxxxxxx" ★コピーした Client secret の内容
REALM = "test realm1" ★作成したレルム名
# ----------------
oauth = OAuth(app)
keycloak = oauth.register(
name='keycloak',
client_id=CLIENT_ID,
client_secret=CLIENT_SECRET,
server_metadata_url=f'http://{KEYCLOAK_IP}:8080/realms/{REALM}/.well-known/openid-configuration',
client_kwargs={'scope': 'openid profile email'},
)
@app.route('/')
def index():
user = session.get('user')
if user:
return f'Hello, {user["name"]} !!ログアウト'
return 'テストアプリKeycloakでログイン'
@app.route('/login')
def login():
redirect_uri = url_for('auth', _external=True)
return keycloak.authorize_redirect(redirect_uri)
@app.route('/callback')
def auth():
token = keycloak.authorize_access_token()
session['user'] = token.get('userinfo')
return redirect('/')
@app.route('/logout')
def logout():
session.pop('user', None)
return redirect('/')
if __name__ == '__main__':
app.run(port=5000)
動作確認
ターミナルで、上記で作成したアプリを起動します。
# python app.py * Serving Flask app 'app' * Debug mode: off WARNING: This is a development server. Do not use it in a production deployment. Use a production WSGI server instead. * Running on all addresses (0.0.0.0) * Running on http://127.0.0.1:5000 * Running on http://xxx.xxx.xxx.xxx:5000 Press CTRL+C to quit
http://xxx.xxx.xxx.xxx:5000 と入力すると、下記の画面が表示されます。
※xxx.xxx.xxx.xxx には IP アドレス等を入力してください。

Username or email、Password に、先ほど作成したユーザ、パスワードをそれぞれ入力し、Sign In を押下します。

※初回ログイン時、パスワード変更の画面が表示されます。
この動作はユーザ作成時の設定によって異なる場合がありますが、この点についての詳細は別の記事で説明させていただきます。

同様に、ユーザのアカウント情報をアップデートする旨の画面が表示されるため、Email、First name、Last name をそれぞれ入力し、Submit を押下します。

下記の「Login success!」の画面が表示されれば、認証成功です!


