观测云集成钉钉 SSO 最佳实践

钉钉 SSO 介绍

钉钉 SSO(Single Sign-On)是钉钉提供的企业级身份认证服务,允许员工使用钉钉账号直接登录观测云平台,实现企业统一身份管理。

核心价值:

  • 统一身份管理:员工无需记忆多套账号密码,一个钉钉账号即可访问观测云
  • 提升安全性:基于企业已有的钉钉组织架构进行身份认证,降低账号泄漏风险
  • 简化运维:员工入/离职时,通过钉钉统一管控即可同步变更观测云访问权限
  • 协议适配:钉钉未提供标准 OIDC 协议,本方案通过自定义适配层实现对接

观测云

观测云是一款专为 IT 工程师打造的全链路可观测产品,它集成了基础设施监控、应用程序性能监控和日志管理,为整个技术栈提供实时可观察性。这款产品能够帮助工程师全面了解端到端的用户体验追踪,了解应用内函数的每一次调用,以及全面监控云时代的基础设施。此外,观测云还具备快速发现系统安全风险的能力,为数字化时代提供安全保障。

钉钉开放平台配置

第 1 步:创建钉钉应用

1、登录钉钉开放平台

2、进入应用开发钉钉应用 ,点击创建应用

3、填写应用基本信息:

  • 应用名称:建议命名为"观测云"或类似名称
  • 应用描述:可描述为"用于观测云的单点登录应用"

4、点击确定完成创建

5、创建完成后会自动跳转应用管理页面,点击添加应用能力 ,选择网页应用 ,点击添加

6、点击版本管理与发布 ,点击创建新版本 ,输入版本号和描述,应用可用范围按需选择员工范围,然后点击保存完成应用发布

第 2 步:获取 Client ID 和 Client Secret

1、应用创建完成后,进入应用详情页面

2、在凭证与基础信息页面,找到以下信息:

  • AppID(Client ID) :应用的唯一标识
  • AppSecret(Client Secret) :应用的密钥

3、妥善保管这两个信息,后续在观测云中需要配置

第 3 步:配置回调地址(Redirect URI)

1、在钉钉应用的配置页面中,点击安全设置

2、在重定向 URI(Redirect URI)字段中添加对应的回调地址

SaaS 版:

arduino 复制代码
https://auth.guance.com

部署版:

arduino 复制代码
https://your-domain.com/oidc/callback

注意:your-domain.com 替换为你的实际访问域名

3、点击添加完成保存

第 4 步:配置权限范围

1、在应用的权限管理中,确保申请或授予以下权限:

  • Contact.User.Read:通讯录个人信息读权限
  • Contact.User.mobile:个人手机号信息

2、确保这些权限已通过审核

SaaS 版配置

SaaS 版的 OIDC 配置通过管理控制台进行,无需修改配置文件。

第 1 步:访问管理控制台

1、登录观测云 SaaS 控制台

2、进入管理成员管理SSO 管理

第 2 步:添加 OIDC 配置

1、点击 OIDC添加身份提供商

2、填写以下信息并点击保存

字段 说明
身份提供商 SSO 服务商名称,可自定义
配置文件 上传配置文件(配置内容见下文)
访问限制 填写本公司的邮箱域名,用于 SaaS 登录时识别正确的 SSO 入口
角色授权 可选,新用户第一次登录时的默认角色

第 3 步:配置文件内容

配置文件模板如下,只需修改 clientIdclientSecret 为实际值即可:

