菜单
Grafana Cloud 企业版 开源版

配置通用OAuth2身份验证

在Grafana中提供了多种身份验证方法来验证用户身份。身份验证配置决定了哪些用户可以访问Grafana以及他们可以使用的登录方法。您还可以配置Grafana根据身份提供者集成返回的信息自动更新用户在Grafana中的角色和团队归属。

在选择身份验证方法时,重要的是考虑您当前的身份和访问管理系统以及您所需的特定身份验证和授权功能。关于可用的身份验证选项以及它们支持的功能的完整列表,请参阅配置身份验证

Grafana为以下身份验证提供程序提供OAuth2集成:

如果您的OAuth2提供程序不在列表中,您可以使用通用的OAuth2身份验证。

本主题介绍了如何使用不同方法配置通用OAuth2身份验证,并包括如何使用特定OAuth2提供程序设置通用OAuth2的示例

开始之前

为了遵循此指南

  • 请确保您知道如何使用您的OAuth2提供程序创建OAuth2应用程序。有关更多信息,请参阅您的OAuth2提供程序的文档。
  • 请确保您的身份提供者返回OpenID UserInfo兼容的信息,例如sub声明。
  • 如果您正在使用刷新令牌,请确保您知道如何与您的OAuth2提供程序设置它们。有关更多信息,请参阅您的OAuth2提供程序的文档。

注意

如果用户在Azure AD中使用与其他身份验证提供程序(例如Grafana.com)相同的电子邮件地址,您需要执行额外的配置以确保用户匹配正确。请参阅使用相同的电子邮件地址在不同身份提供程序中登录的文档以获取更多信息。

使用Grafana UI配置通用OAuth认证客户端

注意

在Grafana 10.4的公共预览版中可用,在功能开关的背后。

作为Grafana管理员,您可以使用通用OAuth UI在Grafana中配置通用OAuth2客户端。为此,导航到“管理 > 身份验证 > 通用OAuth”页面并填写表格。如果您的Grafana配置文件中已有当前配置,则表格将自动填充这些值;否则,表格将包含默认值。

填写完表格后,点击“保存”以保存配置。如果保存成功,Grafana将应用新配置。

如果您需要将UI中做出的更改重置回默认值,请点击“重置”。重置更改后,Grafana将应用Grafana配置文件中的配置(如果有的话)或默认值。

注意

如果您在高可用性模式下运行Grafana,配置更改可能不会立即应用到所有Grafana实例。您可能需要等待几分钟,直到配置传播到所有Grafana实例。

有关更多信息,请参阅配置选项

使用Terraform提供程序配置通用OAuth认证客户端

注意

在Grafana 10.4的公共预览版中可用,在ssoSettingsApi功能开关的背后。自v2.12.0版起支持在Terraform提供程序中。
terraform
resource "grafana_sso_settings" "generic_sso_settings" {
  provider_name = "generic_oauth"
  oauth2_settings {
    name              = "Auth0"
    auth_url          = "https://<domain>/authorize"
    token_url         = "https://<domain>/oauth/token"
    api_url           = "https://<domain>/userinfo"
    client_id         = "<client id>"
    client_secret     = "<client secret>"
    allow_sign_up     = true
    auto_login        = false
    scopes            = "openid profile email offline_access"
    use_pkce          = true
    use_refresh_token = true
  }
}

有关使用grafana_sso_settings资源的信息,请参阅Terraform注册表

使用Grafana配置文件配置通用OAuth认证客户端

请确保您有权访问Grafana配置文件

步骤

