第一步、先登录钉钉开发者后台。

在进入开发者后台之后记得先保存一下CorpId。

第二步、进入场景群开发。

点击进入应用开发——创建应用——添加网页应用。


第三步、进入创建的应用

进入应用之后进入“网页应用”。

进入之后按照提示进行输入。

这个应用首页地址和PC端首页地址一般都是我们的登录地址。

之后进入去权限管理----通讯录权限。

除却第二页的通讯录基本数据读权限、通讯录可触达规则读写权限、通讯录专属帐号迁移数据读权限、通讯录数据可见范围管理权限、通讯录专属帐号安全数据读写权限,这几个之外都要申请权限。

再点击版本管理与发布把使用范围调整为全部员工。

最后点击安全设置,填写服务器出口IP、回调域名。


案例:直接填写当前客户环境的服务器IP和地址即可

最后生成应用凭证,AgentId、AppKey、AppSecret。记得保存,后面会用到。

第四步、进入正式环境进行单点登录配置

进入正式环境后,点击系统设置,进入集成管理,再点击单点登录平台。

点击新增。


标题:钉钉

所属部门:中国建筑

认证方式:授权码

应用类型:钉钉

如下图:

认证参数填写如下图:

{
    "appkey": "dingxxxxxxxx",
    "corpid": "dingxxxxxxxxxxxxxxxxxxxxxxxxx",
    "agentId": xxxxx,
    "version": "v2",
    "appsecret": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
    "login_inner": true,               #可选参数,遇到反复登录、重复登录、每次都弹出登录按钮问题时,可设置"login_inner"=true,默认为false,调试时需要设置为false。

    "verify": false     #SSL验证,不配默认为true
}


这些配置完成后,点击确认会自动生成应用标识码。

第五步、单点登录阶段配置

2023年2月后新建的钉钉应用看这里:

钉钉后台权限管理(钉钉文档:https://open.dingtalk.com/document/orgapp/tutorial-obtaining-user-personal-information):


整体配置,以下配置敏感参数已经处理过,仅用于案例演示:

1.认证参数:

{
    "corpid": "ding2e271f5229a65c816d4a392a90f97fcb1e091",(对应app_id)
    "agentId": 25346192234,
    "version": "v2",

    "appKey": "dingjqw3ezqd6dq5ied7qn1k",
    "app_secret": "u1F9-KG0jw_OkDYo_BOrw3J7F6wpvz3br-t0XXBywsB12W4aF2eVU39bM39f3I76vOeA8i"(对应appSecret)

    "login_inner": true               #可选参数,遇到反复登录、重复登录、每次都弹出登录按钮问题时,可设置"login_inner"=true,默认为false,调试时需要设置为false。
}

2.重定向:

redirect_1

 接口:https://login.dingtalk.com/oauth2/auth?redirect_uri=https%3A%2F%2Fmingcloud.hcmcloud.com%2Flogin%3Fsso%3Dplatform_f7840b1be52098a0a15a9b8b30130f6859bca319%26next_stage%3Drequest_1&response_type=code&client_id=dingjqw3ezqd6dq5ied7qn1k&scope=openid&state=dingjqw3ezqd6dq5ied7qn1k&prompt=consent

redirect_uri:参数是系统登录地址和对应的跳转应用,需进行一次编码:https%3A%2F%2Fmingcloud.hcmcloud.com%2Flogin%3Fsso%3Dplatform_f7840b1be52098a0a15a9b8b30130f6859bca319%26next_stage%3Drequest_1

解码后:https://mingcloud.hcmcloud.com/login?sso=platform_f7840b1be52098a0a15a9b8b30130f6859bca319&next_stage=request_1

构成:域名+/login?sso=platform_单点登录配置的&next_stage=request_1

调试模式:在上一行的“构成”中,加一个debug=1参数开启,每十分钟保存一个用户的单点登录过程信息到redis中,信息包括各个阶段的请求参数、返回参数等信息,redis的key为:“platform_debug_redis_token_” + 点单登录平台的id。

3.请求1,获取用户令牌:

request_1

接口:https://api.dingtalk.com/v1.0/oauth2/userAccessToken

参数配置:

{
    "data": {
        "common": {
            "clientId": "dingjqw3ezqd6dq5ied7qn1k",
            "grantType": "authorization_code",
            "clientSecret": "u1F9-KG0jw_OkDYo_BOrw3J7F6wpvz3br-t0XXBywsB12W4aF2eVU39bM39f3I76vOeA8i"
        },
        "set_cache": true,
        "expire_time": 7200,
        "stage_response": [{
            "key": "authCode",
            "map": "code",
            "stage": "redirect_1"
        }]
    }
}

参数配置v2版:
{
    "data_v2": {
        "code": "=get_value_from_dict(['redirect_1','authCode'],'无')",
        "clientId": "dinguiv5oqlpyc****",
        "grantType": "authorization_code",
        "clientSecret": "QqWbOs37SHiB6xungtB49W1hhb-pPfNjEPjFQKibbSArc4z0MgqRe5do8****"
    }
}
图示:
4.请求2,获取用户信息:

request_2

接口:https://api.dingtalk.com/v1.0/contact/users/me

请求头配置:

{
    "special": {
        "stage_response": [{
            "key": ["accessToken"],
            "map": "x-acs-dingtalk-access-token",
            "stage": "request_1"
        }]
    }
}

参数配置v2版:
{
    "special_v2": {
        "x-acs-dingtalk-access-token": "=get_value_from_dict(['request_1','accessToken'],'无')"
    }
}

图示:


5.请求3,获取应用令牌:

request_3

接口:https://oapi.dingtalk.com/gettoken

配置:

{
    "params": {
        "common": {
            "appkey": "dingjqw3ezqd6dq5ied7qn1k",
            "appsecret": "u1F9-KG0jw_OkDYo_BOrw3J7F6wpvz3br-t0XXBywsB12W4aF2eVU39bM39f3I76vOeA8i"
        },
        "set_cache": true,
        "expire_time": 7200
    }
}

参数配置v2版:
{
    "params_v2": {
        "appkey": "dinguiv5oqlpyc****",
        "appsecret": "QqWbOs37SHiB6xungtB49W1hhb-pPfNjEPjFQKibbSArc4z0MgqRe5do8A****"
    }
}
图示:


6.请求4,获取用户信息:

request_4

接口:https://oapi.dingtalk.com/user/getUseridByUnionid

配置:

{
    "params": {
        "stage_response": [{
            "key": ["access_token"],
            "map": "access_token",
            "stage": "request_3"
        }, {
            "key": ["unionId"],
            "map": "unionid",
            "stage": "request_2"
        }]
    }
}

参数配置v2版:
{
    "params_v2": {
        "unionid": "=get_value_from_dict(['request_2','unionId'],'无')",
        "access_token": "=get_value_from_dict(['request_3','access_token'],'无')"
    }
}

图示

7.请求5,获取用户全部信息:

request_5

接口:https://oapi.dingtalk.com/user/get

配置:

{
    "params": {
        "stage_response": [{
            "key": ["access_token"],
            "map": "access_token",
            "stage": "request_3"
        }, {
            "key": ["userid"],
            "map": "userid",
            "stage": "request_4"
        }]
    }
}

参数配置v2版:
{
    "params_v2": {
        "userid": "=get_value_from_dict(['request_4','userid'],'无')",
        "access_token": "=get_value_from_dict(['request_3','access_token'],'无')"
    }
}

图示


8.获取本地用户

get_local_user

接口:

配置:

{
    "key": ["mobile"],
    "map": "mobile",
    "open_id": ["userid"]
}

图示:


9.钉钉应用地址示例:

https://mingcloud.hcmcloud.com/login?sso=platform_f7840b1b1e520198a0a15a9b8b30130f6859bca3119


报错时可展示信息黑名单,逗号分隔:

配置完单点应用阶段配置后,从钉钉进入系统时,若请求发送错误,将打开一个弹窗展示错误信息,报错信息包括请求参数、响应、以及阶段信息,但是其中会包含敏感信息,这时需要配置“报错时可展示信息黑名单”。将敏感信息用“*”号隐藏。

配置前:

配置方法:

效果:

请求校验:

校验request_x的返回值,有时第三方接口的响应值会有一些特殊的标记用来验证请求是否正确,例如errcode、errors等,他们的值代表着不同的涵义,如errcode=0时表示请求成功,若需要使用这些特殊标记来校验请求是否正确,可以配置“请求校验”.

配置方法:

(注:"response_success_key":"要校验的标记",”response_success_value“:["可以校验通过的值1","可以校验通过的值2".......])

效果:


单点调试:

在配置单点登录阶段配置完时,若需要查看单点过程中各个阶段的所有请求的参数与返回值,可以在redirect_1阶段中的redirect_url参数中加入debug=1参数,注意url编码,在尝试一次从钉钉单点登录后,通过勾选对应单点登录平台配置,点击单点调试,将打开一个弹窗,展示各个阶段的请求与响应。这一次单点调试信息将保存10分钟,且不可被覆盖,若需要重新获取,可进入 ”域名/server/redis“ 中搜索 “platform_debug_redis_token_” + 点单登录平台的id,并删除。

配置方法:

效果:

旧版:

redirect_1:配置如下图


图中的交互接口是由https://oapi.dingtalk.com/connect/oauth2/sns_authorize?+appid=din23wcode(刚刚让你保存过的)&state=STATE&redirect_uri=https://hr.cscec.com/login?sso=(上图的应用标识码)&next_stage=request_1

上面的交互接口记得去解码工具中进行一下编码。

request_1:按照下图进行配置

阶段类型不变,交互接口按照上图就可以,请求方式也如上图,

请求头如下:

{
    "Content-Type": "application/json"
}

参数配置如下:

{
    "data": {
        "stage_response": [{
            "key": "code",
            "map": "tmp_auth_code",
            "stage": "redirect_1"
        }]
    },
    "params": {
        "common": {
            "accessKey": "之前让你保存过的appkey"
        },
        "func_params": [{
            "args": ["之前让你保存过的AppSecret"],
            "func": "get_ding_auth_params"
        }]
    }
}

request_2:按照下图配置

                             

交互接口为:https://oapi.dingtalk.com/gettoken?appkey=(之前保存的key)&appsecret=之前让你保存过的appsecret,记得去编码一下。

request_3:按照下图配置

请求头:

{
    "Content-Type": "application/json"
}

参数配置:

request_4:按照下图配置

参数配置:

get_local_user:按照下图配置

参数配置:

{
    "key": ["mobile"],
    "map": "mobile",
    "stage": "request_4",
    "open_id": ["userid"],
    "sso_user": ["result"]
}

以上步骤配置之后点击确认保存。

以上就是我关于钉钉集成单点登录新方法的全部内容。