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

多地址授权在文章最后。

官方文档:

扫码登录第三方网站

剂的使用第二种方式,方便前后端无状态的情况下使用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"
 });
参数说明
gotogoto参数结构: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&timestamp=xxx&signature=xxx
请求包结构体:

{
    "tmp_auth_code": "23152698ea18304da4d0ce1xxxxx"
}

URL签名参数说明:

参数说明
accessKey应用的appId
timestamp当前时间戳,单位是毫秒
signature通过appSecret计算出来的签名值,签名计算方法

参数说明:

参数类型必须说明
tmp_auth_codeString用户授权的临时授权码code,只能使用一次;在前面步骤中跳转到redirect_uri时会追加code参数

返回结果:

{ 
    "errcode": 0,
    "errmsg": "ok",
    "user_info": {
        "nick": "张三",
        "openid": "liSii8KCxxxxx",
        "unionid": "7Huu46kk"
    }
}

钉钉的多地址授权只能通过间接方式实现,再注册一个应用,使用unionid来进行用户唯一性判断,因为同一个账号下面的不同应用,获取到的用户信息里面unionid是一致的,openid不一致.
关于多地址授权的意见和实现方案,我已经反馈给钉钉开发者了,目前已经过了在计划中了,应该后期会安排上。
希望看到的朋友也去后台提一个需求建议,更多的人提,应该会加快进度。
在这里插入图片描述

提的方案:

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

对于使用Spring Boot实现钉钉第三方登录,你可以按照以下步骤进行操作: 1. 在钉钉开放平台注册应用:首先,在钉钉开放平台(https://open-dev.dingtalk.com/)上创建一个新的应用。在创建应用时,选择网页应用类型,并填写相关信息,如应用名称、应用描述、回调URL等。 2. 获取AppKey和AppSecret:创建应用成功后,你将获得一个AppKey和AppSecret,这是与钉钉服务器进行交互的凭证。 3. 配置Spring Boot项目:在你的Spring Boot项目中,添加相应的依赖,如钉钉SDK(dingtalk-sdk-java),以便与钉钉服务器进行交互。你可以在项目的pom.xml文件中添加以下依赖: ```xml <dependency> <groupId>com.dingtalk</groupId> <artifactId>dingtalk-sdk-java</artifactId> <version>2.0.2</version> </dependency> ``` 4. 实现登录逻辑:编写相应的代码来处理钉钉的登录逻辑。可以创建一个Controller来处理登录请求,然后在登录请求中调用钉钉SDK提供的接口来获取用户信息。 ```java @RestController public class DingTalkLoginController { @Autowired private DingTalkClient dingTalkClient; @GetMapping("/login") public String login(@RequestParam("code") String code) { // 使用钉钉SDK获取用户信息 DingTalkClient.UserInfo userInfo = dingTalkClient.getUserInfo(code); // 在这里进行用户信息的处理和登录逻辑 return "登录成功"; } } ``` 5. 配置回调URL:在钉钉开放平台上,将回调URL配置为你的Spring Boot项目中的登录接口URL,例如:http://localhost:8080/login。 6. 测试登录:启动你的Spring Boot应用,并在浏览器中访问钉钉登录页面,授权后将跳转到你的回调URL,并携带授权码(code)。在回调URL中,将获取到的code参数传递给登录接口进行处理。 以上是一个简单的实现钉钉第三方登录的步骤,你可以根据自己的需求进行适当的调整和扩展。注意保护敏感信息,如AppKey和AppSecret,不要直接暴露在代码中或公开可见的地方。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

SHUIPING_YANG

你的鼓励是我创作的最大动力。

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值