Grafana — вход через Zentro, роли по правам Zentro
This content is not available in your language yet.
Grafana: Generic OAuth — в веб-интерфейсе (Administration → Authentication → Generic OAuth, Grafana 10.4+),
в grafana.ini ([auth.generic_oauth]) или переменными GF_AUTH_GENERIC_OAUTH_*. Ниже https://id.example.com
— адрес Zentro, https://grafana.example.com — адрес Grafana.
1. Приложение в Zentro
Заголовок раздела «1. Приложение в Zentro»Админка → Приложения → Добавить, тип «Люди — вход в приложение через Zentro»:
| Поле | Значение |
|---|---|
| Redirect URI | https://grafana.example.com/login/generic_oauth |
| Scopes | openid profile email |
| Post-logout redirect URI | https://grafana.example.com/login |
| Доступ → Пространство прав | GRAFANA |
| Приложение организации — не спрашивать согласие | вкл |
«Публичный клиент» не отмечать — у Grafana есть секрет. client_secret показывается один раз. Роли Zentro с
правами GRAFANA:*:ADMIN, GRAFANA:*:EDIT, GRAFANA:*:VIEW (Роли) назначьте людям — права уходят Grafana
в claim permissions. Общее для всех приложений — README.
Grafana внутри сервиса (мастер сервиса). Пространство прав приложения в сервисе — только ключ сервиса:
галочка «Передавать приложению права пользователя в KEY». Тогда и права в ролях, и выражение роли в Grafana
(ниже) — с этим ключом (ZENTRO:*:ADMIN и т. п.), и Grafana получит все права пользователя в этом пространстве.
Поля Scopes в мастере нет — приложение создаётся только с openid: после создания откройте Приложения →
карточка → Изменить → Scopes и впишите openid profile email, иначе вход упадёт с invalid_scope.
2. Grafana
Заголовок раздела «2. Grafana»Веб-интерфейс
Заголовок раздела «Веб-интерфейс»Administration → Authentication → Generic OAuth:
| Вкладка | Поле | Значение |
|---|---|---|
| General settings | Display name | Zentro |
| Client Id / Client secret | из Zentro | |
| Scopes | openid, profile, email |
|
| Auth URL | https://id.example.com/oidc/authorize |
|
| Token URL | https://id.example.com/oidc/token |
|
| API URL | https://id.example.com/oidc/userinfo |
|
| Allow sign up | вкл | |
| Sign out redirect URL | https://id.example.com/oidc/end_session?client_id=<client_id>&post_logout_redirect_uri=https%3A%2F%2Fgrafana.example.com%2Flogin |
|
| User mapping | Login attribute path | preferred_username |
| Email attribute path | email |
|
| Name attribute path | preferred_username |
|
| Role attribute path | выражение ниже | |
| Role attribute strict mode | вкл | |
| Extra security | Use PKCE | вкл (без PKCE Zentro отказывает) |
| Use refresh token | вкл |
Выражение роли (подставьте своё пространство прав):
contains(permissions[*], 'GRAFANA:*:ADMIN') && 'Admin' || contains(permissions[*], 'GRAFANA:*:EDIT') && 'Editor' || contains(permissions[*], 'GRAFANA:*:VIEW') && 'Viewer'Save и Enable. Адрес Grafana (root_url) веб-интерфейс не задаёт — см. ниже.
grafana.ini
Заголовок раздела «grafana.ini»[server]root_url = https://grafana.example.com/
[auth.generic_oauth]enabled = truename = Zentroallow_sign_up = trueclient_id = <client_id>client_secret = <client_secret>scopes = openid email profileauth_url = https://id.example.com/oidc/authorizetoken_url = https://id.example.com/oidc/tokenapi_url = https://id.example.com/oidc/userinfouse_pkce = trueuse_refresh_token = truelogin_attribute_path = preferred_usernameemail_attribute_path = emailname_attribute_path = preferred_usernamerole_attribute_path = contains(permissions[*], 'GRAFANA:*:ADMIN') && 'Admin' || contains(permissions[*], 'GRAFANA:*:EDIT') && 'Editor' || contains(permissions[*], 'GRAFANA:*:VIEW') && 'Viewer'role_attribute_strict = truesignout_redirect_url = https://id.example.com/oidc/end_session?client_id=<client_id>&post_logout_redirect_uri=https%3A%2F%2Fgrafana.example.com%2FloginВ Docker — те же ключи переменными: GF_SERVER_ROOT_URL, GF_AUTH_GENERIC_OAUTH_ENABLED,
GF_AUTH_GENERIC_OAUTH_CLIENT_ID и т. д.
root_url— из него Grafana собирает адрес возврата; он должен совпасть с Redirect URI в Zentro. За прокси безroot_urlуходитhttp://localhost:3000/login/generic_oauth, и Zentro отклоняет запрос.- Token URL и API URL Grafana вызывает сама: адрес Zentro должен открываться с сервера (из контейнера) Grafana.
role_attribute_strict = true— пользователь без прав в Grafana не войдёт. Уберите, чтобы такие получали роль по умолчанию (auto_assign_org_role).- Права меняются в Zentro — роль в Grafana обновляется при следующем входе.
Проверка
Заголовок раздела «Проверка»Войти пользователем с правом …:EDIT → Profile → роль Editor. Нет кнопки «Sign in with Zentro» — провайдер
не включён (Enable / enabled = true и перезапуск Grafana).
Если вход не проходит
Заголовок раздела «Если вход не проходит»Причину Grafana пишет в лог (docker logs grafana 2>&1 | grep -i "failed to login"): error= — код отказа
Zentro, errorDesc= — пояснение (Zentro пишет его с версии 0.8.0).
| Что видно | Причина | Что сделать |
|---|---|---|
«Login provider denied login request», error=invalid_scope |
Grafana просит scope, которого нет у приложения (часто — создано мастером сервиса, только openid) |
Zentro: Scopes приложения openid profile email; в Grafana — ровно эти три |
то же, error=invalid_request |
выключен PKCE | Grafana: Use PKCE вкл |
то же, error=consent_required |
не отмечено «Приложение организации» | Zentro: отметить |
| Страница ошибки Zentro, в Grafana не вернулись | не тот Client Id или адрес возврата не совпадает с Redirect URI | проверить Client Id и root_url |
| «User sync failed» | в Grafana уже есть локальный пользователь с тем же логином или почтой (например admin), Grafana 10+ не связывает его с входом через OAuth |
переименовать локального пользователя Grafana или включить oauth_allow_insecure_email_lookup = true ([auth]) — связывание по почте |
| «Invalid role» / нет доступа | у пользователя нет прав в пространстве приложения, включён strict mode | назначить роль с правом …:VIEW и выше или поправить выражение роли |