• 公司如果有在使用钉钉,向企业管理员申请一个开发者权限。
  • 如果觉得麻烦,可以自己去钉钉平台注册一个企业,不需要认证的。

创建第三方授权应用

1、 选择 工作台 tab 页 2、 拉取至末尾,选择自建应用/或者直接进入 钉钉开发者后台:

3、 在开发者后台页面,选择企业内部开发,然后单击创建应用

4、 在弹出的页面中填写基本信息,然后单击确定创建。

  • 应用类型:选择H5微应用。
  • 开发方式:选择企业自主开发。

5、应用创建完成后,在基础信息页面,复制应用的AppKeyAppSecret备用,后面会使用到!

6、单击开发管理进入开发管理页面,然后单击修改,并根据以下内容配置开发信息。

注意:服务器出口IP是公网IP。 应用首页地址填写后端服务部署的服务器的IP或域名

添加接口权限

1.登录开发者后台-点击应用开发-企业内部应用,找到对应的应用并点击。

2.单击权限管理进入权限管理页面,根据以下配置添加接口调用权限。

(1)权限范围选择全部员工

(2)选择个人权限,申请个人手机号信息通讯录个人信息读权限。

配置花生壳域名

如果还没有的话,可以买一个。我记得当时花了 6 元,体验版内网穿透永久使用。如果价格变了,可以评论区联系我,我帮你进行映射。也可以自己去使用 natApp,其实无所谓使用什么,只要钉钉能请求到你的服务就行!

花生壳官网

设置第三方网站的回调域名

  1. 登录开发者后台,找到对应的应用,并点击应用。
  2. 单击登录与分享,填写回调域名,点击添加

    这个回调域名对应后端服务真实存在的接口。

编码

基本思路

1、获取钉钉二维码界面(即下方:dingtalk-authorize-url方法)

2、扫描二维码成功后进入回调方法(即下方:callback方法)

3、在回调方法中获取accessToken

4、在回调方法中根据code和accessToken获取用户信息(重点是用户的openId)

5、在回调方法中根据用户的openId去自己系统的用户表中查询是否存在对应的用户。这一步已经是系统的业务逻辑了。如下:

  • 1、用户还未注册,就使用扫码登录,跳转绑定页面,可以使用邮箱、手机号绑定。(如果手机号、邮箱不存在则同时进行注册)!
  • 2、用户注册了,第一次使用扫码登录,进行绑定,可以使用邮箱、手机号绑定!
  • 3、用户注册并已绑定,则表示登录成功,跳转至系统首页。

加入依赖

<!--新版本-->
<dependency><groupId>com.aliyun</groupId><artifactId>dingtalk</artifactId><version>1.4.78</version>
</dependency><!--旧版本-->
<dependency><groupId>com.aliyun</groupId><artifactId>alibaba-dingtalk-service-sdk</artifactId><version>2.0.0</version>
</dependency>复制代码

生成页面授权地址

@GetMapping("/dingtalk-authorize-url")
public void authorizeUrl (HttpServletResponse response) throws IOException {HashMap<String, Object> map = new HashMap<>();map.put("redirect_uri","https://4xh8921864.eicp.vip/awesome/login/callback/ding-talk");map.put("response_type","code");map.put("client_id","dinghjaqszom29kxzgbl");map.put("scope","openid");map.put("state","dddd");map.put("prompt","consent");String post = HttpUtil.toParams(map);// 重定向,当然也可以将改地址返回给前端,让其将二维码内嵌到页面中,适配网站设计response.sendRedirect("https://login.dingtalk.com/oauth2/auth?" + post);
}
复制代码
参数 是否必填 说明
redirect_uri 授权通过/拒绝后回调地址。需要与开发者后台登录与分享中配置的地址保持一致。
response_type 固定值为code。授权通过后返回authCode。
client_id 企业内部应用:client_id为应用的AppKey。第三方企业应用:client_id为应用的SuiteKey。就是上面需要你复制备用的 AppKey 的值。
scope 授权范围,授权页面显示的授权信息以应用注册时配置的为准。当前只支持两种输入: openid:授权后可获得用户 userid openid corpid:授权后可获得用户id和登录过程中用户选择的组织id,空格分隔。注意url编码。
state 原样返回。
prompt 值为 consent 时,会进入授权确认页。
org_type 控制输出特定类型的组织列表,org_type=management 表示只输出有管理权限的组织。scope包含 corpid 时该参数存在意义。
corpId 用于指定用户需要选择的组织。 scope 包含corpid时该参数存在意义。 传入的corpId需要是当前用户所在的组织。
exclusiveLogin true表示专属帐号登录,展示组织代码输入页。
exclusiveCorpId 开启了专属帐号功能的组织corpId。 exclusiveLogin为true时,该参数表示直接进入该组织的登录页。exclusiveLogin为false时,该参数无意义。

组装路径如下:

https://login.dingtalk.com/oauth2/auth?redirect_uri=https://4xh8921864.eicp.vip/awesome/login/callback/ding-talk&response_type=code&client_id=dinghjaqszom29kxzgbl&scope=openid&state=dddd&prompt=consent
复制代码

