当开发的系统(H5页面)只是在钉钉客户端打开,但并不是一个钉钉应用时,系统可以自动获得正在访问用户的钉钉身份信息,而无需用户再次输入账户密码。
注意:此功能与企业应用/第三方企业应用无关,只能用于钉钉客户端内打开的网站,并且不是钉钉内的应用免登,此流程只能做到获取到用户身份。
获取appId及appSecret
点击进入钉钉开发者平台 的页面,点击左侧菜单的【移动接入应用-登录】,然后点击右上角的【创建扫码登录应用授权】,创建用于免登过程中验证身份的appId及appSecret,创建后即可看到appId和appSecret。
需提交字段 | 说明 |
名称 | 授权微应用的名称,必填 |
描述 | 说明扫码登录使用的场景,必填 |
授权页面LOGO地址 | 会显示在授权页面的中间页中,以http或https开头,必填 |
回调域名 | 微应用回调的URL,以http或https开头,必填 |
构造要跳转的链接
构造如下跳转链接,此链接处理成功后,会重定向跳转到指定的redirect_uri,并向url追加临时授权码code及state两个参数。
https://oapi.dingtalk.com/connect/oauth2/sns_authorize?appid=APPID&response_type=code&scope=snsapi_auth&state=STATE&redirect_uri=REDIRECT_URI
参数 | 说明 |
appid | 参看第1步获取,代表了你提供的服务,必填 |
redirect_uri | 重定向地址(需要urlencode编码),该地址所在域名需要配置为appid对应的安全域名,必填 |
state | 用于防止重放攻击,开发者可以根据此信息来判断redirect_uri只能执行一次来避免重放攻击, 选填 |
response_type | 固定值为code,必填 |
scope | 取值为snsapi_auth,必填(snsapi_auth用于钉钉容器内获取用户授权) |
服务端通过临时授权码获取授权用户的个人信息
通过临时授权码Code获取用户信息,临时授权码只能使用一次。
请求方式:POST(HTTPS)
请求地址:https://oapi.dingtalk.com/sns/getuserinfo_bycode?accessKey=xxx×tamp=xxx&signature=xxx
请求包结构体:
{ "tmp_auth_code": "23152698ea18304da4d0ce1xxxxx" }
URL签名参数说明:
参数 | 说明 |
accessKey | 应用的appId |
timestamp | 当前时间戳,单位是毫秒 |
signature | 通过appSecret计算出来的签名值,签名计算方法 |
参数说明:
参数 | 类型 | 必须 | 说明 |
tmp_auth_code | String | 是 | 用户授权的临时授权码code,只能使用一次;在前面步骤中跳转到redirect_uri时会追加code参数 |
SDK请求示例(JAVA):
DefaultDingTalkClient client = new DefaultDingTalkClient("https://oapi.dingtalk.com/sns/getuserinfo_bycode"); OapiSnsGetuserinfoBycodeRequest req = new OapiSnsGetuserinfoBycodeRequest(); req.setTmpAuthCode("4a2c5695b78738d495f47b5fee9160cd"); OapiSnsGetuserinfoBycodeResponse response = client.execute(req,"yourAppId","yourAppSecret");
SDK请求示例(PHP):
include "TopSdk.php"; $c = new DingTalkClient(DingTalkConstant::$CALL_TYPE_OAPI, DingTalkConstant::$METHOD_POST , DingTalkConstant::$FORMAT_JSON); $req = new OapiSnsGetuserinfoBycodeRequest; $req->setTmpAuthCode("4a2c5695b78738d495f47b5fee9160cd"); $resp=$c->executeWithAccessKey($req, "https://oapi.dingtalk.com/sns/getuserinfo_bycode","yourAppId","yourAppSecret"); var_dump($resp)
返回结果:
{ "errcode": 0, "errmsg": "ok", "user_info": { "nick": "张三", "openid": "liSii8KCxxxxx", "unionid": "7Huu46kk" } }
参数 | 说明 |
errcode | 返回码 |
errmsg | 对返回码的文本描述内容 |
user_info | |
└ nick | 用户在钉钉上面的昵称 |
└ openid | 用户在当前开放应用内的唯一标识 |
└ unionid | 用户在当前开放应用所属企业的唯一标识 |
根据unionid获取userid
如果开发者需要通过unionid获取到userid,可参考《根据unionid获取userid》。
注意,接口调用需要使用AccessToken,可参考《获取access_token》。
根据userid获取用户信息
如果开发者希望获取用户更多信息,比如部门信息、邮箱等,可以调用服务端API-通讯录管理-用户管理-“获取用户详情”接口获取,可参考《获取用户详情》。