要使用我们的通用OAuth2身份验证将OAuth2提供程序与Grafana集成,请按以下步骤操作

  1. 在您选择的OAuth2提供商中创建OAuth2应用程序。

  2. 将您的OAuth2应用的回调URL设置为 http://<my_grafana_server_name_or_ip>:<grafana_server_port>/login/generic_oauth

    确保回调URL是完整的HTTP地址,您可以通过浏览器访问Grafana,但需要添加路径 /login/generic_oauth

    为了使回调URL正确,可能需要在Grafana配置文件的[server]部分设置root_url选项。例如,如果您在代理后面运行Grafana。

  3. 根据以下表格更新Grafana配置文件中[auth.generic_oauth]部分的位置的值

    字段描述
    client_id, client_secret这些值必须与您的OAuth2应用程序中的客户端ID和客户端机密匹配。
    auth_urlYour OAuth2提供商的授权端点。
    api_urlYour OAuth2提供商的用户信息端点。此端点返回的信息必须与OpenID UserInfo兼容。
    enabled启用通用OAuth2身份验证。将此值设置为true

    查看其他通用OAuth2配置选项列表,并根据需要完成它们。

  4. 可选:配置刷新令牌

    a. 将您OAuth2提供商使用的刷新令牌作用域添加到Grafana配置文件中[auth.generic_oauth]部分的scopes字段。

    b. 将[auth.generic_oauth]部分的use_refresh_token设置为true

    c. 如果需要,在提供商上启用刷新令牌。

  5. 配置角色映射.

  6. 可选:配置团队同步

  7. 重启Grafana。

    现在您应该能在登录页上看到通用OAuth2登录按钮,并可以使用OAuth2提供商登录或注册。

配置登录

Grafana可以从OAuth2 ID令牌或在OAuth2 UserInfo端点检索的用户信息中解析用户登录。Grafana按顺序检查这些来源,直到找到登录信息。如果没有找到登录信息,则将用户的登录设置为用户电子邮件地址。

根据OAuth2提供商返回用户登录的方式,以下是您需要配置的信息表

登录来源所需配置
loginusername字段来自OAuth2 ID令牌。N/A
另一个来自OAuth2 ID令牌的字段。设置login_attribute_path配置选项。
loginusername字段来自UserInfo端点的用户信息。N/A
来自UserInfo端点的用户信息中的另一个字段。设置login_attribute_path配置选项。

配置显示名称

Grafana可以从OAuth2 ID令牌或从OAuth2 UserInfo端点检索的用户信息中解析用户显示名称。Grafana按顺序检查这些来源,直到找到显示名称。如果没有找到显示名称,则显示用户的登录。

根据OAuth2提供商返回用户名称的方式,以下是您需要配置的信息表

显示名称来源所需配置
namedisplay_name字段来自OAuth2 ID令牌。N/A
另一个来自OAuth2 ID令牌的字段。设置name_attribute_path配置选项。
namedisplay_name字段来自UserInfo端点的用户信息。N/A
来自UserInfo端点的用户信息中的另一个字段。设置name_attribute_path配置选项。

配置电子邮件地址

Grafana可以从OAuth2 ID令牌,从OAuth2 UserInfo端点检索的用户信息,或OAuth2 /emails端点中解析用户的电子邮件地址。Grafana按顺序检查这些来源,直到找到电子邮件地址。如果没有找到电子邮件,则将用户的电子邮件地址设置为空字符串。

根据Oauth2提供商返回用户电子邮件的方式,以下是您需要配置的信息表

电子邮件地址来源所需配置
email字段位于OAuth2 ID令牌中。N/A
attributes映射位于OAuth2 ID令牌中。设置email_attribute_name配置选项。默认情况下,Grafana在email:primary键下搜索电子邮件地址。
upn字段位于OAuth2 ID令牌中。N/A
UserInfo端点中用户信息的email字段。N/A
来自UserInfo端点的用户信息中的另一个字段。设置email_attribute_path配置选项。
从OAuth2提供者的/emails端点标记为主电子邮件地址
的,通过向配置了api_url的URL附加/emails获得
)
N/A

配置刷新令牌

从Grafana v9.3版及以后版本中可用。

当用户使用OAuth2提供者登录时,Grafana会验证访问令牌是否已过期。当访问令牌过期时,Grafana会使用提供的刷新令牌(如果有的话)来获取新的访问令牌。

Grafana使用刷新令牌获取新的访问令牌,而无需再次登录。如果不存在刷新令牌,则访问令牌过期后,Grafana将用户从系统中注销。