bash 复制代码
{
    "wellKnowURL": "",
    "sslVerify": true,
    "clientId": "<clientId>",
    "clientSecret": "<clientSecret>",
    "grantType": "authorization_code",
    "scope": [
        "openid"
    ],
    "authSet": {
        "url": "https://login.dingtalk.com/oauth2/auth",
        "verify": true,
        "paramMapping": {
            "response_type": "code",
            "redirect_uri": "$redirect_uri",
            "client_id": "$client_id",
            "scope": "openid"
        }
    },
    "getTokenSet": {
        "url": "https://api.dingtalk.com/v1.0/oauth2/userAccessToken",
        "verify": true,
        "method": "post",
        "authMethod": "basic",
        "paramMapping": {
            "code": "$code",
            "state": "$state",
            "grant_type": "$grant_type",
            "redirect_uri": "$redirect_uri",
            "client_id": "$client_id",
            "client_secret": "$client_secret"
        }
    },
    "verifyTokenSet": {
        "url": "",
        "verify": true,
        "method": "get",
        "keys": []
    },
    "getUserInfoSet": {
        "url": "https://api.dingtalk.com/v1.0/contact/users/me",
        "method": "get",
        "authMethod": "bearer",
        "source": "origin",
        "responseInfoPath": "",
        "paramMapping": {}
    },
    "claimMapping": {
        "username": "nick",
        "email": "email",
        "mobile": "mobile"
    }
}

第 4 步:测试 SSO 登录

在观测云登录页面进行 SSO 登录验证:

登录成功后看到对应用户信息,即表示配置完成:

部署版配置

第 1 步:创建 Well-Known 接口

由于钉钉不提供标准 OIDC 协议,需要使用 Func 平台提供 Well-Known 接口。

登录 Func 平台,创建如下脚本,并创建 API 服务,获取请求地址作为 OIDC Well-Known 接口,具体 Func 使用方法参考 Func 官方文档

python 复制代码
@DFF.API("wellknown")
def wellknown():
    return {
      "authorization_endpoint": "https://login.dingtalk.com/oauth2/auth", 
      "token_endpoint": "https://api.dingtalk.com/v1.0/oauth2/userAccessToken",
      "userinfo_endpoint": "https://api.dingtalk.com/v1.0/contact/users/me"
    }

第 2 步:配置 forethought-core/core

在 Launcher 中进入命名空间: forethought-corecore,为 config.yaml 增加或修改如下配置:

yaml 复制代码
OIDCClientSet:
  # 开启自定义 OIDC
  enableCustomOIDC: true

  # 指向 Func 中 well_know 函数的 API 地址
  wellKnowURL: "<Func well_know API 地址>"

  mapping:
    username: nick
    mobile: mobile
    email: email
    exterId: openId

第 3 步:配置前端登录入口

在 Launcher 中进入命名空间: forethought-webclientfront-web-config,修改 config.js

css 复制代码
window.DEPLOYCONFIG = {
  ...
  paasCustomLoginInfo: [
    {
      label: "OIDC 登录",
      url: "https://<部署版 Web 域名>/oidc/login",
      desc: "自定义 OIDC 登录"
    }
  ],
  paasCustomLoginUrl: "https://<IdP 登出地址>?redirect_url=https://<部署版 Web 域名>/oidc/login"
}

第 4 步:配置 Web Nginx 转发规则

命名空间: forethought-webclientfront-web-config 中修改 nginx.conf,将 OIDC 登录和回调请求转发到 inner 服务。

ini 复制代码
location /oidc/login {
    proxy_connect_timeout 5;
    proxy_send_timeout 5;
    proxy_read_timeout 300;
    proxy_http_version 1.1;
    proxy_set_header Connection "keep-alive";
    add_header Access-Control-Allow-Origin *;
    add_header Access-Control-Allow-Headers X-Requested-With;
    add_header Access-Control-Allow-Methods GET,POST,OPTIONS;
    proxy_pass http://inner.forethought-core:5000/api/v1/inner/oidc/login;
}

location /oidc/callback {
    proxy_connect_timeout 5;
    proxy_send_timeout 5;
    proxy_read_timeout 300;
    proxy_http_version 1.1;
    proxy_set_header Connection "keep-alive";
    add_header Access-Control-Allow-Origin *;
    add_header Access-Control-Allow-Headers X-Requested-With;
    add_header Access-Control-Allow-Methods GET,POST,OPTIONS;
    proxy_pass http://inner.forethought-core:5000/api/v1/inner/oidc/callback;
}

这一步的目的是让浏览器访问的 /oidc/login/oidc/callback 最终进入部署版内部的 OIDC 处理逻辑。

等待服务重启完成,然后验证配置。

常见问题与故障排查

Q1:回调地址不匹配错误

现象: 登录时显示 redirect_uri mismatch 或相似错误

