配置 Google OAuth 身份验证
要启用 Google OAuth,您必须在 Google 注册您的应用程序。Google 将为您生成一个客户端 ID 和密钥。
注意
如果用户在 Google 中使用的电子邮件地址与其他身份验证提供商(例如 Grafana.com)使用的电子邮件地址相同,则您需要进行附加配置以确保用户匹配正确。请参阅使用相同的电子邮件地址通过不同身份提供商登录文档以获取更多信息。
创建 Google OAuth 密钥
首先,您需要创建一个 Google OAuth 客户端
- 前往 https://console.developers.google.com/apis/credentials。
- 如果您还没有项目,请创建一个新项目。
- 输入项目名称。组织和位置字段都应设置为您组织的信息。
- 在OAuth 同意屏幕中,选择外部用户类型。点击创建。
- 使用您的 Grafana Cloud 实例 URL 填写请求的信息。
- 接受默认设置,或自定义同意屏幕选项。
- 点击创建凭据,然后在下拉菜单中点击 OAuth 客户端 ID
- 输入以下信息
- 应用程序类型: Web 应用
- 名称: Grafana
- 授权的 JavaScript 来源:
https://<YOUR_GRAFANA_URL>
- 授权的重定向 URI:
https://<YOUR_GRAFANA_URL>/login/google
- 将
<YOUR_GRAFANA_URL>
替换为您的 Grafana 实例的 URL。注意
您输入的 URL 是您的 Grafana 实例主页的 URL,而不是您的 Grafana Cloud 门户 URL。
- 点击创建
- 从“OAuth 客户端”模态框中复制客户端 ID 和客户端密钥
使用 Grafana UI 配置 Google 身份验证客户端
注意
可在
ssoSettingsAPI
功能开关下使用,该开关默认启用。
作为 Grafana 管理员,您可以使用 Google UI 在 Grafana 内部配置 Google OAuth 客户端。为此,导航到管理 > 身份验证 > Google 页面并填写表单。如果您在 Grafana 配置文件中有当前配置,则该表单将预填充这些值;否则,表单将包含默认值。
填写完表单后,点击保存。如果保存成功,Grafana 将应用新配置。
如果您需要将 UI 中所做的更改重置回默认值,请点击重置。重置更改后,Grafana 将应用 Grafana 配置文件中的配置(如果存在配置)或默认值。
注意
如果您以高可用性模式运行 Grafana,配置更改可能不会立即应用于所有 Grafana 实例。您可能需要等待几分钟以便配置传播到所有 Grafana 实例。
使用 Terraform 提供商配置 Google 身份验证客户端
注意
可在
ssoSettingsAPI
功能开关下使用,该开关默认启用。Terraform 提供商从 v2.12.0 开始支持。
resource "grafana_sso_settings" "google_sso_settings" {
provider_name = "google"
oauth2_settings {
name = "Google"
client_id = "CLIENT_ID"
client_secret = "CLIENT_SECRET"
allow_sign_up = true
auto_login = false
scopes = "openid email profile"
allowed_domains = "mycompany.com mycompany.org"
hosted_domain = "mycompany.com"
use_pkce = true
}
}
请访问 Terraform Registry 以获取有关使用 grafana_sso_settings
资源的完整参考。
使用 Grafana 配置文件配置 Google 身份验证客户端
确保您可以访问Grafana 配置文件。
在 Grafana 中启用 Google OAuth
在Grafana 配置文件中指定客户端 ID 和密钥。例如
[auth.google]
enabled = true
allow_sign_up = true
auto_login = false
client_id = CLIENT_ID
client_secret = CLIENT_SECRET
scopes = openid email profile
auth_url = https://#/o/oauth2/v2/auth
token_url = https://oauth2.googleapis.com/token
api_url = https://openidconnect.googleapis.com/v1/userinfo
allowed_domains = mycompany.com mycompany.org
hosted_domain = mycompany.com
use_pkce = true
您可能需要设置 [server]
部分的 root_url
选项,以确保回调 URL 正确。例如,当您在代理后面提供 Grafana 服务时。
重启 Grafana 后端。您现在应该在登录页面看到一个 Google 登录按钮。您现在可以使用您的 Google 帐户登录或注册。allowed_domains
选项是可选的,域名用空格分隔。
您可以通过将 allow_sign_up
选项设置为 true
来允许用户通过 Google 身份验证进行注册。当此选项设置为 true
时,任何通过 Google 身份验证成功认证的用户都将自动注册。
您可以指定一个域名作为 Google OAuth 2.0 身份验证 API 接受的 hd
查询参数传递。请参阅 Google 的 OAuth 文档。
注意
自 Grafana 10.3.0 起,从 Google ID 令牌检索到的
hd
参数也用于确定用户的托管域。Google Oauthallowed_domains
配置选项用于限制对特定域用户的访问。如果设置了allowed_domains
配置选项,则 Google ID 令牌中的hd
参数必须与allowed_domains
配置选项匹配。如果 Google ID 令牌中的hd
参数与allowed_domains
配置选项不匹配,则拒绝用户访问。当帐户不属于 Google Workspace 时,
hd
声明将不可用。此验证默认启用。要禁用此验证,请将
validate_hd
配置选项设置为false
。allowed_domains
配置选项将使用电子邮件声明来验证域名。
PKCE
IETF 的 RFC 7636 引入了“代码交换证明密钥”(PKCE),它提供了额外的保护以防范某些形式的授权码拦截攻击。PKCE 将在 OAuth 2.1 中成为强制要求。
注意
您可以通过在
[auth.google]
部分将use_pkce
设置为false
来禁用 Grafana 中的 PKCE。
配置刷新令牌
当用户使用 OAuth 提供商登录时,Grafana 会验证访问令牌是否已过期。当访问令牌过期时,Grafana 会使用提供的刷新令牌(如果存在)获取新的访问令牌。
Grafana 使用刷新令牌获取新的访问令牌,无需用户再次登录。如果不存在刷新令牌,则 Grafana 会在访问令牌过期后将用户从系统中注销。
默认情况下,Grafana 在授权请求中包含 access_type=offline
参数以请求刷新令牌。
自 Grafana v10.1.0 起,Google 提供商默认启用刷新令牌获取和访问令牌过期检查。如果您想禁用访问令牌过期检查,请将 use_refresh_token
配置值设置为 false
。
注意
accessTokenExpirationCheck
功能开关已在 Grafana v10.3.0 中移除,将改用use_refresh_token
配置值来配置刷新令牌获取和访问令牌过期检查。
配置自动登录
将 auto_login
选项设置为 true 以尝试自动登录,跳过登录屏幕。如果多个身份验证提供商配置为使用自动登录,则此设置将被忽略。
auto_login = true
配置团队同步
通过团队同步,您可以利用用户的 Google 群组轻松将用户添加到团队。要为 Google OAuth 设置团队同步,请参考以下示例。
为 Google OAuth 设置团队同步
在您的组织的控制台上启用 Google Cloud Identity API。
将
https://www.googleapis.com/auth/cloud-identity.groups.readonly
scope 添加到您的 Grafana[auth.google]
配置中示例
[auth.google] # .. scopes = openid email profile https://www.googleapis.com/auth/cloud-identity.groups.readonly
在 Grafana 团队的
外部群组同步
选项卡中配置团队同步。Google 群组的外部群组 ID 是该群组的电子邮件地址,例如dev@grafana.com
。
要了解有关团队同步的更多信息,请参阅配置团队同步。
配置允许的群组
要限制访问仅限于一个或多个群组的已认证用户,请将 allowed_groups
设置为逗号或空格分隔的群组列表。
Google 群组通过群组电子邮件键引用。例如,developers@google.com
。
注意
将
https://www.googleapis.com/auth/cloud-identity.groups.readonly
scope 添加到您的 Grafana[auth.google]
scopes 配置中以检索群组信息。
配置角色映射
除非启用了 skip_org_role_sync
选项,否则用户的角色将在用户登录时设置为从 Google 映射的角色。如果未设置映射,则使用默认实例角色。
用户的角色使用来自 role_attribute_path
配置选项的 JMESPath 表达式检索。要映射服务器管理员角色,请使用 allow_assign_grafana_admin
配置选项。
如果找不到有效的角色,则将用户分配给 auto_assign_org_role
选项中指定的角色。您可以通过设置 role_attribute_strict = true
来禁用此默认角色分配。如果评估 role_attribute_path
和 org_mapping
表达式后返回的角色无效或没有角色,此设置将拒绝用户访问。
为方便配置正确的 JMESPath 表达式,请访问 JMESPath 使用自定义负载测试和评估表达式。
注意
默认情况下,
skip_org_role_sync
选项是启用的。在 Grafana v10.3.0 及更高版本中,skip_org_role_sync
选项默认为 false。
角色映射示例
本节包含用于角色映射的 JMESPath 表达式示例。
组织角色映射示例
Google 集成在 org_mapping
配置中使用外部用户的群组,根据其 Google 群组成员身份映射组织和角色。
在此示例中,用户在 org_foo
组织中被授予了 Viewer
角色,在 org_bar
和 org_baz
组织中被授予了 Editor
角色。
外部用户属于以下 Google 群组:group-1
和 group-2
。
配置
org_mapping = group-1:org_foo:Viewer group-2:org_bar:Editor *:org_baz:Editor
使用 OAuth 令牌中的用户信息映射角色
在此示例中,电子邮件为 admin@company.com
的用户被授予 Admin
角色。所有其他用户被授予 Viewer
角色。
role_attribute_path = email=='admin@company.com' && 'Admin' || 'Viewer'
skip_org_role_sync = false
使用群组映射角色
在此示例中,来自 Google 群组 'example-group@google.com' 的用户被授予 Editor
角色。所有其他用户被授予 Viewer
角色。
role_attribute_path = contains(groups[*], 'example-group@google.com') && 'Editor' || 'Viewer'
skip_org_role_sync = false
注意
将
https://www.googleapis.com/auth/cloud-identity.groups.readonly
scope 添加到您的 Grafana[auth.google]
scopes 配置中以检索群组信息。
映射服务器管理员角色
在此示例中,电子邮件为 admin@company.com
的用户被授予 Admin
组织角色以及 Grafana 服务器管理员角色。所有其他用户被授予 Viewer
角色。
allow_assign_grafana_admin = true
skip_org_role_sync = false
role_attribute_path = email=='admin@company.com' && 'GrafanaAdmin' || 'Viewer'
将一个角色映射给所有用户
在此示例中,无论从身份提供商接收到的用户信息如何,所有用户都被分配了 Viewer
角色。
role_attribute_path = "'Viewer'"
skip_org_role_sync = false
配置选项
下表概述了各种 Google OAuth 配置选项。您可以像 Grafana 中的任何其他配置一样将这些选项作为环境变量应用。有关更多信息,请参阅使用环境变量覆盖配置。
设置 | 必需 | Cloud 支持 | 描述 | 默认 |
---|---|---|---|---|
enabled | 否 | 是 | 启用 Google 身份验证。 | false |
name | 否 | 是 | Grafana 用户界面中引用 Google 身份验证的名称。 | Google |
icon | 否 | 是 | Grafana 用户界面中用于 Google 身份验证的图标。 | google |
client_id | 是 | 是 | 应用程序的客户端 ID。 | |
client_secret | 是 | 是 | 应用程序的客户端密钥。 | |
auth_url | 是 | 是 | Google OAuth 提供程序的授权端点。 | https://#/o/oauth2/v2/auth |
token_url | 是 | 是 | 用于获取 OAuth2 访问令牌的端点。 | https://oauth2.googleapis.com/token |
api_url | 是 | 是 | 用于获取与 OpenID UserInfo 兼容的用户信息的端点。 | https://openidconnect.googleapis.com/v1/userinfo |
auth_style | 否 | 是 | 当从 OAuth2 提供程序请求 ID 令牌时使用的 OAuth2 AuthStyle 的名称。它决定了如何将 client_id 和 client_secret 发送给 Oauth2 提供程序。可用值为 AutoDetect 、InParams 和 InHeader 。 | AutoDetect |
scopes | 否 | 是 | 逗号或空格分隔的 OAuth2 范围列表。 | openid email profile |
allow_sign_up | 否 | 是 | 控制通过 Google 登录创建 Grafana 用户。如果设置为 false ,则只有现有的 Grafana 用户才能使用 Google 登录。 | true |
auto_login | 否 | 是 | 设置为 true 以使用户绕过登录屏幕并自动登录。如果配置了多个身份验证提供程序使用自动登录,则忽略此设置。 | false |
hosted_domain | 否 | 是 | 指定域以限制对来自该域的用户的访问。此值使用 hd 参数附加到授权请求中。 | |
validate_hd | 否 | 是 | 设置为 false 以禁用对 Google ID 令牌中的 hd 参数的验证。更多信息,请参阅在 Grafana 中启用 Google OAuth。 | true |
role_attribute_strict | 否 | 是 | 设置为 true 以在无法使用 role_attribute_path 或 org_mapping 提取 Grafana 组织角色时拒绝用户登录。有关用户角色映射的更多信息,请参阅配置角色映射。 | false |
org_attribute_path | 否 | 否 | 用于 Grafana 组织到角色查找的 JMESPath 表达式。Grafana 将首先使用 OAuth2 ID 令牌评估表达式。如果未返回值,则将使用从 UserInfo 端点获取的用户信息评估表达式。评估结果将根据 org_mapping 映射到组织角色。有关组织到角色映射的更多信息,请参阅组织角色映射示例。 | |
org_mapping | 否 | 否 | 逗号或空格分隔的 <ExternalOrgName>:<OrgIdOrName>:<Role> 映射列表。值可以是 * ,表示“所有用户”。角色是可选的,可以具有以下值:None 、Viewer 、Editor 或 Admin 。有关外部组织到角色映射的更多信息,请参阅组织角色映射示例。 | |
allow_assign_grafana_admin | 否 | 否 | 设置为 true 以自动同步 Grafana 服务器管理员角色。启用后,如果 Google 用户的 App 角色是 GrafanaAdmin ,则 Grafana 会授予用户服务器管理员权限和组织管理员角色。如果禁用,用户将只获得组织管理员角色。有关用户角色映射的更多详细信息,请参阅映射角色。 | false |
skip_org_role_sync | 否 | 是 | 设置为 true 以停止自动同步用户角色。这将允许您从 Grafana 内部手动设置用户的组织角色。 | false |
allowed_groups | 否 | 是 | 逗号或空格分隔的组列表。用户必须是至少一个组的成员才能登录。如果配置了 allowed_groups ,则还必须按照配置允许的组 配置 Google 以包含 groups claim。 | |
allowed_organizations | 否 | 是 | 逗号或空格分隔的 Azure 租户标识符列表。用户必须是至少一个租户的成员才能登录。 | |
allowed_domains | 否 | 是 | 逗号或空格分隔的域列表。用户必须属于至少一个域才能登录。 | |
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 编码)的代码验证器。 | true |
use_refresh_token | 否 | 是 | 启用使用刷新令牌并检查访问令牌过期。启用后,Grafana 会自动将 promp=consent 和 access_type=offline 参数添加到授权请求中。 | true |
signout_redirect_url | 否 | 是 | 用户注销后重定向到的 URL。 |