پرش به مطلب اصلی
احراز هویت با SSO در Grafana

احراز هویت با SSO در Grafana

بازارچه ابریخواندن 6 دقیقه

با اتصال Grafana به Keycloak از طریق Generic OAuth ورود به Grafana با همان حساب Keycloak (SSO) انجام می‌شود؛ نقش کاربر در Grafana (Viewer، Editor یا Admin) هم می‌تواند از روی نقش‌های تعریف‌شده در Keycloak تعیین شود.

پیش‌نیازها

  • یک سرویس فعال Grafana و دسترسی ادمین
  • یک سرویس فعال Keycloak

گام اول: ساخت Client در Keycloak

  1. در همان realm اختصاصی، از مسیر Clients > Create client، یک Client جدید ساخته می‌شود؛ برای مثال با Client ID grafana.
  2. Client authentication روی حالت فعال (Confidential) قرار می‌گیرد و Standard flow فعال باقی می‌ماند.
  3. در Valid redirect URIs، آدرس زیر اضافه می‌شود:
https://your-grafana-domain.xyz/login/generic_oauth
  1. با کلیک روی Save، Client ذخیره می‌شود.

پس از ذخیره‌شدن Client، دو تب دیگر هم روی همین Client بررسی می‌شوند:

  1. از تب Client scopes، اطمینان حاصل می‌شود که scopeهای email و profile جزو scopeهای Default باشند (این دو معمولاً به‌صورت پیش‌فرض Default هستند).
  2. از تب Credentials، مقدار Client secret کپی می‌شود.

گام دوم: ساخت نقش‌ها و تخصیص به کاربران

نقش‌های Grafana (admin، editor، viewer) در Keycloak به‌صورت Client Roles روی همین Client (نه Realm Roles) ساخته می‌شوند:

  1. از تب Roles همین Client، با دکمه Create role، سه نقش با نام‌های admin، editor و viewer ساخته می‌شوند.
  2. از تب Client scopes، روی Scope اختصاصی همین Client (برای نمونه grafana-dedicated) کلیک می‌شود.
  3. از تب Mappers همان Scope، روی Add predefined mapper کلیک می‌شود؛ از فهرست باز‌شده، گزینه client roles انتخاب و اضافه می‌شود.
  1. برای تخصیص نقش به هرکاربر، از مسیر Users، کاربر موردنظر انتخاب و از تب Role mapping، روی Assign role کلیک می‌شود.
  2. در پنجره باز‌شده، با فعال کردن گزینه Filter by clients، نقش‌های ساخته‌شده روی Client grafana (admin، editor یا viewer) قابل انتخاب و تخصیص هستند.

گام سوم: تنظیم متغیرهای محیطی Grafana

از مسیر کنسول هم‌روش > سرویس Grafana > تنظیمات > متغیرهای محیطی، متغیرهای زیر اضافه می‌شوند. توضیح کامل هرکدام در مستند رسمی Generic OAuth گرافانا آمده است.

