钉钉第三方登录,多地址授权

多地址授权在文章最后。

官方文档:

扫码登录第三方网站

剂的使用第二种方式,方便前后端无状态的情况下使用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,例如
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来进行用户唯一性判断,因为同一个账号下面的不同应用,获取到的用户信息里面openid是一致的,openid不一致。
关于多地址授权的意见和实现方案,我已经反馈给钉钉开发者了,目前已经过了在计划中了,应该后期会安排上。
希望看到的朋友也去后台提一个需求建议,更多的人提,应该会加快进度。
钉钉第三方登录,多地址授权_第1张图片

提的方案:

登录授权回调可不可以填写多个地址?因为有的项目需要做迁移,然后需要新旧项目一起跑。我看官方文档关于这个都没有介绍,国外的第三方登录都是可以填写多个回调的,谷歌facebook都可以,连微信都可以了,希望钉钉也能允许多个地址回调。
多个回调不是一次真要回调多个,我们在地址里面填有redirect_uri,你们可以根据我填写的这个redirect_uri判断在不在钉钉这边设置的回调地址里面,如果在的话就回调这一个,不在的话旧报错,这个操作不会对服务器几乎没啥额外工作。希望尽快加上这个功能,多个回调地址用;分割就行了。

你可能感兴趣的:(钉钉第三方登录,多地址授权)