要配置通用OAuth2以使用刷新令牌,将use_refresh_token配置选项设置为true,并根据需要执行以下步骤之一或两个步骤:

  1. 通过附加额外的作用域到Grafana配置文件的[auth.generic_oauth]部分的scopes字段来扩展。
  2. 在提供者上启用刷新令牌。

注意:自从Grafana v10.3.0以来,已删除accessTokenExpirationCheck功能开关,现在将使用use_refresh_token配置值来配置刷新令牌获取和访问令牌过期检查。

配置角色映射

除非启用skip_org_role_sync选项,否则用户的角色将设置为用户登录时从认证提供者检索到的角色。

使用JMESPath表达式从role_attribute_path配置选项检索用户的角色。为了映射服务器管理员角色,请使用allow_assign_grafana_admin配置选项。有关更多信息,请参阅配置选项

如果没有找到有效角色,用户将获得由自动分配组织角色选项(指定auto_assign_org_role)。您可以通过设置role_attribute_strict = true来禁用此默认角色分配。此设置将在评估role_attribute_pathorg_mapping表达式后返回无角色或无效角色时拒绝用户访问。

您可以使用org_attribute_pathorg_mapping配置选项将用户分配到组织和指定他们的角色。有关更多信息,请参阅组织角色映射示例。如果同时指定了组织角色映射(《org_mapping》)和常规角色映射(《role_attribute_path》),则用户将获得两种映射角色中的最高角色。

为简化合适的JMESPath表达式的配置,请访问JMESPath以使用自定义有效载荷测试和评估表达式。

角色映射示例

本节包括用于角色映射的JMESPath表达式的示例。

映射用户组织角色

在此示例中,用户已被授予Editor角色。分配的角色基于属性值role,该值必须是有效的Grafana角色,如AdminEditorViewerNone

有效载荷

json
{
    ...
    "role": "Editor",
    ...
}

配置

bash
role_attribute_path = role

在以下更复杂的例子中,用户已被授予Admin角色。这是因为他们是其OAuth2提供者admin组的成员。如果用户是editor组的成员,则会授予他们Editor角色,否则是Viewer

有效载荷

json
{
    ...
    "info": {
        ...
        "groups": [
            "engineer",
            "admin",
        ],
        ...
    },
    ...
}

配置

bash
role_attribute_path = contains(info.groups[*], 'admin') && 'Admin' || contains(info.groups[*], 'editor') && 'Editor' || 'Viewer'
映射服务器管理员角色

在以下例子中,用户被授予Grafana服务器管理员角色。

有效载荷

json
{
    ...
    "info": {
        ...
        "roles": [
            "admin",
        ],
        ...
    },
    ...
}

配置

ini
role_attribute_path = contains(info.roles[*], 'admin') && 'GrafanaAdmin' || contains(info.roles[*], 'editor') && 'Editor' || 'Viewer'
allow_assign_grafana_admin = true
映射一个角色给所有用户

在这个例子中,所有用户都会被分配Viewer角色,无论接收到的用户信息来自何种身份提供者。

配置

ini
role_attribute_path = "'Viewer'"
skip_org_role_sync = false

组织角色的映射示例

在这个例子中,用户已被授予在org_foo组织中的Viewer角色,以及在org_barorg_baz组织中的Editor角色。

如果用户是admin组的成员,他们会被授予Grafana服务器管理员角色。

有效载荷

json
{
    ...
    "info": {
        ...
        "roles": [
            "org_foo",
            "org_bar",
            "another_org'
        ],
        ...
    },
    ...
}

配置

ini
role_attribute_path = contains(info.roles[*], 'admin') && 'GrafanaAdmin' || 'None'
allow_assign_grafana_admin = true
org_attribute_path = info.roles
org_mapping = org_foo:org_foo:Viewer org_bar:org_bar:Editor *:org_baz:Editor

配置团队同步

注意:适用于Grafana企业版Grafana云服务

使用团队同步,您可以将OAuth2组链接到Grafana内部的团队。这将自动将用户分配到适当的团队。用户登录时,将同步每个用户的团队。

