单点登录(SSO)
夜莺监控(Nightingale)支持单点登录(SSO)功能,支持 LDAP、CAS、OAuth2、OIDC 等多种协议。SSO 功能可以让用户通过统一的身份认证系统登录夜莺监控,简化用户管理和登录流程,也降低了安全风险。
对于 CAS、OAuth2、OIDC 三种方式,用户通过 SSO 登录夜莺之后,夜莺会判断当前登录的用户是否存在于夜莺的用户表中,如果不存在,则会自动创建一个用户,如果存在,夜莺会用 SSO 中的用户信息覆盖夜莺中已有用户的信息(前提是配置项 CoverAttributes = true,后文会介绍),这样的好处是用户只需要在 SSO 那里维护手机号、邮箱即可,夜莺会在用户登录时自动同步(当然,仅是在登录时同步,所以用户至少要通过 SSO 登录过一次夜莺,否则夜莺中没有这个用户的信息)。
配置 OIDC
这是最推荐的方式,如果你的 SSO 同时支持 OIDC 和 OAuth2,建议使用 OIDC。
配置项说明
下面是 OIDC 各个配置项的说明:
Enable = false
DisplayName = 'OIDC'
RedirectURL = 'http://n9e.com/callback'
SsoAddr = 'http://sso.example.org'
SsoLogoutAddr = 'http://sso.example.org/session/end'
ClientId = '' ClientSecret = ''
DefaultRoles = ['Standard']
CoverAttributes = true
Scopes = ['openid', 'profile', 'email', 'phone']
[Attributes] Username = 'sub' Nickname = 'nickname' Phone = 'phone_number' Email = 'email'
|
配置项 FAQ
1. 用户使用 OIDC 可以登录成功,但是用户名、手机号等获取不到
可以调整夜莺的日志级别为 DEBUG(在 config.toml 中调整),然后重启夜莺,过滤日志关键字:sso_exchange_user: oidc info,再测试一遍登录,可以查看从单点登录系统获取到的用户信息有哪些,然后根据实际情况调整 Attributes 中的字段映射。
对接 Authing 演示
下面使用 Authing 作为 OIDC 的 SSO 服务器进行演示。首先,要在 Authing 上创建一个应用,获取 ClientId 和 ClientSecret。

然后在夜莺中配置 OIDC 的相关信息:
Enable = true DisplayName = 'OIDC' RedirectURL = 'http://192.168.127.151:17000/callback' SsoAddr = 'https://n9e.authing.cn/oidc' SsoLoginOutAddr = 'https://n9e.authing.cn/oidc/session/end' ClientId = '65befb5b452d4854f9731b9b' ClientSecret = '0af4...' CoverAttributes = true DefaultRoles = ['Standard'] Scopes = ['openid', 'profile', 'username', 'email', 'phone']
[Attributes] Username = 'username' Nickname = 'nickname' Phone = 'phone_number' Email = 'email'
|
上面的 192.168.127.151:17000 是我这个测试环境的夜莺地址,您需要替换为自己的夜莺地址。
对接飞书演示
飞书也支持 OIDC 协议,我们对这种方式也做一个说明。参考飞书的官方文档创建应用:配置应用单点登录,相关配置:
- 授权模式:可以把 authorization_code 和 refresh_token 都选上
- Scope:可以把 openid profile email phone offline_access 都选上
- 回调地址:填写
http://n9e.com/callback,注意把 n9e.com 替换为您的夜莺地址,需要公网可达,除非您的飞书也是私有化内网部署的
配置完成之后即可拿到 Issuer(即 SSO Server 地址)、ClientId 和 ClientSecret,配置到夜莺中。另外,也可以拿到 SSO Logout 地址,是一个类似这样的地址:
这个地址也配置到夜莺的 SsoLogoutAddr 中,虽然配置了这个地址,但是无法联动登出,下面是飞书文档的 官方解释说明:
由于 SSO 应用的登录态是从飞书登录态派生出的,因此不支持单点登出,即在 SSO 应用登出的时候,不能同时登出飞书。虽然平台提供了单点登出的地址,但这个地址是为了防止三方系统将其设置为必填项,地址本身并不生效。
最终夜莺中的配置如下:
Enable = true DisplayName = 'OIDC' RedirectURL = 'http://n9e.com/callback' SsoAddr = 'https://anycross.feishu.cn/sso/XXXXX' SsoLoginOutAddr = 'https://anycross.feishu.cn/sso/XXXXX/oidc/revoke' ClientId = 'xxx' ClientSecret = 'xxx' CoverAttributes = true DefaultRoles = ['Standard'] Scopes = ['openid', 'profile', 'email', 'phone']
[Attributes] Username = 'name' Nickname = 'name' Phone = 'phone_number' Email = 'email'
|
上面的 n9e.com 需要替换为您自己的夜莺地址,需要公网可达,除非您的飞书也是私有化内网部署的。
对接 Keycloak 演示
之前有网友写过一篇文章,讲解 Grafana 和夜莺一起对接 Keycloak,大家可以参考:Grafana 和夜莺通过 Keycloak 深度对接整合。
配置 OAuth2
如果您的 SSO 既支持 OIDC 又支持 OAuth2,建议使用 OIDC,实在没办法再使用 OAuth2,OAuth2 坑多。
配置项说明
Enable = false
DisplayName = 'OAuth2'
RedirectURL = 'http://n9e.com/callback/oauth'
SsoAddr = 'https://sso.example.com/oauth2/authorize'
SsoLogoutAddr = 'https://sso.example.com/oauth2/authorize/session/end'
TokenAddr = 'https://sso.example.com/oauth2/token'
UserInfoAddr = 'https://sso.example.com/api/v1/user/info'
TranTokenMethod = 'header'
ClientId = '' ClientSecret = ''
DefaultRoles = ['Standard']
CoverAttributes = true
UserinfoIsArray = false
UserinfoPrefix = 'data'
Scopes = ['profile', 'email', 'phone']
[Attributes] Username = 'sub' Nickname = 'nickname' Phone = 'phone_number' Email = 'email'
|
对接 Authing 演示
使用 Authing 作为 OAuth2 的 SSO 服务器进行演示。首先,要在 Authing 上启用 OAuth2。配置样例如下:

