Springboot钉钉免密登录集成(钉钉小程序和H5微应用)

欢迎访问我的个人博客:www.ifueen.com

RT,因为业务需要把我们系统集成到钉钉里面一个小程序和一个H5应用,并且在钉钉平台上面实现无感登录,用户打开我们系统后不需要再输入密码即可登录进系统,查阅文档实际操作过之后记录一下过程

准备工作

首先就是需要在钉钉开发者平台申请账号资格,开发者后台管理,通过链接进去注册或者加入团队
然后就是从平台创建应用,平台有很多种不同类型的应用,我所需要创建的是企业内部应用,一个小程序,一个H5微应用,其他应用具体可以参考钉钉应用介绍的文档:https://open.dingtalk.com/document/orgapp/application-types
在这里插入图片描述
创建好了应用之后需要拿到应用的AppKey和AppSecret,点击应用详情里面能够看到,把这两个复制下来后面需要用到
在这里插入图片描述然后根据我的实际经验还需要设置几个东西,保证后面使用顺畅

在开发管理中将自己调用的公网ip配置进去

在这里插入图片描述

在权限管理中把个人权限和通讯录权限进行申请授权,我的设置是全部员工,然后把全部申请授权

在这里插入图片描述
在这里插入图片描述

开发集成

这里我采用的是springboot进行开发,官方推荐的是maven来进行构建,但是我们使用的是gradle开发,这里我把两种的都列出来

maven

<dependency>
    <groupId>com.aliyun</groupId>
    <artifactId>alibaba-dingtalk-service-sdk</artifactId>
    <version>2.0.0</version>
</dependency>

gradle

implementation 'com.aliyun:alibaba-dingtalk-service-sdk:2.0.0'

然后在application.yml配置文件中配置好之前保存的AppKey和AppSecret

#钉钉开放平台
dingTalk:
  appkey: AppKey
  appSecret: AppSecret

获取token工具类

/**
 * 获取access_token工具类
 */
@Slf4j
@Component
public class AccessTokenUtil {

    //钉钉开发平台配置appkey
    public static String APP_KEY;

    //钉钉开发平台配置appsecret
    public static String APP_SECRET;

    @Value("${dingTalk.appkey}")
    public void setAppKey(String appKey){
        AccessTokenUtil.APP_KEY = appKey;
    }

    @Value("${dingTalk.appSecret}")
    public void setAppSecret(String appSecret){
        AccessTokenUtil.APP_SECRET = appSecret;
    }

    /**
     * 钉钉网关gettoken地址
     */
    public static final String URL_GET_TOKKEN = "https://oapi.dingtalk.com/gettoken";

    public static String getToken() throws RuntimeException {
        try {
            DefaultDingTalkClient client = new DefaultDingTalkClient(URL_GET_TOKKEN);
            OapiGettokenRequest request = new OapiGettokenRequest();

            request.setAppkey(APP_KEY);
            request.setAppsecret(APP_SECRET);
            request.setHttpMethod("GET");
            OapiGettokenResponse response = client.execute(request);
            String accessToken = response.getAccessToken();
            return accessToken;
        } catch (ApiException e) {
            log.error("getAccessToken failed", e);
            throw new RuntimeException();
        }

    }

    public static void main(String[] args)throws ApiException{
        String accessToken = AccessTokenUtil.getToken();
        System.out.println(accessToken);
    }
}

然后写一个接口测试

	@Resource
    private DingTalkService dingTalkService;


    /**
     * 钉钉免密登录
     * @param authCode authCode码
     * @return
     */
    @GetMapping("/login")
    public Result dingLogin(@RequestParam("authCode") String authCode){
        return Result.success(dingTalkService.dingLogin(authCode));
    }

在service中处理

	public static final String URL_GET_USER_INFO = "https://oapi.dingtalk.com/user/getuserinfo";

    /**
     * 获取用户信息的接口
     */
    public static final String URL_USERINFO_GET = "https://oapi.dingtalk.com/topapi/v2/user/get";
    

	public Object dingLogin(String authCode) {
        //获取accessToken,注意正是代码要有异常流处理
        String token = AccessTokenUtil.getToken();

        //获取用户信息
        DefaultDingTalkClient client = new DefaultDingTalkClient(URL_GET_USER_INFO);
        OapiUserGetuserinfoRequest request = new OapiUserGetuserinfoRequest();
        request.setCode(authCode);
        request.setHttpMethod("GET");

        OapiUserGetuserinfoResponse response;
        try {
            response = client.execute(request, token);
            //当前用户id
            String userId = response.getUserid();
            OapiV2UserGetResponse userInfoResp = getUserInfo(token, userId);
            OapiV2UserGetResponse.UserGetResponse result = userInfoResp.getResult();
            //拿到用户信息之后进行业务处理,这里我是通过unionid和数据库中用户的unionid进行匹配,然后再走我们自己的登录逻辑

        } catch (Exception e) {
            e.printStackTrace();
        }
    }

