目的
過去記事「App IDでGrafanaの認証をする」では、GrafanaのGeneric OAuthとIBM Cloud App IDを利用することで認証をしてみました。今回はそのアップデートとして、GrafanaのRoleをApp IDのカスタム属性を使って実現してみます。
手順
App IDのカスタム属性の設定
すでにユーザーは追加済とします。詳細は前回の記事を参照ください。
ユーザー・プロファイルからユーザーを選択し、カスタム属性を追加します。次のように、
{
"grafanaRole": "Admin"
}
としてみます。キーは任意です。値はGrafanaのロールに基づき、次のいずれかです。
- Admin
- Editor
- Viewer
カスタム属性の更新禁止設定
カスタム属性はデフォルトではユーザー権限で更新ができてしまいます。例えば、やり方さえ知っていればEditorロールのユーザーが自分のロールをAdminに自力で更新できてしまいます。それを避けるため、カスタム属性はユーザーは更新できないようにします。
下記画面で、アプリからのカスタム属性の変更
を無効
にします。
カスタム属性の確認
curlで確認できます。
$ _token=$(curl -s https://jp-tok.appid.cloud.ibm.com/oauth/v4/${tenant_id}/token -d "client_id=${client_id}" -d "client_secret=${client_secret}" -d "username=${username}" -d "password=${password}" -d "grant_type=password" https://jp-tok.appid.cloud.ibm.com/oauth/v4/${tenant_id}/token | jq -r .access_token | tail -1)
$ curl -s https://jp-tok.appid.cloud.ibm.com/api/v1/attributes -H "Authorization: Bearer ${_token}"
{"grafanaRole":"Admin"}
grafana.iniの設定
次のように設定します。ポイントはapi_url
とrole_attribute_path
です。api_urlはGrafanaがカスタム属性を取得するためのエンドポイントです。role_attribute_pathはattributeエンドポイントで得られたJSONのうち、Grafanaのロールを示すキーです。従って、カスタム属性のキーと一致させます。
[auth.generic_oauth]
enabled = true
name = App ID # 任意
client_id = ${client_id}
client_secret = ${client_secret}
auth_url = https://jp-tok.appid.cloud.ibm.com/oauth/v4/${tenant_id}/authorization
token_url = https://jp-tok.appid.cloud.ibm.com/oauth/v4/${tenant_id}/token
api_url = https://jp-tok.appid.cloud.ibm.com/api/v1/attributes
role_attribute_path = grafanaRole # カスタム属性のキー
動作確認
Grafanaを(再)起動し、OAuthでログインします。ユーザーのPreferenceを確認します。次のようにRoleがAdminになっていればOKです。なお、もし設定に失敗している場合、つまりロールの指定に失敗した場合はViewerになります。
以上