متغیرتوضیحات
GF_AUTH_GENERIC_OAUTH_ENABLEDفعال‌سازی OAuth
GF_AUTH_GENERIC_OAUTH_NAMEنام نمایش‌داده‌شده روی دکمه ورود
GF_AUTH_GENERIC_OAUTH_CLIENT_IDClient ID ساخته‌شده در Keycloak
GF_AUTH_GENERIC_OAUTH_CLIENT_SECRETClient Secret همان Client
GF_AUTH_GENERIC_OAUTH_SCOPESScopeهای درخواستی از Keycloak
GF_AUTH_GENERIC_OAUTH_AUTH_URLآدرس Authorization در Keycloak
GF_AUTH_GENERIC_OAUTH_TOKEN_URLآدرس Token در Keycloak
GF_AUTH_GENERIC_OAUTH_API_URLآدرس User Info در Keycloak
GF_AUTH_GENERIC_OAUTH_EMAIL_ATTRIBUTE_PATHمسیر JMESPath برای استخراج ایمیل، در مواردی که تشخیص خودکار ایمیل با مشکل مواجه شود
GF_AUTH_GENERIC_OAUTH_ROLE_ATTRIBUTE_PATHعبارت JMESPath که نقش‌های Client ساخته‌شده در بخش قبل را به نقش Grafana (Admin، Editor یا Viewer) نگاشت می‌کند
GF_AUTH_GENERIC_OAUTH_ALLOW_SIGN_UPساخت خودکار کاربر جدید در Grafana در اولین ورود موفق با SSO
GF_AUTH_GENERIC_OAUTH_ENABLED=true
GF_AUTH_GENERIC_OAUTH_NAME=Keycloak
GF_AUTH_GENERIC_OAUTH_CLIENT_ID=grafana
GF_AUTH_GENERIC_OAUTH_CLIENT_SECRET=<client-secret>
GF_AUTH_GENERIC_OAUTH_SCOPES=openid email profile
GF_AUTH_GENERIC_OAUTH_AUTH_URL=https://your-keycloak-domain/realms/<realm-name>/protocol/openid-connect/auth
GF_AUTH_GENERIC_OAUTH_TOKEN_URL=https://your-keycloak-domain/realms/<realm-name>/protocol/openid-connect/token
GF_AUTH_GENERIC_OAUTH_API_URL=https://your-keycloak-domain/realms/<realm-name>/protocol/openid-connect/userinfo
GF_AUTH_GENERIC_OAUTH_EMAIL_ATTRIBUTE_PATH=email
GF_AUTH_GENERIC_OAUTH_ROLE_ATTRIBUTE_PATH=contains(resource_access.grafana.roles[*], 'admin') && 'Admin' || contains(resource_access.grafana.roles[*], 'editor') && 'Editor' || 'Viewer'
GF_AUTH_GENERIC_OAUTH_ALLOW_SIGN_UP=true

پس از افزودن متغیرها، با کلیک روی «اعمال تغییرات»، سرویس با تنظیمات جدید ری‌استارت می‌شود.


گام چهارم: ورود با SSO

پس از اعمال تغییرات، در صفحه ورود Grafana، دکمه‌ای با عنوان مقدار GF_AUTH_GENERIC_OAUTH_NAME (مثلاً «Keycloak») نمایش داده می‌شود. با کلیک روی این دکمه، کاربر به Keycloak ریدایرکت و پس از ورود موفق وارد Grafana می‌شود.


عیب‌یابی

ایمیل کاربر در Keycloak خالی نباشد. طبق مستند رسمی Generic OAuth وجود مقدار ایمیل برای ساخت یا ورود کاربر در Grafana الزامی است؛ اگر فیلد Email در پروفایل کاربر Keycloak خالی باشد ورود با خطای مربوط به ایمیل شکست می‌خورد. تیک Email verified روی پروفایل کاربر توسط خود Grafana بررسی نمی‌شود، اما روشن نگه‌داشتن آن در Keycloak توصیه می‌شود تا فرایندهای الزام به تأیید ایمیل (Required Actions) در میانه مسیر SSO ظاهر نشوند.

بررسی توکن از تب Evaluate. پیش از تست ورود واقعی، می‌توان از مسیر Client scopes > Evaluate (روی همان Client grafana) یک کاربر مشخص را انتخاب کرد و ID Token، Access Token و پاسخ User Info تولیدشده برای آن کاربر را مشاهده کرد. این کار برای بررسی وجود claimهای email و resource_access.grafana.roles پیش از هر تست SSO مفید است.

تست عبارت role_attribute_path. برای اطمینان از درستی عبارت JMESPath استفاده‌شده در GF_AUTH_GENERIC_OAUTH_ROLE_ATTRIBUTE_PATH، می‌توان مقدار خروجی تب Evaluate را در ابزار رسمی jmespath.org به‌عنوان payload وارد و عبارت را روی آن آزمایش کرد.

این راهنمایی کاربردی بود؟

با ثبت بازخوردتان در بهبود کیفیت مستندات مشارکت داشته باشید.