public OapiV2UserGetResponse getUserInfo(String access_token, String userId){

        try {
            DingTalkClient client = new DefaultDingTalkClient(URL_USERINFO_GET);
            OapiV2UserGetRequest req = new OapiV2UserGetRequest();
            req.setUserid(userId);
            req.setLanguage("zh_CN");
            OapiV2UserGetResponse rsp = null;
            rsp = client.execute(req, access_token);
            System.out.println(rsp.getBody());
            return rsp;
        } catch (ApiException e) {
            e.printStackTrace();
            return null;
        }
    }

上面返回的Result是自定义封装的一个返回实体,可以根据情况替换成自己的返回类型,大概的流程就是如此,前端获取authcode码之后请求接口,这边再访问钉钉的api接口,通过token和code码获取到用户的信息,然后就可以根据自己系统的业务进行相关的登录判断操作,整个过程还是挺简单的,只要把准备工作做好还是比较顺畅

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/33203.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Qt6.2教程——4.QT常用控件QPushButton

一&#xff0c;QPushButton简介 QPushButton是Qt框架中的一种基本控件&#xff0c;它是用户界面中最常见和最常用的控件之一。QPushButton提供了一个可点击的按钮&#xff0c;用户可以通过点击按钮来触发特定的应用程序操作。比如&#xff0c;你可能会在一个对话框中看到"…

VMware Tools安装“保熟“技巧

网上关于如何安装VMware Tools也有很多帖子,但是基本很难对症下药。下面笔者给出两种情况&#xff0c;读者可根据自己概况定位自己的问题&#xff0c;从而进行解决。 如果读者安装操作系统时是如笔者如下截图 那么读者可参考这个解决方案 安装VMware Tools选项显示灰色的正确解…

高等数学下拾遗+与matlab结合

如何学好高等数学 高等数学是数学的一门重要分支&#xff0c;包括微积分、线性代数、常微分方程等内容&#xff0c;它是许多理工科专业的基础课程。以下是一些学好高等数学的建议&#xff1a; 扎实的基础知识&#xff1a;高等数学的内容很多&#xff0c;包括初等数学的一些基…

【数据库】关系型数据库与非关系型数据库解析

【数据库】关系型数据库与非关系型数据库解析 文章目录 【数据库】关系型数据库与非关系型数据库解析1. 介绍2. 关系型数据库3. 非关系型数据库4. 区别4.1 数据存储方式不同4.2 扩展方式不同4.3 对事务性的支持不同4.4 总结 参考 1. 介绍 一个通俗易懂的比喻&#xff1a;关系型…

哈工大计算机网络传输层协议详解之:可靠数据传输的基本原理

哈工大计算机网络传输层协议详解之&#xff1a;可靠数据传输的基本原理 哈工大计算机网络课程传输层协议详解之&#xff1a;流水线机制与滑动窗口协议哈工大计算机网络课程传输层协议详解之&#xff1a;TCP协议哈工大计算机网络课程传输层协议详解之&#xff1a;拥塞控制原理剖…

Postman中读取外部文件

目录 前言&#xff1a; 一、postman中读取外部文件的格式 二、Postman中如何导入文件 三、在Postman读取导入的数据文件 前言&#xff1a; 在Postman中&#xff0c;您可以使用"数据文件"功能来读取外部文件&#xff0c;如CSV、JSON或Excel文件。这使得在测试中使用…

Bootstrap CSS 概览

文章目录 Bootstrap CSS 概览HTML 5 文档类型&#xff08;Doctype&#xff09;移动设备优先响应式图像全局显示、排版和链接基本的全局显示排版链接样式 避免跨浏览器的不一致容器&#xff08;Container&#xff09;Bootstrap 浏览器/设备支持 Bootstrap CSS 概览 在这一章中&a…

成为行业风向标,亚马逊云科技近年在数据库排名逐年上升

近10年&#xff0c;全球数据库市场加速变革&#xff0c;云数据库尤其是云原生数据库成为整个数据库市场的关键变量。某种程度上&#xff0c;亚马逊云科技作为全球云原生数据库的领导者&#xff0c;具有行业风向标的价值。 近期&#xff0c;发生了一件对全球数据库市场具有标志性…

爬虫入门指南(4): 使用Selenium和API爬取动态网页的最佳方法

