🔑

OAuth 2.0・OIDCを試すためにKeycloakへ入門する

2021/02/12に公開

起動

KeycloakはDockerイメージが公開されているので、それを使うことにします。

環境変数で管理ユーザーのユーザー名とパスワードを設定しつつコンテナを起動します。

docker run --name kc -d -p 8080:8080 -e KEYCLOAK_USER=admin \
  -e KEYCLOAK_PASSWORD=secret jboss/keycloak

起動までは少し時間がかかります。
WFLYSRV0025: Keycloak 10.0.2 (WildFly Core 11.1.1.Final) started in 17835msといったログが出力されれば起動完了です。

クライアント(RP)の設定をする

管理画面へログインしてOAuth 2.0のクライアント(OIDCで言うRP)の設定をします。

http://localhost:8080 を開いて「Administration Console」というリンクを辿ります。
辿った先でユーザー名とパスワードを要求されるのでKeycloak起動時に設定した値を入力してログインします。

ログインできたらまずはレルムを追加します(最初はMasterレルムしかありません)。
Masterと書かれたドロップダウンにフォーカスすると「Add realm」というボタンが表示されるので押します。
適当な名前を付けて「Create」ボタンを押します。
ここではdemoという名前にしました。

Masterと書かれたドロップダウンがあった位置を確認するとDemoに変わっているはずです。
これでDemoレルムが作られました。

次にメニューから「Clients」を選択します。
それから「Create」ボタンを押して任意のClient IDを付けて「Save」を押します。

クライアントが作られ、詳細な設定画面へ移ります。
私がよく設定する項目だけ解説します。

「Access Type」はデフォルトではpublicになっています。
これはOAuth 2.0のクライアントタイプへ対応した名前になっているのだと思います。
publicは認可コードとアクセストークンの交換時にクライアントシークレットを必要としません。
クライアントシークレットを要求したい場合は「Access Type」をconfidentialに変更してください。
なお「Access Type」をconfidentialにして保存した(「Save」を押した)場合、「Credentials」というタブが表示され、クライアントシークレットの確認・再生成が行えるようになります。

「Valid Redirect URIs」には認可後リダイレクトされるURIを入力します。
リダイレクトURIを動的に指定したい場合のために「Valid Redirect URIs」へ設定するURIはhttp://example.com/*というふうにワイルドカードが使えます。

ユーザーを追加する

テスト用にユーザーを追加します。

メニューから「Users」を選択して「Add user」ボタンを押します。
「Username」を入力して「Save」を押します。
ユーザーの詳細な設定が行えるようになるので、「Credentials」タブを開いてパスワードを入力します。
「Temporary」をOFFにして「Set password」を押します。

これでユーザーの追加ができました。

設定をエクスポートして再利用する

次のコマンドでここまで行ったレルムの設定をエクスポートできます。

docker exec -it kc /opt/jboss/keycloak/bin/standalone.sh \
  -Djboss.socket.binding.port-offset=100 \
  -Dkeycloak.migration.action=export \
  -Dkeycloak.migration.provider=singleFile \
  -Dkeycloak.migration.realmName=demo \
  -Dkeycloak.migration.usersExportStrategy=REALM_FILE \
  -Dkeycloak.migration.file=/tmp/demo_realm.json

コマンドを実行するとKeycloakがもうひとつ起動します(そのためポートが重複しないようオフセットを設定してズラしています)。
起動する過程でエクスポートは行われているので、起動を確認したらすぐに停止しても大丈夫です。

エクスポートしたファイルはDockerコンテナの中にあるのでdocker cpで取り出します。

docker cp kc:/tmp/demo_realm.json .

このファイルをDockerコンテナへマウントして、Keycloak起動時にインポートできます。
冒頭で起動したKeycloakのDockerコンテナを停止、削除してから次のコマンドで改めて起動してください。

docker run --name kc -d -p 8080:8080 -e KEYCLOAK_USER=admin \
  -e KEYCLOAK_PASSWORD=secret -e KEYCLOAK_IMPORT=/tmp/demo_realm.json \
  -v $(pwd)/demo_realm.json:/tmp/demo_realm.json jboss/keycloak

起動したKeycloakはこれまで設定したDemoレルムがインポートされているはずです。

OIDC認証で必要となる情報を確認する

KeycloakはOpenID Connect Discovery 1.0をサポートしているため、認可エンドポイントURLやトークンエンドポイントURLに代表されるOIDC認証で必要となる情報をJSON形式で取得できます。

curl -s http://localhost:8080/auth/realms/demo/.well-known/openid-configuration | jq

これでOAuth 2.0・OIDCを試す準備が整いました。

以上です。

Discussion