(O+P)ut

アウトプット



(O+P)ut

エンジニアのアウトプット

【Keycloak】Direct access grantsを利用してcurlでアクセストークンを発行する

スポンサーリンク

はじめに

Direct Access Grantsとはクライアントがユーザー認証を行う際の方式の一つで、直接ユーザ名とパスワードで認証を行います。同方式を利用するとブラウザ経由ではなくcurlコマンドで簡易的にトークン発行が可能なため、今回はKeycloakの動作検証としてCUIからアクセストークンを発行する流れを記載しました。

環境情報
  • Linux(fedora)
  • keycloak-21.1.2

事前準備

Keycloakを立ち上げた上で

$ ./bin/kc.sh start-dev

Keycloakの管理コンソールにログインし、テスト用のレルム(testrealm)1を用意した上でその中にクライアントを作成します。
クライアントを生成する上で

  • Client ID
  • Root URL

を指定する必要がありますが、Client IDは testclient ,Root URLは http://localhost:8888 とします。Root URLは今回の検証では利用しませんが、実際にアプリから呼ぶ場合は該当のアプリが動作するポートやIPアドレスを指定ください。

最後に認証方式についてですが、以下の画面のように「Direct access grants」にチェックマークをつけた上で「Client Authentication」を有効化しておきます。

今回はDirect Access Grantsを許可

続いて同じrealmの中でユーザを作成し、パスワードを設定します。今回は仮で ユーザー名:hoge,パスワード:fuga とします。

アクセストークンの発行

クライアントの「Credentials」タブには「Client secret」が表示されているので、そこの値をコピーした上で、Keycloakが動作するサーバにて以下コマンドを押下します。(XX部分がクライアントシークレット)

$ curl -X POST http://localhost:8080/realms/testrealm/protocol/openid-connect/token --user testclient:XX -H 'content-type: application/x-www-form-urlencoded' -d 'username=hoge&password=fuga&grant_type=password'

そうするとアクセストークンとリフレッシュトークンが取得でき、jqコマンドで整形すると以下のような形式となっています。

{
"access_token": "....",
  "expires_in": 300,
  "refresh_expires_in": 1800,
  "refresh_token": "....",
  "token_type": "Bearer",
  "not-before-policy": 0,
  "session_state": "...",
  "scope": "email profile"
}

エラーパターンとしてはclient secretの値が誤っている場合は以下で

{
  "error": "unauthorized_client",
  "error_description": "Invalid client or Invalid client credentials"
}

Direct access grantsが有効化されていないと

{
 "error": "unauthorized_client",
  "error_description": "Client not allowed for direct access grants"
}

といったエラーとなります。

終わりに

今回はKeycloakの動作検証としてアクセストークンの発行に留めていますが、本来はここから同トークンを利用してアプリ側にアクセスを行う流れとなります。

以上、Keycloakの簡易的な動作検証の参考になれば幸いです。