访问第三方网站地址

1、在浏览器里输入上方生成的地址并回车

2、使用扫码或者通过钉钉账号登录。

-  无登录状态时显示:
复制代码

- 登录状态时显示:

3、单击立即登录,触发请求设置的第三方网站的回调域名,钉钉在url返回authCode。如下图所示。

回调方法

@RequestMapping("/callback/{source}")
public String callback1(@PathVariable String source, ScanLoginAuthCallbackReq req)  {//1、获取 accesstokenGetUserTokenResponseBody body = null;try {body = getAccessToken(req.getAuthCode());} catch (Exception e) {log.error("获取 accesstoken 失败",e);}String accessToken = body.getAccessToken();try {// 获取用户通讯录个人信息,
如需获取当前授权人的信息,unionId参数必须传mereturn contactUsers(accessToken,"me");} catch (Exception e) {log.error("获取用户通讯录个人信息 失败",e);}return null;
}@Data
public class ScanLoginAuthCallbackReq {private String authCode;private String state;
}
复制代码
  • 根据authCode,调用服务端获取用户token接口,获取用户个人token。
/*** 获取访问凭证,使用 authCode 和应用的信息,调用获取用户token接口得到 access_token* @param authCode* @return* @throws Exception*/
public GetUserTokenResponseBody getAccessToken(String authCode) throws Exception {com.aliyun.dingtalkoauth2_1_0.Client client = dingtalkoauth2_1_0();GetUserTokenRequest getUserTokenRequest = new GetUserTokenRequest().setClientId("请替换为正确的应用信息的AppKey").setClientSecret("请替换为正确的应用信息的AppSecret").setCode(authCode).setGrantType("authorization_code");try {GetUserTokenResponse userToken = client.getUserToken(getUserTokenRequest);System.out.println(JSONObject.toJSONString(userToken));GetUserTokenResponseBody body = userToken.getBody();return body;} catch (TeaException err) {if (!com.aliyun.teautil.Common.empty(err.code) && !com.aliyun.teautil.Common.empty(err.message)) {// err 中含有 code 和 message 属性,可帮助开发定位问题}} catch (Exception _err) {TeaException err = new TeaException(_err.getMessage(), _err);if (!com.aliyun.teautil.Common.empty(err.code) && !com.aliyun.teautil.Common.empty(err.message)) {// err 中含有 code 和 message 属性,可帮助开发定位问题}}return null;
}public static com.aliyun.dingtalkoauth2_1_0.Client dingtalkoauth2_1_0() throws Exception {Config config = new Config();config.protocol = "https";config.regionId = "central";return new com.aliyun.dingtalkoauth2_1_0.Client(config);
}
复制代码
  • 根据用户个人token,调用获取用户通讯录个人信息接口,实现获取用户个人信息。
/*** 获取用户通讯录个人信息* @param accessToken* @param unionId* @throws Exception*/
public String contactUsers(String accessToken,String unionId) throws Exception {com.aliyun.dingtalkcontact_1_0.Client client = dingtalkcontact_1_0();GetUserHeaders getUserHeaders = new GetUserHeaders();getUserHeaders.xAcsDingtalkAccessToken = accessToken;try {GetUserResponse userWithOptions = client.getUserWithOptions(unionId, getUserHeaders, new RuntimeOptions());GetUserResponseBody body = userWithOptions.getBody();return JSONObject.toJSONString(body);} catch (TeaException err) {if (!com.aliyun.teautil.Common.empty(err.code) && !com.aliyun.teautil.Common.empty(err.message)) {// err 中含有 code 和 message 属性,可帮助开发定位问题}} catch (Exception _err) {TeaException err = new TeaException(_err.getMessage(), _err);if (!com.aliyun.teautil.Common.empty(err.code) && !com.aliyun.teautil.Common.empty(err.message)) {// err 中含有 code 和 message 属性,可帮助开发定位问题}}return "";
}public static com.aliyun.dingtalkcontact_1_0.Client dingtalkcontact_1_0() throws Exception {Config config = new Config();config.protocol = "https";config.regionId = "central";return new com.aliyun.dingtalkcontact_1_0.Client(config);
}
复制代码

浏览器查看用户个人相关信息。如下图所示。

历史接口

各位小伙伴对接的时候可能还对接过如下这个接口:

https://oapi.dingtalk.com/connect/qrconnect?appid= SuiteKey
&response_type=code&scope=snsapi_login
&state=STATE&redirect_uri=REDIRECT_URI
复制代码

官方文档链接 官方文档说明: 使用扫码登录第三方网站产品功能进行升级,请开发者优先参考新的文档 实现登录第三方网站 。本篇文档将于2021年12月21日迁移至历史文档,功能暂不会下线,之前已使用此功能的应用可以正常调用。开发者可以根据使用情况,评估是否切换。

使用该接口的好处就是可以省略获取 access_token 的步骤,调用该接口,会302跳转到指定的redirect_uri并向url参数中追加临时授权码code及state参数,使用该接口返回的临时授权码调用根据sns临时授权码获取用户信息 就可以获取用户的 openid。

Spring Boot 接入钉钉扫码登录相关推荐

  1. 钉钉开发系列(十一)钉钉网页扫码登录

    在<钉钉开发系列(八)二维码扫描登录的实现>介绍了一种扫码登录的方式,该方式是自己产生二维码,二维码中的URL指到自身的服务器页面,在该页面中以JSSDK的方式来获取钉钉用户的信息.钉钉官 ...

  2. SpringBoot实现扫码登录

    文章目录 一.概述 1.扫码登录介绍 2.扫码登录原理 二.扫码登录实战(轮询版) 1.环境准备 2.RedisTemplate序列化 3.Token工具类 4.定义扫码状态 5.定义返回类 6.定义 ...

  3. 钉钉扫码登录cs架构,winform设计钉钉扫码客户端

    先上效果图 下面开始流程: 准备工作 你需要一个注册钉钉的账号,以获取APPID: 你还需要你要登录的第三方网站的网址,以及一张网站logo图片的地址: 具体步骤: 1.注册成功后,登录,进行如下四步 ...

  4. 微信官方你真的懂OAuth2?Spring Security OAuth2整合企业微信扫码登录

    ❝ 企业微信扫码登录DEMO参见文末. 现在很多企业都接入了企业微信,作为私域社群工具,企业微信开放了很多API,可以打通很多自有的应用.既然是应用,那肯定需要做登录.正好企业微信提供了企业微信扫码授 ...

  5. SpringSecurity OAuth2实现单点登录,微信扫码登录,Redis缓存验证码---入门到实战

    1. 认证授权 1.1 什么是认证授权 ​ 例如课程发布后用户通过在线学习页面点播视频进行学习.如何去记录学生的学习过程呢?要想掌握学生的学习情况就需要知道用户的身份信息,记录哪个用户在什么时间学习什 ...

  6. python钉钉扫码登录程序_使用python+django集成钉钉三方扫码登陆

    使用python+django集成钉钉三方扫码登陆 \(~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\) 1. 进入钉钉开放平台--->点击左下角 ...

  7. python钉钉扫码登录程序_钉钉扫码登录网站(两种方式实现)

    钉钉扫码登录网站(两种方式实现) 效果: 动手敲代码! 第一步,钉钉后台配置 点击进入钉钉开发者平台 的页面,点击左侧菜单的[移动接入应用-登录],然后点击右上角的[创建扫码登录应用授权],创建用于免 ...

  8. 使用第三方账号认证(一):钉钉扫码登录

    一.需求 要使用钉钉扫码登录,也就是需要把kintone的登录画面替换成扫码画面. 而在扫码后,则需要获取钉钉用户的身份信息并将其转化为对应的kintone用户. 最后服务端生成相应的session, ...

  9. 钉钉扫码登录网站(两种方式实现)

    钉钉扫码登录网站(两种方式实现) 效果: 源代码地址:https://github.com/jellydong/DingQrCodeLogin 动手敲代码! 第一步,钉钉后台配置 参考链接:获取app ...

最新文章

  1. 关于Android这个名字。。。
  2. java 默认焦点_按钮活动焦点阴影默认问题
  3. 作业调度框架_Quartz
  4. 把Cloud for Customer的attachment视图直接放到工作中心视图去
  5. 芝枝.计算机与人文科学,计算机与人文科学
  6. ios 请求失败封装_vue_axios请求封装、异常拦截统一处理
  7. html盒子居中的方式,CSS盒子居中三种方法
  8. c语言 string.h部分常用函数的实现
  9. 永磁同步电机PMS直接转矩控制 Matlab/Simulink仿真模型
  10. 西安电子科技大学计算机本校好考吗,西安电子科技大学:除了计算机和通信工程,这些专业高考也很热门...
  11. 交换机端口mtu值最大_-【SDN】交换机MTU配置总结
  12. iMeta | 南医大陈连民/孔祥清等综述从基因组功能角度揭示肠菌对复杂疾病的潜在影响...
  13. 一起学习log4cxx
  14. ICC2: secondary pg pin的作用与连接
  15. 网络安全,非对称加密,对称加密和非对称加密的区别
  16. 到Visual Studio Code en 2020中的实际实现
  17. 深圳国际会展中心希尔顿花园酒店亮相粤港澳大湾区核心地段
  18. 消息中间件RocketMQ
  19. stm32山外虚拟示波器笔记
  20. python入门与实战-python介绍

热门文章

  1. CentOS安装EPEL软件源
  2. GHOST的口诀:备份122、还原123
  3. 重写 toFixed 方法,解决 四舍六入五成双 的问题
  4. c++ int 的范围
  5. 基于C++和OpenGL (GLUT) 实现太阳系行星系统
  6. 数据结构复习 ---- 邻接矩阵
  7. 2020最新版MySQL数据库面试题(一)
  8. echarts实现中国地图各省背景根据数值大小变化的方法
  9. Response.addHeader()和Response.setHeader()的区别,别再傻傻分不清;
  10. java堆栈总结、JVM