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

    banner.png

    钉钉 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 版:

    https://auth.guance.com
    

    部署版:

    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 为实际值即可:

    {
        "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 官方文档

    @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 增加或修改如下配置:

    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

    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 服务。

    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 字段映射为平台标准字段),最终实现企业员工使用钉钉账号一键登录,达成统一身份认证管理。

    联系我们

    加入社区

    微信扫码
    加入官方交流群

    立即体验

    在线开通,按量计费,真正的云服务!

    立即开始

    选择观测云版本

    代码托管平台