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

news2024/11/18 5:30:36

欢迎访问我的个人博客: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码获取到用户的信息,然后就可以根据自己系统的业务进行相关的登录判断操作,整个过程还是挺简单的,只要把准备工作做好还是比较顺畅

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

HTML转EXE工具(HTML App Build)永久免费版

HTML转EXE工具&#xff08;HTM2EXE&#xff09;在CSDN上发布时间轴&#xff1a; 序号时间链接12022-08-17HTML转EXE工具&#xff08;HTML App Build&#xff09;初始版22023-02-18HTML转EXE工具&#xff08;HTML App Build&#xff09;最新版32023-06-23&#xff08;实际未发布…

高德地图点聚合报错

最近做项目遇到这样一个玄学问题&#xff1a; 在写高德地图的时候加一个覆盖物 除了金华市其他城市覆盖并且不能点击&#xff0c;金华市内点击获取坐标点这样一个业务&#xff0c; 到这里都很正常&#xff0c;代码奉上 const AMap window.AMapconst state reactive({mapInp…

黑客进行网络欺骗攻击的手段有哪些?

网络欺骗主要方式有&#xff1a;IP 欺骗、ARP 欺骗、DNS 欺骗、Web 欺骗、电子邮件欺骗、源路由欺骗和地址欺骗等。其技术主要分为 HONEYPOT、分布式 HONEYPOT 和欺骗空间技术等。其中&#xff0c;源路由欺骗方式指通过指定路由&#xff0c;以假冒身份与其他主机进行合法通信或…

python实现遗传算法(单目标优化,多目标优化)

首先我们应该熟悉numpy的矩阵取值 [:, 1::2] # 第一维&#xff0c;从第二个元素起步长为2取元素[:, ::2] # 第一维&#xff0c;从第一个元素起步长为2取元素 1 遗传本质 染色体的交叉和变异 种群&#xff1a;很多个个体组成的群体&#xff0c;即为所有可能解的集合个体&…

[muduo学习笔记]事件分发器(Channel、Poller)

此学习笔记参考施磊老师的muduo教学课程。 目的是搞懂 muduo 网络库的核心框架。EventLoop、channel 和 Poller 之间的关系 文章目录 1 Poller 抽象基类2 Channel3 模块的包含muduo模块梳理参考&#xff1a; 整体框架如下&#xff1a; muduo是基于 Reactor 模式的网络库&#…

vue中v-for重复数据处理||element下拉框去除重复

前端去重方法有多种,只说三种常用的(新老方法都有) 1-使用常规双for循环(暴力算法)遍历比较的方式对值进行比较 2-使用js方法sort排序&#xff08;只针对数组&#xff09;&#xff0c;但是经常在vue等新框架中提示TypeError: arr.sort is not a function 3-使用reduce方法(>…

传统后端漏洞----(Web Server) 解析漏洞

笔记 前言IIS解析漏洞文件夹解析漏洞原理限制条件 ";" 分号截断漏洞原理 IIS解析漏洞检测IIS 文件夹解析漏洞检测IIS 分号截断漏洞检测 防御手段 Nginx解析漏洞Nginx 文件类型错误解析漏洞导致任意PHP代码执行原理Nginx 空字节解析漏洞导致任意文件可解析&#xff08…

DB2:DB2TOP解析

文章目录 简介主界面功能介绍快捷设置数据库监控(d)表空间监控(Tablespace)&#xff08;t&#xff09;动态SQL监控(Dynamic SQL)(D)表监控&#xff08;T&#xff09;会话监控(session)(l)缓冲池监控(Bufferpool)(b)锁监控(Locks)(U)瓶颈监控(Bottleneck)(B)load监控(Utilities)…

FastDFS单机部署及SpringBoot整合

前言 FastDFS是一个开源的高性能分布式文件系统。它的主要功能包括&#xff1a;文件存储、文件同步和文件访问&#xff08;文件上传和文件下载&#xff09;&#xff0c;可以解决高容量和负载平衡问题。FastDFS应满足其服务基于文件的网站的要求&#xff0c;如照片共享网站和视…

数据安全服务,美创科技为“数字国贸” 筑牢安全防线

