はじめに
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」を有効化しておきます。
続いて同じ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の簡易的な動作検証の参考になれば幸いです。