Keycloak を用いた簡単な SSO 認証

Yellow lock icon with a black keyhole in the center on a bright yellow background, symbolizing security

こんにちは!サイオステクノロジーの貝野です。
今回は、keycloak を用いて簡単な SSO 認証を行うまでの手順をご紹介します。
keycloak を使うと様々なアプリケーションとやサービスと連携することができますが、今回は簡単なテストアプリを用いて SSO 認証を実現してみます。

環境構成・インストール

下記の構成で keycloak の構築を行いました。
テストアプリは python

  • OS:RHEL9 (AWS 上)
  • keycloak のバージョン:26.6.63 (検証時点での最新バージョン)
  • Java のバージョン:OpenJDK21

またインストールの手順については、過去の記事 (keycloak インストール時につまずいた話) にてご紹介しているため、こちらも併せて見ていただければと思います。

簡単な手順としては、下記の通りとなります。

  1. Java 関連パッケージ (openjdk および openjdk-devel) をインストール
  2. https://www.keycloak.org/downloads から keycloak (tar.gz 形式) をダウンロード
  3. ダウンロードしたパッケージを、任意のディレクトリ配下に展開
  4. # tar -xvf keycloak-26.6.63.tar.gz -C 
    
  5. bin/kc.sh bootstrap-admin user で管理者アカウント作成
  6. bin/kc.sh start-dev を実行
  7. http://[ホスト名もしくは IP アドレス]:8080/admin へアクセス
    ※4 で作成したユーザ名とパスワードでログイン

レルムの作成

Keycloak では、レルムという単位でユーザ、アプリケーションを管理します。
デフォルトでは master というレルムがありますが、今回はテストアプリ用に新しいレルムを作成します。

  1. 画面左側より Manager realms → Create realm を押下します。
  2. Realm name に新しく作成するレルム名を入力し、Create を押下します。
  3. 1 の画面に戻るため、今作成したレルムが追加されていることを確認します。

ユーザの作成

新しく作成されたレルムにはユーザが存在しません。
そこで、新しくユーザを作成します。

  1. 画面左側より Users → Create new user を押下します。
    ※左上の Current realm が、先ほど作成したレルムになっているか確認して下さい。
  2. Username を入力し、Create を押下します。
  3. 保存が完了したら、下記の様な画面が表示されます。
    次に、Credentials タブを押下します。
  4. Set password を押下します。
  5. パスワードを設定し、Save を押下します。

keycloak の設定 (クライアントの作成)

テストアプリ用に新しいクライアントを作成します。

  1. 画面左側より Clients → Create client を押下します。
    ※左上の Current realm が、先ほど作成したレルムになっているか確認して下さい。
  2. Client ID、Name (任意) を入力し、Next を押下します。
  3. Client Authentication を ON にし、Next を押下します (テストアプリが keycloak に対しクライアント認証を行うために必要な設定となります)。
  4. 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)
  5. 保存が完了したら、下記の様な画面が表示されます。

    【ここからテストアプリ用の作業】
    次に、Credentials タブを押下します。

  6. Client Secret の内容をコピーします。
    デフォルトでは非表示となっているため、目のマークを押下して内容を表示します (コピーした内容は、後ほどテストアプリで使用します)。
    Keycloak Admin Console: Client details page opened to the Credentials tab; Client Secret is masked, with an eye icon to reveal or copy and a Regenerate button nearby.

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!」の画面が表示されれば、認証成功です!

ご覧いただきありがとうございます! この投稿はお役に立ちましたか?

役に立った 役に立たなかった

0人がこの投稿は役に立ったと言っています。
エンジニア募集中!

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です