在数字经济蓬勃发展的当下&#xff0c;国有企业作为国民经济的“中流砥柱”&#xff0c;正以主力军和先行者之姿&#xff0c;以数字化转型创新作为引擎&#xff0c;驱动高质量发展。数字化进程持续深入&#xff0c;伴随数据要素多样流动&#xff0c;降低数据安全风险&#xff0…

UART I2C SPI CAN LIN 和ETH这些通讯外设的内在联系

这些不同的通讯手段之间其实有着许多隐藏的共性。 物理层到数据链路层扒一扒这些通讯手段的底层原理。 物理层与数据链路层这两个概念&#xff1a; ISO国际标准化组织在上世纪70年代末&#xff0c; 把计算机网络通信的整个框架描述成了一个七层的模型&#xff0c;并称之为OS…

数据备份技术------概述与总结

数据备份技术------概述与总结 数据备份技术------概述与总结备份技术的发展&#xff08;组网方式&#xff09;1、Host备份方式2、LAN备份方式3、LAN-free备份方式&#xff08;SAN&#xff09;4、Server-free备份方式5、Sever-less备份方式 备份技术的发展&#xff08;主流备份…

Springboot搭配Redis实现接口限流

目录 介绍 限流的思路 代码示例 必需pom依赖 自定义注解 redis工具类 redis配置类 主拦截器 注册拦截器 介绍 限流的需求出现在许多常见的场景中&#xff1a; 秒杀活动&#xff0c;有人使用软件恶意刷单抢货&#xff0c;需要限流防止机器参与活动 某 api 被各式各样…

人工智能系统的技术架构

一、架构图 1.基础层包括&#xff1a; 硬件设施、软件设施、数据资源。其中在硬件设施方面&#xff0c;做深度学习和神经网络训练时候往往会涉及到模型训练是在CPU还是GPU上面&#xff0c;在这个里面GPU就是做计算加速的&#xff0c;第二个是智能芯片&#xff0c;市面上出现的…

linux 系统 最详细 启动流程

文章目录 详细分析 系统启动过程主要流程阶段说明BIOSMBR(Stage 1 bootloader)GROUB(Stage 2 bootloader)kernelvmlinuzinitrd.img Init 详细分析 系统启动过程 主要流程 PC 启动主要流程&#xff0c;分为四个阶段&#xff1a; BIOS -> MBR -> GRUB -> KERNEL ->…

6.3.5 修改文件时间或创建新文件: touch

我们在 ls 这个指令的介绍时&#xff0c;有稍微提到每个文件在linux下面都会记录许多的时间参数&#xff0c; 其实是有三个主要的变动时间&#xff0c;那么三个时间的意义是什么呢&#xff1f; modification time &#xff08;mtime&#xff09;&#xff1a; 当该文件的“内容…

1.6、JAVA 分支结构 switch结构 for循环

1 分支结构 1.1 概述 顺序结构的程序虽然能解决计算、输出等问题 但不能做判断再选择。对于要先做判断再选择的问题就要使用分支结构 1.2 形式 1.3.1 练习&#xff1a;商品打折案例 创建包: cn.tedu.basic 创建类: TestDiscount.java 需求: 接收用户输入的原价。满1000打9折…

消息通知模块的设计原理

目录 介绍 一、数据库设计 公告消息记录应该全局唯一&#xff0c;还是为每个用户创建一条公告消息&#xff1f; 用MongoDB存储消息数据 1. 搞冷热数据分离&#xff0c;热数据定期归档 2. 冷数据存储一段时间后就销毁&#xff0c;释放存储空间 二、系统消息的发送与收…

肺癌的成因

中国医师协会 2023 年呼吸医师年会暨第二十二届中国呼吸医师论坛&#xff08;CACP 2023&#xff09;于 2023 年 6 月 15-18 日在大连如期举行。肺癌是我国目前发病率和死亡率最高的癌症&#xff0c;它的早期筛查和诊断十分关键。 丁香园呼吸时间特邀四川大学华西医院院长、呼吸…

软件测试报告办理解决方案分享,为什么要选择CMA认证或CNAS认可测试报告?

在进行软件测试时&#xff0c;合格的测试报告对于软件产品的质量保障至关重要。那么软件测试报告又该如何办理呢?软件企业为什么要选择CMA认证或CNAS认可的测试报告呢?因为CMA认证的测试报告和CNAS认可的测试报告都具有不可忽视的好处。 一、软件测试报告办理解决方案 1. 测…