通用OAuth2组可以按组ID引用,例如8bab1c86-8fba-33e5-2089-1d1c80ec267dmyteam。有关在Grafana中使用groups_attribute_path配置选项配置OAuth2组的更多信息,请参阅配置选项

有关团队同步的更多信息,请参阅配置团队同步

团队同步示例

配置

bash
groups_attribute_path = info.groups

有效载荷

json
{
    ...
    "info": {
        ...
        "groups": [
            "engineers",
            "analysts",
        ],
        ...
    },
    ...
}

配置选项

以下表格概述了各种通用OAuth2配置选项。您可以将这些选项作为环境变量应用,就像Grafana中的任何其他配置一样。

设置必需描述默认
enabled启用通用OAuth2身份验证。false
name在Grafana用户界面中引用通用OAuth2身份验证的名称。OAuth
icon在Grafana用户界面中用于通用OAuth2身份验证的图标。signin
client_id由您的OAuth2应用提供的客户端ID。
client_secret由您的OAuth2应用提供的客户端密钥。
auth_url您OAuth2提供者的授权端点。
token_url用于获取OAuth2访问令牌的端点。
api_url用于获取与OpenID UserInfo兼容的用户信息的端点。
auth_style请求OAuth2提供者ID令牌时使用的OAuth2 AuthStyle的名称。它决定了如何将client_idclient_secret发送到Oauth2提供者。可用的值有AutoDetectInParamsInHeaderAutoDetect
scopes逗号分隔或空格分隔的OAuth2作用域列表。user:email
empty_scopes将此选项设置为true,在身份验证期间使用一个空的范围。false
allow_sign_up通过通用OAuth2登录控制Grafana用户创建。如果设置为false,则只能登录现有Grafana用户。true
auto_login设置为 true 以允许用户绕过登录界面并自动登录。如果您配置了多个身份验证提供程序使用自动登录,则此设置将被忽略。false
id_token_attribute_name从返回的OAuth2令牌中提取ID令牌所使用的键的名称。id_token
login_attribute_path用于从用户ID令牌中查找用户登录的 JMESPath 表达式。有关如何检索用户登录的更多信息,请参阅 配置登录
name_attribute_path用于从用户ID令牌中查找用户姓名的 JMESPath 表达式。此名称将被用作用户的显示名称。有关如何检索用户显示名称的更多信息,请参阅 配置显示名称
email_attribute_path用于从用户信息中查找用户电子邮件的 JMESPath 表达式。有关如何检索用户电子邮件的更多信息,请参阅 配置电子邮件地址
email_attribute_name用于在OAuth2 ID令牌的attributes映射中查找用户电子邮件的键的名称。有关如何检索用户电子邮件的更多信息,请参阅 配置电子邮件地址email:primary
role_attribute_path用于Grafana角色查找的 JMESPath 表达式。Grafana首先使用OAuth2 ID令牌评估表达式。如果没有找到角色,则使用从UserInfo端点获取的用户信息评估表达式。评估结果应为有效的Grafana角色(NoneViewerEditorAdminGrafanaAdmin)。有关用户角色映射的更多信息,请参阅 配置角色映射
role_attribute_strict设置为 true 以防止无法使用 role_attribute_pathorg_mapping 提取Grafana组织角色时用户登录。有关用户角色映射的更多信息,请参阅 配置角色映射false
org_attribute_path用于Grafana组织到角色查找的 JMESPath 表达式。Grafana首先使用OAuth2 ID令牌评估表达式。如果没有返回任何值,则使用从UserInfo端点获取的用户信息评估表达式。评估结果将根据 org_mapping 映射到组织角色。有关组织到角色映射的更多信息,请参阅 组织角色映射示例
org_mapping以逗号或空格分隔的 <ExternalOrgName>:<OrgIdOrName>:<Role> 映射列表。值可以是*,表示“所有用户”。角色是可选的,可以是以下值之一:NoneViewerEditorAdmin。有关外部组织到角色映射的更多信息,请参阅 组织角色映射示例
allow_assign_grafana_admin设置为 true 以启用Grafana服务器管理员角色的自动同步。如果此选项设置为 true,并且对用户的 role_attribute_path 进行评估的结果是 GrafanaAdmin,则Grafana将授予用户服务器管理员权限和组织管理员角色。如果此选项设置为 false,并且对用户的 role_attribute_path 进行评估的结果是 GrafanaAdmin,则Grafana将仅授予用户组织管理员角色。有关用户角色映射的更多信息,请参阅 配置角色映射false
skip_org_role_sync设置为true以自动停止用户角色的同步。这将允许您从Grafana内部手动设置您用户的组织角色。false
groups_attribute_path用于用户组查找的JMESPath表达式。Grafana将首先使用OAuth2 ID令牌评估该表达式。如果没有找到组,则使用从UserInfo端点获取的用户信息评估该表达式。评估结果应是一个组字符串数组。
allowed_groups以逗号或空格分隔的组列表。用户至少应属于一个组才能登录。如果您配置了allowed_groups,您还必须配置groups_attribute_path
allowed_organizations以逗号或空格分隔的组织列表。用户至少应属于一个组织才能登录。
allowed_domains以逗号或空格分隔的域。用户至少应属于一个域才能登录。
team_ids团队ID的字符串列表。如果设置,则用户必须属于提供的团队之一才能登录。如果您配置了team_ids,您还必须配置teams_urlteam_ids_attribute_path
team_ids_attribute_path用于在teams_url端点返回的结果中查找Grafana团队ID的JMESPath表达式。
teams_url用于查询团队ID的URL。如果没有设置,默认值是/teams。如果您配置了teams_url,您还必须配置team_ids_attribute_path
tls_skip_verify_insecure如果设置为true,客户端接受服务器提供的任何证书以及该证书中的任何主机名。您应仅用于测试,因为此模式使SSL/TLS易受中间人攻击。false
tls_client_cert证书路径。
tls_client_key密钥路径。
tls_client_ca受信任证书授权列表路径。
use_pkce设置为true以使用代码交换证明密钥 (PKCE)。Grafana使用基于SHA256的S256挑战方法和128字节的(base64url编码)代码验证器。false
use_refresh_token设置为true以使用刷新令牌并检查访问令牌过期。false

