このエントリーをはてなブックマークに追加

環境設定

レルムの作成

keycloakではレルム(realm)という単位でユーザが属している領域を区切ることができます。
レルムは独立しているためそれぞれにユーザアカウントを管理することができます。
  1. 左上部にある「Master」の右側にあるアイコンをマウスのカーソルを当てます。

    ../../_images/001.png
  2. 「レルムの追加」を押下します。

    ../../_images/002.png
  3. 名前を設定します。(今回の場合はsnowsaber-exsample)

    ../../_images/004.png
  4. 作成を押下します。

    ../../_images/005.png
  5. 以上でレルムの作成は完了です。

クライアントの作成

ユーザが利用するアプリケーションをクライアントとして登録します。
  1. 右のメニューの「クライアント」を押下します。

    ../../_images/client_001.png
  2. 「クライアントiD」にidを設定しいます。

    今回はサンプルとして「exsample-app」を設定しています。

    ../../_images/client_002.png

以上でクライアントの作成は完了です。

../../_images/client_003.png ../../_images/client_004.png

ロールの作成

keylocalではレルムに対してのロールとクライアントに対してのレルムを作成することができます。
今回はレルムに対してのロールを作成します。
  1. メニューの「ロール」を押下します。

    ../../_images/role_001.png
  2. 「ロールの追加」を押下します。

    ../../_images/role_002.png
  3. 「ロール名」を入力し、「保存」を押下します。

    今回は「admin-role」を設定してします。

    ../../_images/role_003.png

以上でロールの作成は完了です。

ユーザの作成

  1. メニューの「ユーザ」を押下します。

    ../../_images/user_001.png
  2. 「ユーザ名」を入力し、「保存」を押下します。

    今回は「admin-user」を入力します。

    ../../_images/user_002.png
  3. 「ロールマッピング」タブを選択します。

    ../../_images/user_003.png
  4. 「使用可能なロール」より所属するロールを選択し、「選択したものを追加」を選択します。

    今回は「admin-role」を選択します。
    ../../_images/user_004.png ../../_images/user_005.png
  5. 次にユーザのパスワードを設定します。「クレデンシャル」タブを選択します。

  6. 下部にある「Set Password」の「パスワード」「新しいパスワード(確認)」を入力し「一時的」を「オフ」に設定します。

    ../../_images/user_006.png ../../_images/user_007.png

以上でユーザの作成は完了です。

クライアントとロールの紐付け

作成したユーザと利用するクライアントを紐付けます。

  1. クライアントの「設定」タブよりアクセスタイプを「confidential」に変更します。

    ../../_images/client_role_mapping_01.png
  2. 次に以下の内容を変更し、保存ボタンを押下します。

    • サービスアカウントの有効 : オン
    • 有効なリダイレクトURI : 対象のシステムのログイン画面のURI(今回のサンプルではlocalhostを設定)
    ../../_images/client_role_mapping_02.png
  3. 次に「サービスアカウントロール」タブを選択します。

    ../../_images/client_role_mapping_03.png
  4. 「使用可能なロール」より利用するロールを選択します。

    ../../_images/client_role_mapping_04.png ../../_images/client_role_mapping_05.png ../../_images/client_role_mapping_06.png

以上でクライアントとロールの紐付けは完了です。

アクセストークンの発行

