Skip to content

Commit 4bab5e3

Browse files
committed
add sso doc
1 parent 072fe01 commit 4bab5e3

5 files changed

Lines changed: 393 additions & 1 deletion

File tree

content/zh/docs/usecase/_index.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
---
2-
title : "功能设计"
2+
title : "功能详解"
33
lead: ""
44
date: 2025-06-06T10:41:08+08:00
55
lastmod: 2025-06-06T10:41:08+08:00

content/zh/docs/usecase/sso.md

Lines changed: 392 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,392 @@
1+
---
2+
title: "单点登录(SSO)"
3+
description: "夜莺监控(Nightingale)支持单点登录(SSO)功能,可以通过 SSO 方式登录夜莺监控。SSO 支持多种协议,如 OAuth2、OIDC 等。"
4+
date: 2025-06-20T08:16:11.095+08:00
5+
lastmod: 2025-06-20T08:16:11.095+08:00
6+
draft: false
7+
images: []
8+
menu:
9+
docs:
10+
parent: "usecase"
11+
weight: 10200
12+
toc: true
13+
---
14+
15+
夜莺监控(Nightingale)支持单点登录(SSO)功能,支持 LDAP、CAS、OAuth2、OIDC 等多种协议。SSO 功能可以让用户通过统一的身份认证系统登录夜莺监控,简化用户管理和登录流程,也降低了安全风险。
16+
17+
对于 CAS、OAuth2、OIDC 三种方式,用户通过 SSO 登录夜莺之后,夜莺会判断当前登录的用户是否存在于夜莺的用户表中,如果不存在,则会自动创建一个用户,如果存在,夜莺会用 SSO 中的用户信息覆盖夜莺中已有用户的信息(前提是配置项 `CoverAttributes = true`,后文会介绍),这样的好处是用户只需要在 SSO 那里维护手机号、邮箱即可,夜莺会在用户登录时自动同步(当然,仅是在登录时同步,所以用户至少要通过 SSO 登录过一次夜莺,否则夜莺中没有这个用户的信息)。
18+
19+
## 配置 OIDC
20+
21+
这是最推荐的方式,如果你的 SSO 同时支持 OIDC 和 OAuth2,建议使用 OIDC。
22+
23+
### 配置项说明
24+
25+
下面是 OIDC 各个配置项的说明:
26+
27+
```toml
28+
# 是否开启 OIDC 单点登录,夜莺可以同时开启多个 SSO 方式
29+
Enable = false
30+
31+
# 登录页面会展示 SSO 登录地址的超链接,DisplayName 用于配置超链接的文本内容
32+
DisplayName = 'OIDC'
33+
34+
# IDC 登录验证通过后,需要跳转到夜莺,下面是配置夜莺用于 OIDC 的回调地址
35+
# 您需要把 n9e.com 替换为您的夜莺地址,/callback 是固定的路径
36+
RedirectURL = 'http://n9e.com/callback'
37+
38+
# OIDC SSO 服务器根地址,换成您的 OIDC 服务器地址
39+
SsoAddr = 'http://sso.example.org'
40+
41+
# OIDC SSO 服务器的登出地址,用户在夜莺中点击登出时会跳转到这个地址,即可完成夜莺和 SSO 的同步登出
42+
SsoLogoutAddr = 'http://sso.example.org/session/end'
43+
44+
# OIDC 给夜莺分配的 ClientId 和 ClientSecret,必须要配置,一般是在 SSO 服务器上注册应用时获取的
45+
ClientId = ''
46+
ClientSecret = ''
47+
48+
# 用户通过 SSO 登录夜莺,夜莺发现用户在夜莺的用户表中不存在时,会自动创建一个用户
49+
# 创建用户的时候,需要给这个用户一个角色,下面是配置默认角色的列表
50+
DefaultRoles = ['Standard']
51+
52+
# 用户通过 SSO 登录夜莺时,夜莺会向 SSO 服务器请求用户信息,并将用户信息写入夜莺的用户表中
53+
# 如果 CoverAttributes = true 则会覆盖夜莺中已有的用户信息,比如手机号、邮箱等。通常这里就是配置为 true 即可
54+
CoverAttributes = true
55+
56+
# Scope 是 OIDC 协议中的一个概念,表示请求获取的用户信息字段列表,通常就是下面的这些字段
57+
Scopes = ['openid', 'profile', 'email', 'phone']
58+
59+
# 用户在 OIDC 中信息字段和夜莺中的用户信息字段不是 100% 一一对应的
60+
# 所以在下面配置:夜莺的各个字段对应 OIDC 中的哪些字段
61+
# Username、Nickname、Phone、Email 就是夜莺中的用户信息字段
62+
# 后面的 sub、nickname、phone_number、email 就是 OIDC 中的用户字段名
63+
# 请根据您的 OIDC 服务器的用户信息字段进行调整
64+
[Attributes]
65+
Username = 'sub'
66+
Nickname = 'nickname'
67+
Phone = 'phone_number'
68+
Email = 'email'
69+
```
70+
71+
### 配置项 FAQ
72+
73+
**1. 用户使用 OIDC 可以登录成功,但是用户名、手机号等获取不到**
74+
75+
可以调整夜莺的日志级别为 DEBUG(在 config.toml 中调整),然后重启夜莺,过滤日志关键字:`sso_exchange_user: oidc info`,再测试一遍登录,可以查看从单点登录系统获取到的用户信息有哪些,然后根据实际情况调整 `Attributes` 中的字段映射。
76+
77+
### 对接 Authing 演示
78+
79+
下面使用 [Authing](https://www.authing.com/) 作为 OIDC 的 SSO 服务器进行演示。首先,要在 Authing 上创建一个应用,获取 ClientId 和 ClientSecret。
80+
81+
<img src="/img/usecase/sso/authing-oidc.png" alt="Authing OIDC" />
82+
83+
然后在夜莺中配置 OIDC 的相关信息:
84+
85+
```toml
86+
Enable = true
87+
DisplayName = 'OIDC'
88+
RedirectURL = 'http://192.168.127.151:17000/callback'
89+
SsoAddr = 'https://n9e.authing.cn/oidc'
90+
SsoLoginOutAddr = 'https://n9e.authing.cn/oidc/session/end'
91+
ClientId = '65befb5b452d4854f9731b9b'
92+
ClientSecret = '0af4...'
93+
CoverAttributes = true
94+
DefaultRoles = ['Standard']
95+
Scopes = ['openid', 'profile', 'username', 'email', 'phone']
96+
97+
[Attributes]
98+
Username = 'username'
99+
Nickname = 'nickname'
100+
Phone = 'phone_number'
101+
Email = 'email'
102+
```
103+
104+
上面的 `192.168.127.151:17000` 是我这个测试环境的夜莺地址,您需要替换为自己的夜莺地址。
105+
106+
### 对接飞书演示
107+
108+
飞书也支持 OIDC 协议,我们对这种方式也做一个说明。参考飞书的官方文档创建应用:[配置应用单点登录](https://anycross.feishu.cn/documentation/platform/configure-sso),相关配置:
109+
110+
- 授权模式:可以把 authorization_code 和 refresh_token 都选上
111+
- Scope:可以把 openid profile email phone offline_access 都选上
112+
- 回调地址:填写 `http://n9e.com/callback`,注意把 `n9e.com` 替换为您的夜莺地址,需要公网可达,除非您的飞书也是私有化内网部署的
113+
114+
配置完成之后即可拿到 Issuer(即 SSO Server 地址)、ClientId 和 ClientSecret,配置到夜莺中。另外,也可以拿到 SSO Logout 地址,是一个类似这样的地址:
115+
116+
```
117+
https://anycross.feishu.cn/sso/....../oidc/revoke
118+
```
119+
120+
这个地址也配置到夜莺的 `SsoLogoutAddr` 中,虽然配置了这个地址,但是无法联动登出,下面是飞书文档的 [官方解释说明](https://anycross.feishu.cn/documentation/platform/configure-sso)
121+
122+
> 由于 SSO 应用的登录态是从飞书登录态派生出的,因此不支持单点登出,即在 SSO 应用登出的时候,不能同时登出飞书。虽然平台提供了单点登出的地址,但这个地址是为了防止三方系统将其设置为必填项,地址本身并不生效。
123+
124+
最终夜莺中的配置如下:
125+
126+
```toml
127+
Enable = true
128+
DisplayName = 'OIDC'
129+
RedirectURL = 'http://n9e.com/callback'
130+
SsoAddr = 'https://anycross.feishu.cn/sso/XXXXX'
131+
SsoLoginOutAddr = 'https://anycross.feishu.cn/sso/XXXXX/oidc/revoke'
132+
ClientId = 'xxx'
133+
ClientSecret = 'xxx'
134+
CoverAttributes = true
135+
DefaultRoles = ['Standard']
136+
Scopes = ['openid', 'profile', 'email', 'phone']
137+
138+
[Attributes]
139+
Username = 'name'
140+
Nickname = 'name'
141+
Phone = 'phone_number'
142+
Email = 'email'
143+
```
144+
145+
> 上面的 `n9e.com` 需要替换为您自己的夜莺地址,需要公网可达,除非您的飞书也是私有化内网部署的。
146+
147+
## 配置 OAuth2
148+
149+
如果您的 SSO 既支持 OIDC 又支持 OAuth2,建议使用 OIDC,实在没办法再使用 OAuth2,OAuth2 坑多。
150+
151+
### 配置项说明
152+
153+
```toml
154+
# 是否开启 OAuth2 单点登录,夜莺可以同时开启多个 SSO 方式
155+
Enable = false
156+
157+
# 登录页面会展示 SSO 登录地址的超链接,DisplayName 用于配置超链接的文本内容
158+
DisplayName = 'OAuth2'
159+
160+
# SSO 登录验证通过后,需要跳转到夜莺,下面是配置夜莺用于 OAuth2 的回调地址
161+
# 您需要把 n9e.com 替换为您的夜莺地址,/callback/oauth 是固定的路径
162+
RedirectURL = 'http://n9e.com/callback/oauth'
163+
164+
# OAuth2 SSO 服务器根地址,换成您的 OAuth2 服务器地址
165+
SsoAddr = 'https://sso.example.com/oauth2/authorize'
166+
167+
# OAuth2 SSO 服务器的登出地址,用户在夜莺中点击登出时会跳转到这个地址,即可完成夜莺和 SSO 的同步登出
168+
SsoLogoutAddr = 'https://sso.example.com/oauth2/authorize/session/end'
169+
170+
# 获取 OAuth2 token 的地址
171+
TokenAddr = 'https://sso.example.com/oauth2/token'
172+
173+
# OAuth2 提供的用户信息地址,夜莺会通过这个地址获取用户信息
174+
UserInfoAddr = 'https://sso.example.com/api/v1/user/info'
175+
176+
# 从 OAuth2 或许用户信息时,需要把上一步获取到的 token 放到请求头中
177+
# token 可以放在 header 中,也可以放在 formdata 或 querystring 中,需要根据您的 OAuth2 服务器的要求进行配置
178+
TranTokenMethod = 'header'
179+
180+
# OAuth2 给夜莺分配的 ClientId 和 ClientSecret,必须要配置,一般是在 SSO 服务器上注册应用时获取的
181+
ClientId = ''
182+
ClientSecret = ''
183+
184+
# 用户通过 SSO 登录夜莺,夜莺发现用户在夜莺的用户表中不存在时,会自动创建一个用户
185+
# 创建用户的时候,需要给这个用户一个角色,下面是配置默认角色的列表
186+
DefaultRoles = ['Standard']
187+
188+
# 用户通过 SSO 登录夜莺时,夜莺会向 SSO 服务器请求用户信息,并将用户信息写入夜莺的用户表中
189+
# 如果 CoverAttributes = true 则会覆盖夜莺中已有的用户信息,比如手机号、邮箱等。通常这里就是配置为 true 即可
190+
CoverAttributes = true
191+
192+
# 从 OAuth2 中获取用户数据时,返回的 JSON 格式数据是否为数组,根据你们的 OAuth2 服务器的返回格式进行配置
193+
# 如果是数组,夜莺会取第一个元素作为用户信息
194+
UserinfoIsArray = false
195+
196+
# OAuth2 用户信息的前缀,通常是 'data',即返回的 JSON 数据中会有一个 'data' 字段,里面是用户信息
197+
UserinfoPrefix = 'data'
198+
199+
# Scope 是 OAuth2 协议中的一个概念,表示请求获取的用户信息字段列表,通常就是下面的这些字段
200+
Scopes = ['profile', 'email', 'phone']
201+
202+
# 用户在 OAuth2 中信息字段和夜莺中的用户信息字段不是 100% 一一对应的
203+
# 所以在下面配置:夜莺的各个字段对应 OAuth2 中的哪些字段
204+
# Username、Nickname、Phone、Email 就是夜莺中的用户信息字段
205+
# 后面的 sub、nickname、phone_number、email 就是 OAuth2 中的用户字段名
206+
# 请根据您的 OAuth2 服务器的用户信息字段进行调整
207+
[Attributes]
208+
Username = 'sub'
209+
Nickname = 'nickname'
210+
Phone = 'phone_number'
211+
Email = 'email'
212+
```
213+
214+
### 对接 Authing 演示
215+
216+
使用 [Authing](https://www.authing.com/) 作为 OAuth2 的 SSO 服务器进行演示。首先,要在 Authing 上启用 OAuth2。配置样例如下:
217+
218+
<img src="/img/usecase/sso/authing-oauth2.png" alt="Authing OAuth2" />
219+
220+
然后在夜莺中配置 OAuth2 的相关信息:
221+
222+
```toml
223+
Enable = true
224+
DisplayName = 'OAuth2'
225+
RedirectURL = 'http://192.168.127.151:17000/callback/oauth'
226+
SsoAddr = 'https://n9e.authing.cn/oauth/auth'
227+
SsoLogoutAddr = 'https://n9e.authing.cn/oauth/session/end'
228+
TokenAddr = 'https://n9e.authing.cn/oauth/token'
229+
UserInfoAddr = 'https://n9e.authing.cn/oauth/me'
230+
TranTokenMethod = 'header'
231+
ClientId = '65befb5b452d4854f9731b9b'
232+
ClientSecret = '0af4...'
233+
CoverAttributes = true
234+
DefaultRoles = ['Standard']
235+
UserinfoIsArray = false
236+
UserinfoPrefix = ''
237+
Scopes = ['profile', 'username', 'email', 'phone']
238+
239+
[Attributes]
240+
Username = 'username'
241+
Nickname = 'nickname'
242+
Phone = 'phone'
243+
Email = 'email'
244+
```
245+
246+
上面的 `192.168.127.151:17000` 是我这个测试环境的夜莺地址,您需要替换为自己的夜莺地址。
247+
248+
## 配置 CAS
249+
250+
夜莺监控(Nightingale)也支持 CAS 协议的单点登录。相比 OIDC,坑更多,慎用。
251+
252+
### 配置项说明
253+
254+
```toml
255+
# 是否开启 CAS 单点登录,夜莺可以同时开启多个 SSO 方式
256+
Enable = false
257+
258+
# 登录页面会展示 SSO 登录地址的超链接,DisplayName 用于配置超链接的文本内容
259+
DisplayName = 'CAS'
260+
261+
# CAS 登录验证通过后,需要跳转到夜莺,下面是配置夜莺用于 CAS 的回调地址
262+
# 您需要把 n9e.com 替换为您的夜莺地址,/callback/cas 是固定的路径
263+
RedirectURL = 'http://n9e.com/callback/cas'
264+
265+
# CAS SSO 服务器根地址,换成您的 CAS 服务器地址
266+
SsoAddr = 'https://cas.example.com/cas'
267+
268+
# CAS SSO 服务器的登出地址,用户在夜莺中点击登出时会跳转到这个地址,即可完成夜莺和 SSO 的同步登出
269+
SsoLogoutAddr = 'https://cas.example.com/cas/session/end'
270+
271+
# LoginPath 这个配置项,是为了兼容不同的 CAS 版本,因为不同的 CAS 版本登录地址可能不同
272+
# 如果您配置了 LoginPath,则夜莺会在 SsoAddr 的基础上拼接 LoginPath 作为登录地址
273+
# 如果您没有配置 LoginPath,夜莺的逻辑是:
274+
# 1. 如果发现 SsoAddr 中包含 p3 关键字,就设置 LoginPath = '/login'
275+
# 2. 如果没有包含 p3 关键字,就设置 LoginPath = '/cas/login'
276+
LoginPath = ''
277+
278+
# 用户通过 SSO 登录夜莺,夜莺发现用户在夜莺的用户表中不存在时,会自动创建一个用户
279+
# 创建用户的时候,需要给这个用户一个角色,下面是配置默认角色的列表
280+
DefaultRoles = ['Standard']
281+
282+
# 用户通过 SSO 登录夜莺时,夜莺会向 SSO 服务器请求用户信息,并将用户信息写入夜莺的用户表中
283+
# 如果 CoverAttributes = true 则会覆盖夜莺中已有的用户信息,比如手机号、邮箱等。通常这里就是配置为 true 即可
284+
CoverAttributes = true
285+
286+
# 用户在 CAS 中信息字段和夜莺中的用户信息字段不是 100% 一一对应的
287+
# 所以在下面配置:夜莺的各个字段对应 CAS 中的哪些字段
288+
# Username、Nickname、Phone、Email 就是夜莺中的用户信息字段
289+
# 后面的 sub、nickname、phone_number、email 就是 CAS 中的用户字段名
290+
# 请根据您的 CAS 服务器的用户信息字段进行调整
291+
[Attributes]
292+
Username = 'sub'
293+
Nickname = 'nickname'
294+
Phone = 'phone_number'
295+
Email = 'email'
296+
```
297+
298+
### 对接 Authing 演示
299+
300+
使用 [Authing](https://www.authing.com/) 作为 CAS 的 SSO 服务器进行演示。首先,要在 Authing 上启用 CAS。配置样例如下:
301+
302+
<img src="/img/usecase/sso/authing-cas.png" alt="Authing CAS" />
303+
304+
然后在夜莺中配置 CAS 的相关信息:
305+
306+
```toml
307+
Enable = true
308+
DisplayName = 'CAS'
309+
RedirectURL = 'http://192.168.127.151:17000/callback/cas'
310+
SsoAddr = 'https://n9e.authing.cn/cas-idp/65befb5b452d4854f9731b9b'
311+
SsoLogoutAddr = 'https://n9e.authing.cn/cas-idp/65befb5b452d4854f9731b9b/logout'
312+
LoginPath = '/login'
313+
CoverAttributes = true
314+
DefaultRoles = ['Standard']
315+
316+
[Attributes]
317+
Username = 'username'
318+
Nickname = 'nickname'
319+
Phone = 'phone_number'
320+
Email = 'email'
321+
```
322+
323+
上面的 `192.168.127.151:17000` 是我这个测试环境的夜莺地址,您需要替换为自己的夜莺地址。
324+
325+
## 配置 LDAP
326+
327+
夜莺监控(Nightingale)也支持 LDAP 协议的认证登录。LDAP 是一种轻量级目录访问协议,通常用于企业内部的用户认证和授权。前面讲到的 SSO 机制(OIDC、OAuth2、CAS)都没法把用户信息周期性全量同步到夜莺中,而 LDAP 则可以做到这一点。
328+
329+
LDAP 在页面上也没有单独的登录超链接入口,用户在输入用户名和密码登录夜莺时,夜莺首先去 DB 中查询用户信息,如果没有找到,则自动检查 LDAP 是否启用,如果启用了,就直接使用 LDAP 进行认证登录。
330+
331+
### 配置项说明
332+
333+
```toml
334+
# 是否开启 LDAP 单点登录,夜莺可以同时开启多个 SSO 方式
335+
Enable = false
336+
337+
# LDAP 服务器地址和端口、TLS、StartTLS 等配置
338+
# 请根据您自己的环境进行配置
339+
Host = 'ldap.example.org'
340+
Port = 389
341+
TLS = false
342+
StartTLS = true
343+
344+
# LDAP 服务器的根 DN,可以 Google、GPT 获取更多信息
345+
BaseDn = 'dc=example,dc=org'
346+
347+
# 管理员信息,这个账号需要具备查询所有用户信息的权限
348+
BindUser = 'cn=manager,dc=example,dc=org'
349+
BindPass = '*******'
350+
351+
# 是否同步 LDAP 中的创建用户至夜莺
352+
SyncAddUsers = false
353+
354+
# 是否同步 LDAP 中的删除用户操作至夜莺
355+
SyncDelUsers = false
356+
357+
# 同步频率,单位:秒
358+
SyncInterval = 86400
359+
360+
# 用户登录时,检查用户是否存在于 LDAp 中的筛选条件
361+
# openldap 和 AD 通常有不同的筛选格式
362+
# openldap 的格式可能为: (&(uid=%s))
363+
# AD 的格式可能为 (&(sAMAccountName=%s))
364+
# 您需要根据您的 LDAP 服务器类型进行调整
365+
AuthFilter = '(&(uid=%s))'
366+
367+
# 查询 LDAP 中全量用户的筛选条件
368+
# 根据您的 LDAP 服务器类型进行调整
369+
UserFilter = '(&(uid=*))'
370+
371+
# 用户通过 LDAP 登录夜莺,夜莺发现用户在夜莺的用户表中不存在时,会自动创建一个用户
372+
# 创建用户的时候,需要给这个用户一个角色,下面是配置默认角色的列表
373+
DefaultRoles = ['Standard']
374+
375+
# 用户通过 LDAP 登录夜莺时,夜莺会向 LDAP 服务器请求用户信息,并将用户信息写入夜莺的用户表中
376+
# 如果 CoverAttributes = true 则会覆盖夜莺中已有的用户信息,比如手机号、邮箱等。通常这里就是配置为 true 即可
377+
CoverAttributes = true
378+
379+
# 用户在 LDAP 中信息字段和夜莺中的用户信息字段不是 100% 一一对应的
380+
# 所以在下面配置:夜莺的各个字段对应 LDAP 中的哪些字段
381+
# Username、Nickname、Phone、Email 就是夜莺中的用户信息字段
382+
# 后面的 uid、cn、mobile、mail 就是 LDAP 中的用户字段名
383+
# 请根据您的 LDAP 服务器的用户信息字段进行调整
384+
[Attributes]
385+
Username = 'uid'
386+
Nickname = 'cn'
387+
Phone = 'mobile'
388+
Email = 'mail'
389+
```
390+
391+
上面的配置信息如果您看完注释还是不清楚如何配置,可以咨询贵司的 LDAP 管理员,他大概率是比较清楚的。
392+
147 KB
Loading
152 KB
Loading
116 KB
Loading

0 commit comments

Comments
 (0)