通用OAuth2设置的示例

本节包括设置通用OAuth2集成的示例。

使用Descope设置OAuth2

要设置带Descope的通用OAuth2身份验证,请按照以下步骤操作

  1. 在此创建一个Descope项目,并完成入门向导以配置您的身份验证。如果您已经设置了Descope项目,可以跳过此步骤。

  2. 如果您希望使用除“注册或登录”之外的其他流程,请转到控制台中的IdP应用程序菜单,选择您的IdP应用程序。然后修改流程托管URL查询参数?flow=sign-up-or-in以更改要使用的流程ID。

  3. 点击保存

  4. 使用“设置”选项卡中的值更新Grafana配置文件的[auth.generic_oauth]部分

    注意

    您可以在项目设置下找到您的客户端ID(Descope项目ID)。您的客户端密钥(Descope访问密钥)可以在访问密钥下生成。
    bash
    [auth.generic_oauth]
    enabled = true
    allow_sign_up = true
    auto_login = false
    team_ids =
    allowed_organizations =
    name = Descope
    client_id = <Descope Project ID>
    client_secret = <Descope Access Key>
    scopes = openid profile email descope.claims descope.custom_claims
    auth_url = https://api.descope.com/oauth2/v1/authorize
    token_url = https://api.descope.com/oauth2/v1/token
    api_url = https://api.descope.com/oauth2/v1/userinfo
    use_pkce = true
    use_refresh_token = true

使用Auth0设置OAuth2