文章目录 动态网页爬取静态网页与动态网页的区别使用Selenium实现动态网页爬取Selenium 的语法及介绍Selenium简介安装和配置创建WebDriver对象页面交互操作 元素定位 等待机制页面切换和弹窗处理截图和页面信息获取关闭WebDriver对象 使用API获取动态数据未完待续.... 动态网页…

GB51309实施后对于消防应急照明和疏散指示系统在城市隧道应用中的影响

安科瑞 崔丽洁 【摘要】&#xff1a;应急照明和疏散指示系统被广泛运用于城市隧道、楼宇建筑、地下管廊等各个方面。当隧道这类特殊建筑内出现火灾或事故时&#xff0c;可靠的应急照明和疏散指示系统对于人员的安全逃生有着重要的作用。随着GB51309-2018《消防应急照明和疏散指…

java 调用 opencv 识别图片

前言 opencv 的 github 地址 opencv 官网 本文介绍如何使用 java 来调用 opencv 下载opencv opencv下载 页面根据自己电脑操作系统下载最新的安装包&#xff0c;我这里下载的是 4.7.0 版本。 &#xff08;4.7.0 版本里的 opencv-470.jar 包是使用 jdk11 编译的&#xff0c…

JVM 常量池、即时编译与解析器、逃逸分析

一、常量池 1.1、常量池使用 的数据结构 常量池底层使用HashTable key 是字符串和长度生成的hashValue&#xff0c;然后再hash生成index, 改index就是key&#xff1b;Value是一个HashTableEntry&#xff1b; 1、key hashValue hash string(name&#xff0c; len) i…

66. 加一

LeetCode-66. 加一 1、题目描述2、解题思路3、代码实现4、解题记录 ) 1、题目描述 题目描述&#xff1a; 给定一个由 整数 组成的 非空 数组所表示的非负整数&#xff0c;在该数的基础上加一。 最高位数字存放在数组的首位&#xff0c; 数组中每个元素只存储单个数字。 你可以…

【NLP】用python实现文本转语音处理

一、说明 介绍一款python调用库&#xff0c;离线软件包pyttsx3 API&#xff0c;它能够将文字转化成语音文件。Python 中有多种 API 可用于将文本转换为语音。pyttsx3 是一个非常易于使用的工具&#xff0c;可将输入的文本转换为音频。与其它类似的库不同&#xff0c;它可以离线…

单片机学习12-串口通信

目录 串口通信实验 通信的基本概念 串行通信与并行通信 异步通信与同步通信 单工、半双工与全双工通信 通信速率&#xff08;比特率&#xff09; 单片机串口介绍 串口通信简介 串口相关寄存器 串口工作方式 方式 0 方式 1 方式 2 和方式 3 串口的使用方法 硬件设计…

Spring相关API

⭐作者介绍&#xff1a;大二本科网络工程专业在读&#xff0c;持续学习Java&#xff0c;努力输出优质文章 ⭐作者主页&#xff1a;逐梦苍穹 ⭐所属专栏&#xff1a;JavaEE、Spring SpringAPI 1、继承体系2、 getBean() 1、继承体系 上述继承体系中的主要类和接口包括&#xff1…

笔记本安装双系统ubuntu时踩的坑——戴尔

如果你遇到以下的这些问题&#xff0c;不要直接装了&#xff0c;无解&#xff01;&#xff01;&#xff01; 建议看我另一篇教程&#xff0c;把硬盘取出来在另外的电脑上装好系统再放回去&#xff0c;这样嘎嘎快。 移动硬盘中安装Ubuntu 20.04系统——立省99%的问题_放风筝的…

插入排序——希尔排序

希尔排序其实就是一种插入排序&#xff0c;实际上就是通过直接插入排序一步步改进优化而实现的。所以在了解希尔排序之前要明白插入排序的实现原理。 插入排序 其实我觉得插入排序也可以叫做摸牌排序&#xff0c;就是从第二张牌开始处理&#xff0c;将摸到的牌按照合适的顺序插…

解决 An attempt was made to call a method that does not exist. 问题详解

哈喽大家好&#xff0c;我是阿Q。今天在开发代码的过程中&#xff0c;由于手抖&#xff0c;不知道引入了什么包依赖&#xff0c;导致项目启动一直报错&#xff0c;特写本文来记录下解决问题的经过。 文章目录 问题描述报错信息如下报错描述 解决方法总结 有想赚点外块|技术交流…

苹果Vision Pro手势+眼球融合交互的奥秘

毫无疑问&#xff0c;Vision Pro在眼球追踪手势的融合交互体验上&#xff0c;给AR/VR头戴设备带来了新突破&#xff0c;在用户体验上的提升非常明显。 ​那么&#xff0c;为什么Vision Pro上这一功能会被如此值得关注呢&#xff1f;为了弄清楚&#xff0c;我们先来看看主流VR设…