钉钉内免登第三方网站
当开发的系统(H5页面)只是在钉钉客户端打开,但并不是一个钉钉应用时,系统可以自动获得正在访问用户的钉钉身份信息,而无需用户再次输入账户密码。
注:此功能与企业应用/第三方企业应用无关,只能用于钉钉客户端内打开的网站,并且不是钉钉内的应用免登,此流程只能做到获取到用户身份。
获取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?signature=kKlP1QmmiNR4VF×tamp=1527130370219&accessKey=yourAppId
请求包结构体:
{
"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"
}
}
参数 | 说明 |
---|---|
nick | 用户在钉钉上面的昵称 |
openid | 用户在当前开放应用内的唯一标识 |
unionid | 用户在当前开放应用所属企业内的唯一标识 |