然后在夜莺中配置 OAuth2 的相关信息:
Enable = true DisplayName = 'OAuth2' RedirectURL = 'http://192.168.127.151:17000/callback/oauth' SsoAddr = 'https://n9e.authing.cn/oauth/auth' SsoLogoutAddr = 'https://n9e.authing.cn/oauth/session/end' TokenAddr = 'https://n9e.authing.cn/oauth/token' UserInfoAddr = 'https://n9e.authing.cn/oauth/me' TranTokenMethod = 'header' ClientId = '65befb5b452d4854f9731b9b' ClientSecret = '0af4...' CoverAttributes = true DefaultRoles = ['Standard'] UserinfoIsArray = false UserinfoPrefix = '' Scopes = ['profile', 'username', 'email', 'phone']
[Attributes] Username = 'username' Nickname = 'nickname' Phone = 'phone' Email = 'email'
|
上面的 192.168.127.151:17000 是我这个测试环境的夜莺地址,您需要替换为自己的夜莺地址。
配置 CAS
夜莺监控(Nightingale)也支持 CAS 协议的单点登录。相比 OIDC,坑更多,慎用。
配置项说明
Enable = false
DisplayName = 'CAS'
RedirectURL = 'http://n9e.com/callback/cas'
SsoAddr = 'https://cas.example.com/cas'
SsoLogoutAddr = 'https://cas.example.com/cas/session/end'
LoginPath = ''
DefaultRoles = ['Standard']
CoverAttributes = true
[Attributes] Username = 'sub' Nickname = 'nickname' Phone = 'phone_number' Email = 'email'
|
对接 Authing 演示
使用 Authing 作为 CAS 的 SSO 服务器进行演示。首先,要在 Authing 上启用 CAS。配置样例如下:

然后在夜莺中配置 CAS 的相关信息:
Enable = true DisplayName = 'CAS' RedirectURL = 'http://192.168.127.151:17000/callback/cas' SsoAddr = 'https://n9e.authing.cn/cas-idp/65befb5b452d4854f9731b9b' SsoLogoutAddr = 'https://n9e.authing.cn/cas-idp/65befb5b452d4854f9731b9b/logout' LoginPath = '/login' CoverAttributes = true DefaultRoles = ['Standard']
[Attributes] Username = 'username' Nickname = 'nickname' Phone = 'phone_number' Email = 'email'
|
上面的 192.168.127.151:17000 是我这个测试环境的夜莺地址,您需要替换为自己的夜莺地址。
配置 LDAP
夜莺监控(Nightingale)也支持 LDAP 协议的认证登录。LDAP 是一种轻量级目录访问协议,通常用于企业内部的用户认证和授权。前面讲到的 SSO 机制(OIDC、OAuth2、CAS)都没法把用户信息周期性全量同步到夜莺中,而 LDAP 则可以做到这一点。
LDAP 在页面上也没有单独的登录超链接入口,用户在输入用户名和密码登录夜莺时,夜莺首先去 DB 中查询用户信息,如果没有找到,则自动检查 LDAP 是否启用,如果启用了,就直接使用 LDAP 进行认证登录。
配置项说明
Enable = false
Host = 'ldap.example.org' Port = 389 TLS = false StartTLS = true
BaseDn = 'dc=example,dc=org'
BindUser = 'cn=manager,dc=example,dc=org' BindPass = '*******'
SyncAddUsers = false
SyncDelUsers = false
SyncInterval = 86400
AuthFilter = '(&(uid=%s))'
UserFilter = '(&(uid=*))'
DefaultRoles = ['Standard']
CoverAttributes = true
[Attributes] Username = 'uid' Nickname = 'cn' Phone = 'mobile' Email = 'mail'
|
上面的配置信息如果您看完注释还是不清楚如何配置,可以咨询贵司的 LDAP 管理员,他大概率是比较清楚的。