排查步骤:

  1. 确认钉钉应用配置中的回调地址与平台中的 Redirect URI 完全相同
  2. 检查是否有多余的 / 或大小写差异
  3. 确认使用的是 HTTPS(如平台配置为 HTTPS)
  4. 对于部署版,确认 launcher.yaml 中的 redirectUrl 与钉钉应用配置一致

Q2:Invalid Client ID 或认证失败

现象: 登录时提示客户端无效或认证失败

排查步骤:

  1. 验证 Client ID 和 Client Secret 是否正确复制(避免多余空格)
  2. 确认钉钉应用未被禁用或删除
  3. 检查 Client Secret 是否过期(某些情况下需要重新生成)
  4. 确认应用权限配置无问题

Q3:用户信息获取失败

现象: 登录时无法获取用户邮箱或其他信息

排查步骤:

  1. 确认钉钉应用已申请获取成员详情的权限
  2. 检查字段映射是否正确(字段名是否拼写错误)
  3. 验证钉钉账号是否完善(如邮箱是否已填写)
  4. 检查平台日志,查看具体的错误信息

Q4:登录后仍无权限访问

现象: 登录成功但无法访问平台资源

排查步骤:

  1. 确认用户已被添加到对应组织中
  2. 检查用户是否拥有正确的角色和权限
  3. 如使用了新用户名,确认权限是否已分配给新用户名

Q5:部署版重启后配置丢失

现象: 重启服务后 OIDC 配置消失

排查步骤:

  1. 确认配置已写入 ConfigMap(Kubernetes)或配置文件(Docker)
  2. 检查文件权限是否正确
  3. 查看启动日志中是否有配置加载错误
  4. 验证 YAML 格式是否正确(缩进、语法等)

Q6:不同用户使用同一邮箱导致冲突

现象: 多个钉钉用户有相同的邮箱,导致 SSO 异常

排查步骤:

  1. 确保字段映射中使用 subuid 作为唯一标识,而不是邮箱
  2. 在钉钉管理后台检查并修正重复邮箱
  3. 必要时手动在平台中合并或管理用户账号

总结

本方案通过自定义 OIDC 协议适配层,解决了钉钉不提供标准 OIDC 协议的问题。部署版需在 Func 平台创建 Well-Known 接口映射钉钉 OAuth 端点,并修改 Core 配置及 Nginx 转发规则,SaaS 版则通过管理控制台上传配置文件完成适配。核心流程包括:在钉钉开放平台创建应用获取 Client ID 和 Client Secret、配置回调地址和权限,在平台端完成 OIDC 参数映射(将钉钉的 nickmobileemail 字段映射为平台标准字段),最终实现企业员工使用钉钉账号一键登录,达成统一身份认证管理。

相关推荐
何中应1 天前
Promehteus如何指定数据路径
运维·prometheus·监控
一个扣子2 天前
OpenClaw 运维完全手册|日志分析、实时监控与故障排查指南
运维·监控·故障排查·健康检查·openclaw·clawmetry·openclawdoctor
星哥说事4 天前
告别付费监控!Huggingface免费部署Uptime Kuma,自建专属监控系统
监控
腹黑天蝎座4 天前
从零实现一个前端监控系统:性能、错误与用户行为全方位监控
前端·监控
科技风向标go7 天前
2026监控摄像头TOP10权威发布;格行视精灵、小米、萤石、海康、360怎么选?TOP10品牌优缺点一句话总结
网络·安全·监控·户外安防
FORCECON17 天前
力控SCADA城市轨道交通综合监控系统,综合调度,智慧运维,全景一体化监控,保障安全高效运营
运维·监控·scada·报警·轨道交通·供电·综合调度
kyriewen8 天前
线上Bug炸了,用户骂你你却不知道?前端监控教你“远程开天眼”
前端·javascript·监控
indexsunny11 天前
互联网大厂Java面试实战:从Spring Boot到微服务架构的深度探讨
java·数据库·spring boot·安全·微服务·监控·面试实战
SkyWalking中文站14 天前
使用 TraceQL 查询 SkyWalking 和 Zipkin 链路追踪数据并在 Grafana 中可视化
运维·grafana·监控