認証用のトークンを発行し動作を確認します。

  1. クライアントの「クレデンシャル」タブを開きます。

  2. シークレット部分をコピーします。

    ../../_images/accesstoken_01.png
  3. クライアントIDおよびシークレットを以下の形式としbase64にエンコードします。

    クライアントid:シークレット

    base64へのエンコードは以下のようなサービスを利用すると便利です。

  4. 以下のリクエストをkeycloakのサーバに送信します。

    URL

    http://${host}:${port}/auth/realms/${realm}/protocol/openid-connect/token

    header

    Authorization: Basic {クライアントid:シークレットのbase64の値}
    Content-Type: application/x-www-form-urlencoded

    data

    以下の内容を「&」で繋ぎます。

    grant_type : password
    username : ユーザid
    password : パスワード

    送信サンプル

    POST http://192.168.56.110/auth/realms/snowsaber-exsample/protocol/openid-connect/token
    Authorization: Basic ZXhzYW1wbGUtYXBwOmFlMjc0MzM2LTAzOWYtNDY4OS04YjZhLWM4ZDA3NWEyZTNlNw==
    Content-Type: application/x-www-form-urlencoded
    
    grant_type=password&username=admin&password=admin
    

    成功時のレスポンス例

    HTTP/1.1 200 OK
    Cache-Control: no-store
    Set-Cookie: KEYCLOAK_LOCALE=; Version=1; Comment=Expiring cookie; Expires=Thu, 01-Jan-1970 00:00:10 GMT; Max-Age=0; Path=/auth/realms/snowsaber-exsample/; HttpOnly,KC_RESTART=; Version=1; Expires=Thu, 01-Jan-1970 00:00:10 GMT; Max-Age=0; Path=/auth/realms/snowsaber-exsample/; HttpOnly
    X-XSS-Protection: 1; mode=block
    Pragma: no-cache
    X-Frame-Options: SAMEORIGIN
    Date: Mon, 03 Aug 2020 21:58:48 GMT
    Connection: close
    Strict-Transport-Security: max-age=31536000; includeSubDomains
    X-Content-Type-Options: nosniff
    Content-Type: application/json
    Content-Length: 2028
    
    {
      "access_token": "eyJhbGciOiJSUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICI4ejducEc2dUtfMkNyanE5STdWbUg0MjNnSWFiRVBzbmFFd3lOWUx5aEdFIn0.eyJleHAiOjE1OTY0OTIyMjgsImlhdCI6MTU5NjQ5MTkyOCwianRpIjoiODdiMjFjMDUtZTFmZC00ZWM0LTlmYzAtNzFjYzI1NjFmY2U3IiwiaXNzIjoiaHR0cDovLzE5Mi4xNjguNTYuMTEwL2F1dGgvcmVhbG1zL3Nub3dzYWJlci1leHNhbXBsZSIsImF1ZCI6ImFjY291bnQiLCJzdWIiOiIyNGIxOWRmYS1hMDBkLTQ5MmEtODcwZi1kMzcxNThmZjQwNDEiLCJ0eXAiOiJCZWFyZXIiLCJhenAiOiJleHNhbXBsZS1hcHAiLCJzZXNzaW9uX3N0YXRlIjoiZmRlYTgxZmUtNGFlNi00ZThmLWE1YTAtZDAxM2I4YTZiYWIxIiwiYWNyIjoiMSIsInJlYWxtX2FjY2VzcyI6eyJyb2xlcyI6WyJhZG1pbi1yb2xlIiwib2ZmbGluZV9hY2Nlc3MiLCJ1bWFfYXV0aG9yaXphdGlvbiJdfSwicmVzb3VyY2VfYWNjZXNzIjp7ImFjY291bnQiOnsicm9sZXMiOlsibWFuYWdlLWFjY291bnQiLCJtYW5hZ2UtYWNjb3VudC1saW5rcyIsInZpZXctcHJvZmlsZSJdfX0sInNjb3BlIjoicHJvZmlsZSBlbWFpbCIsImVtYWlsX3ZlcmlmaWVkIjpmYWxzZSwicHJlZmVycmVkX3VzZXJuYW1lIjoiYWRtaW4ifQ.lomgtA6uDPY0uCm_1YlJ8NY3WLMBeZs0BxkW_VGBz5F6hZENNa0lMzSwGHWsC4TBOvkPn1l4K7oHrjDOGsKYX5RKHGauRVZcHZftAD5_kwQG8-G_V_UrOS_wCMCTAwONSBphYgPF4URcdeTBe_KWob3uj7mdYyFfa3zfrMMNyz-VlJSDYvXCp9xBDziWHlp0auJvp4m41y-ekF5y-hGryLcQG5b6LcTdzLq1FnOYXYb7eNpODAtfnPftdz2kacxMxAuscUiuIijOTJM5MIyDZNQ87tgEpUFr6SphXmsDp8NsCDj4zMrOn4ZbcbZAcNKS7fWz3l4ALX0na9b9RJ82gQ",
      "expires_in": 300,
      "refresh_expires_in": 1800,
      "refresh_token": "eyJhbGciOiJIUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICIyNDI4YzVhYy01YTMzLTQzNjYtOTdhMS1jMDIyNzRkNDcwZTkifQ.eyJleHAiOjE1OTY0OTM3MjgsImlhdCI6MTU5NjQ5MTkyOCwianRpIjoiNmIyZDRlN2MtYjZmMy00OWVjLWIxMjYtMjQxMWJhNjBlOThiIiwiaXNzIjoiaHR0cDovLzE5Mi4xNjguNTYuMTEwL2F1dGgvcmVhbG1zL3Nub3dzYWJlci1leHNhbXBsZSIsImF1ZCI6Imh0dHA6Ly8xOTIuMTY4LjU2LjExMC9hdXRoL3JlYWxtcy9zbm93c2FiZXItZXhzYW1wbGUiLCJzdWIiOiIyNGIxOWRmYS1hMDBkLTQ5MmEtODcwZi1kMzcxNThmZjQwNDEiLCJ0eXAiOiJSZWZyZXNoIiwiYXpwIjoiZXhzYW1wbGUtYXBwIiwic2Vzc2lvbl9zdGF0ZSI6ImZkZWE4MWZlLTRhZTYtNGU4Zi1hNWEwLWQwMTNiOGE2YmFiMSIsInNjb3BlIjoicHJvZmlsZSBlbWFpbCJ9._6aQhBA4PklQh9_4KeAiPQpHO3FjAgsq5hED9gwSsN4",
      "token_type": "bearer",
      "not-before-policy": 0,
      "session_state": "fdea81fe-4ae6-4e8f-a5a0-d013b8a6bab1",
      "scope": "profile email"
    }
    

参考サイト