要设置带Auth0的通用OAuth2身份验证,请按照以下步骤操作

  1. 使用以下参数创建Auth0应用程序

    • 名称:Grafana
    • 类型:常规Web应用程序
  2. 前往应用程序的设置选项卡,将允许的回调URL设置为https://<grafana domain>/login/generic_oauth

  3. 点击保存更改

  4. 使用“设置”选项卡中的值更新Grafana配置文件的[auth.generic_oauth]部分

    bash
    [auth.generic_oauth]
    enabled = true
    allow_sign_up = true
    auto_login = false
    team_ids =
    allowed_organizations =
    name = Auth0
    client_id = <client id>
    client_secret = <client secret>
    scopes = openid profile email offline_access
    auth_url = https://<domain>/authorize
    token_url = https://<domain>/oauth/token
    api_url = https://<domain>/userinfo
    use_pkce = true
    use_refresh_token = true

使用Bitbucket设置OAuth2

要设置通用的OAuth2身份验证与Bitbucket,请按照以下步骤操作

  1. 在Bitbucket中导航到设置 > 工作空间设置 > OAuth消费者

  2. 通过选择添加消费者并使用以下参数来创建应用程序

    • 允许的回调URL: https://<grafana domain>/login/generic_oauth
  3. 点击保存

  4. 使用消费者描述中的KeySecret值更新Grafana配置文件的[auth.generic_oauth]部分

    bash
    [auth.generic_oauth]
    name = BitBucket
    enabled = true
    allow_sign_up = true
    auto_login = false
    client_id = <client key>
    client_secret = <client secret>
    scopes = account email
    auth_url = https://bitbucket.org/site/oauth2/authorize
    token_url = https://bitbucket.org/site/oauth2/access_token
    api_url = https://api.bitbucket.org/2.0/user
    teams_url = https://api.bitbucket.org/2.0/user/permissions/workspaces
    team_ids_attribute_path = values[*].workspace.slug
    team_ids =
    allowed_organizations =
    use_refresh_token = true

默认情况下,刷新令牌包含在授权代码授予的响应中。

使用OneLogin设置OAuth2

要设置通用的OAuth2身份验证与OneLogin,请按照以下步骤操作

  1. 在OneLogin中创建一个新自定义连接器,并使用以下设置

    • 名称:Grafana
    • 登录方式: OpenID Connect
    • 重定向URI: https://<grafana domain>/login/generic_oauth
    • 签名算法: RS256
    • 登录URL: https://<grafana domain>/login/generic_oauth
  2. 将应用程序添加到Grafana连接器

    • 显示名称: Grafana
  3. 使用应用程序详情页面中的SSO选项卡的客户端ID和客户端密钥更新Grafana配置文件的[auth.generic_oauth]部分

    您的OneLogin域将匹配您使用以访问OneLogin的URL。

    bash
    [auth.generic_oauth]
    name = OneLogin
    enabled = true
    allow_sign_up = true
    auto_login = false
    client_id = <client id>
    client_secret = <client secret>
    scopes = openid email name
    auth_url = https://<onelogin domain>.onelogin.com/oidc/2/auth
    token_url = https://<onelogin domain>.onelogin.com/oidc/2/token
    api_url = https://<onelogin domain>.onelogin.com/oidc/2/me
    team_ids =
    allowed_organizations =

使用Dex设置OAuth2

要使用Dex IdP设置通用的OAuth2身份验证,请按照以下步骤操作

  1. 将Grafana添加到Dex配置YAML文件中的客户端

    yaml
    staticClients:
      - id: <client id>
        name: Grafana
        secret: <client secret>
        redirectURIs:
          - 'https://<grafana domain>/login/generic_oauth'

    注意

    与许多其他OAuth2提供商不同,Dex不提供<client secret>。相反,可以使用例如openssl rand -hex 20生成一个密钥。
  2. 更新Grafana配置中的[auth.generic_oauth]部分

    bash
    [auth.generic_oauth]
    name = Dex
    enabled = true
    client_id = <client id>
    client_secret = <client secret>
    scopes = openid email profile groups offline_access
    auth_url = https://<dex base uri>/auth
    token_url = https://<dex base uri>/token
    api_url = https://<dex base uri>/userinfo

    <dex base uri>对应Dex中的issuer: 配置(例如,Dex域可能包括路径,如例如/dex)。当使用刷新令牌时,需要offline_access作用域。