多地址授权在文章最后。
官方文档:
剂的使用第二种方式,方便前后端无状态的情况下使用state进行传递参数。
方式二 支持网站将钉钉登录二维码内嵌到自己页面中
步骤1:在页面中先引入如下JS文件(支持https)
<script src="https://g.alicdn.com/dingding/dinglogin/0.0.5/ddLogin.js"></script>
步骤2:在需要使用钉钉登录的地方实例化以下JS对象
/*
* 解释一下goto参数,参考以下例子:
* var url = encodeURIComponent('http://localhost.me/index.php?test=1&aa=2');
* var goto = encodeURIComponent('https://oapi.dingtalk.com/connect/oauth2/sns_authorize?appid=appid&response_type=code&scope=snsapi_login&state=STATE&redirect_uri='+url)
*/
var obj = DDLogin({
id:"login_container",//这里需要你在自己的页面定义一个HTML标签并设置id,例如<div id="login_container"></div>或<span id="login_container"></span>
goto: "", //请参考注释里的方式
style: "border:none;background-color:#FFFFFF;",
width : "365",
height: "400"
});
参数 | 说明 |
---|---|
goto | goto参数结构:https://oapi.dingtalk.com/connect/oauth2/sns_authorize?appid=APPID&response_type=code&scope=snsapi_login&state=STATE&redirect_uri=REDIRECT_URI, 并且要将goto参数urlencode编码。 |
style | 渲染二维码的区域的样式,可以自定义去除背景颜色和边框 |
width | 表示显示二维码的区域的宽。width和height不代表二维码的大小,二维码大小是固定的210px*210px。 |
height | 表示显示二维码的区域的高。width和height不代表二维码的大小,二维码大小是固定的210px*210px。 |
您引入的js会在获取用户扫描之后将获取的loginTmpCode通过window.parent.postMessage(loginTmpCode,’*’);返回给您的网站。
您可以通过以下代码获取这个loginTmpCode:
var handleMessage = function (event) {
var origin = event.origin;
console.log("origin", event.origin);
if( origin == "https://login.dingtalk.com" ) { //判断是否来自ddLogin扫码事件。
var loginTmpCode = event.data;
//拿到loginTmpCode后就可以在这里构造跳转链接进行跳转了
console.log("loginTmpCode", loginTmpCode);
}
};
if (typeof window.addEventListener != 'undefined') {
window.addEventListener('message', handleMessage, false);
} else if (typeof window.attachEvent != 'undefined') {
window.attachEvent('onmessage', handleMessage);
}
通过JS获取到loginTmpCode后,需要由你构造并跳转到如下链接:
https://oapi.dingtalk.com/connect/oauth2/sns_authorize?appid=APPID&response_type=code&scope=snsapi_login&state=STATE&redirect_uri=REDIRECT_URI&loginTmpCode=loginTmpCode
此链接处理成功后,会302跳转到你goto参数指定的redirect_uri,并向url参数中追加临时授权码code及state两个参数。
参数 | 必须 | 说明 |
---|---|---|
appid | 是 | 参看第1步获取,代表了你提供的服务, |
redirect_uri | 是 | 重定向地址 (如果是第一种方式需要urlencode编码,如果是第二种方式则需要将JS goto参数整体urlencode编码,不要单独对redirect_uri编码),该地址使用域名需配置为appId对应的回调域名,回调域名是在获取appId及appSecret时填写 |
state | 是 | 用于防止重放攻击,开发者可以根据此信息来判断redirect_uri只能执行一次来避免重放攻击 |
response_type | 是 | 固定为code |
scope | 是 | 固定为snsapi_login |
loginTmpCode | 是 | 通过js获取到的loginTmpCode |
服务端通过临时授权码获取授权用户的个人信息
通过临时授权码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参数 |
返回结果:
{
"errcode": 0,
"errmsg": "ok",
"user_info": {
"nick": "张三",
"openid": "liSii8KCxxxxx",
"unionid": "7Huu46kk"
}
}
钉钉的多地址授权只能通过间接方式实现,再注册一个应用,使用unionid来进行用户唯一性判断,因为同一个账号下面的不同应用,获取到的用户信息里面unionid是一致的,openid不一致.
关于多地址授权的意见和实现方案,我已经反馈给钉钉开发者了,目前已经过了在计划中了,应该后期会安排上。
希望看到的朋友也去后台提一个需求建议,更多的人提,应该会加快进度。
提的方案:
登录授权回调可不可以填写多个地址?因为有的项目需要做迁移,然后需要新旧项目一起跑。我看官方文档关于这个都没有介绍,国外的第三方登录都是可以填写多个回调的,谷歌facebook都可以,连微信都可以了,希望钉钉也能允许多个地址回调。
多个回调不是一次真要回调多个,我们在地址里面填有redirect_uri,你们可以根据我填写的这个redirect_uri判断在不在钉钉这边设置的回调地址里面,如果在的话就回调这一个,不在的话旧报错,这个操作不会对服务器几乎没啥额外工作。希望尽快加上这个功能,多个回调地址用;分割就行了。