😸

Keycloak でクライアント認証方式 private_key_jwt をためす

2024/08/22に公開

Keycloak でクライアント認証方式 private_key_jwt を試した際の手順を忘れないように個人的なメモとして残しておきます。
今回の動作確認に必要な設定が行われた状態で Keycloak が起動する環境も用意したので、動作確認はこちらをもとに実施します。

https://github.com/kg0r0/keycloak-signed-jwt

Keycloak 上で作成するクライアントのクライアント認証方式の設定に関する詳細は Keycloak のドキュメント Confidential client credentials から確認できました。

今回試す private_key_jwt をクライアント認証方式として使用する場合、Client Authenticator として Signed Jwt を選択するようです。

また、署名の検証に使用される鍵をインポートしておきます。この時の形式は数種類の中から選択することができ JSON Web Key Set などを選択することができます。

クライアント認証に使用する JWT のクレームについては OpenID Connect Core - 9. Client Authentication などの仕様で確認することができます。
例えば、今回のクライアントの設定においては以下のようなクレームになりました。

$ jwt decode eyJhdWQiOlsiaHR0cDovL2xvY2FsaG9zdDo4MDgwL3JlYWxtc...

Token header
------------
{
  "typ": "JWT",
  "alg": "RS256"
}

Token claims
------------
{
  "aud": [
    "http://localhost:8080/realms/main/protocol/openid-connect/token"
  ],
  "exp": 1724280598,
  "iat": 1724280538,
  "iss": "sample-app",
  "jti": "90a43582-63f8-468d-8782-0a618399f9bc",
  "sub": "sample-app"
}

最後に、今回のクライアントは client credentials grant を許可しているため、以下のようにリクエストすることでトークンを取得することができます。

$ curl -s -X POST http://localhost:8080/realms/main/protocol/openid-connect/token \
 -H "Content-Type: application/x-www-form-urlencoded" \
 -d "client_id=sample-app" \
 -d "grant_type=client_credentials" \
 -d "scope=openid" \
 -d "client_assertion_type=urn:ietf:params:oauth:client-assertion-type:jwt-bearer" \
 -d "client_assertion=eyJhdWQiOlsiaHR0cDovL2xvY2FsaG9zdDo4MDgwL3JlYWxtc..."

References

GitHubで編集を提案

Discussion