钉钉内集成第三方免密登录(Vue+.Net)
需要实现的效果就是在钉钉内点击应用能跳转到第三方网站并且免密登录
1.登录钉钉PC端管理后台
2.通过管理后台进去开发者后台
3.应用开发 创建H5微应用
4.应用创建成功后直接点权限管理全部授权
5.设置H5登录地址
6. 应用管理发布
至此需要配置的步骤全部已完成,需要记住已下三个参数后续开发时候会用到
Client ID、Client Secret、CorpId
上代码
前端用的VUE
// 1.需要下载钉钉包
npm install dingtalk-jsapi --save// 2.引入包
import * as dd from 'dingtalk-jsapi';// 3.编写相关登录逻辑
async function initDD() {//判断是不是通过钉钉内打开的应用if (dd.env.platform !== "notInDingTalk") {//进行钉钉登录操作dd.ready(() => {//获取登录一次性凭证dd.runtime.permission.requestAuthCode({corpId: '换成自己对应的参数以上有说明', // 企业id}).then(ddRes => {//凭证获取成功后调用后端登录接口完成相关自动登录逻辑loginDingTalk(ddRes.code).then(res => {//记录应用登录凭证到本地userStore.updateToken(res.data.data.token);nextTick(() => {//跳转到主页router.push(PageEnum.BASE_HOME);});});}).catch(err => {alert(JSON.stringify(err));});});}
}
后端.NET
WebApi 接口
/// <summary>/// 用户登录./// </summary>/// <returns></returns>[HttpPost("Login/DingTalk/{code}")][AllowAnonymous][IgnoreLog]public async Task<dynamic> LoginDingTalk(string code){DingUtil ding = new DingUtil();//得到企业访问tokenstring accessToken = ding.GetDingToken("Client ID对应自己应用", "Client Secret对应自己应用");//得到当前钉钉登录的用户信息string strObj = ding.GetUserInfoInApp(code, accessToken);JObject objData = strObj.ToObject();//通过钉钉移动电话获取第三方本地用户信息UserEntity userEntity = await _userRepository.GetFirstAsync(x => x.MobilePhone.Equals(objData["Mobile"]));if (userEntity == null) throw Oops.Bah("当前应用无账号,请联系管理员");//获取到用户信息后完成自动登录相关逻辑 并返回第三方应用登录凭证给登录界面进行缓存var loginInput = await GetUserInfoByUserAccount(userEntity.Account);var result = await Login(loginInput);return new { code = 200, data = result };}
using DingTalk.Api;
using DingTalk.Api.Request;
using DingTalk.Api.Response;
using Mapster;
using Minio.DataModel.Tracing;
using NetTaste;
using Org.BouncyCastle.Ocsp;
using System.Text.RegularExpressions;
using Tea;
using static DingTalk.Api.Request.OapiRobotSendRequest;
using static DingTalk.Api.Response.OapiV2DepartmentListsubResponse;
using static DingTalk.Api.Response.OapiV2UserListResponse;namespace DingDing;/// <summary>
/// 钉钉.
/// </summary>
public class DingUtil
{/// <summary>/// 访问令牌./// </summary>public string token { get; private set; }/// <summary>/// token有效时间./// </summary>public TimeSpan expiresTime { get; private set; }/// <summary>/// 构造函数./// </summary>/// <param name="appKey">企业号ID.</param>/// <param name="appSecret">凭证密钥.</param>public DingUtil(string appKey, string appSecret){token = GetDingToken(appKey, appSecret);}/// <summary>/// 构造函数./// </summary>/// <param name="appKey">企业号ID.</param>/// <param name="appSecret">凭证密钥.</param>public DingUtil(){}/// <summary>/// 钉钉token./// </summary>/// <param name="appKey">企业号ID.</param>/// <param name="appSecret">凭证密钥.</param>/// <returns></returns>public string GetDingToken(string appKey, string appSecret){try{var tokenurl = "https://oapi.dingtalk.com/gettoken";DefaultDingTalkClient client = new DefaultDingTalkClient(tokenurl);OapiGettokenRequest req = new OapiGettokenRequest();req.SetHttpMethod("GET");req.Appkey = appKey;req.Appsecret = appSecret;OapiGettokenResponse response = client.Execute(req);if (response.Errcode == 0){// 过期时间expiresTime = DateTime.Now.Subtract(DateTime.Now.AddSeconds(response.ExpiresIn));return response.AccessToken;}else{throw new Exception("获取钉钉Token失败,失败原因:" + response.Errmsg);}}catch (Exception ex){return string.Empty;}}public string GetUserInfoInApp(string code, string accessToken){var client = new DefaultDingTalkClient("https://oapi.dingtalk.com/topapi/v2/user/getuserinfo");OapiV2UserGetuserinfoRequest req = new OapiV2UserGetuserinfoRequest();req.Code = code;OapiV2UserGetuserinfoResponse rsp = client.Execute(req, accessToken);if (rsp.Errcode == 0){// 根据unionid获取useridstring unionid = rsp.Result.Unionid;DefaultDingTalkClient clientDingTalkClient = new DefaultDingTalkClient("https://oapi.dingtalk.com/topapi/user/getbyunionid");OapiUserGetbyunionidRequest reqGetbyunionidRequest = new OapiUserGetbyunionidRequest();reqGetbyunionidRequest.Unionid = unionid;OapiUserGetbyunionidResponse oapiUserGetbyunionidResponse = clientDingTalkClient.Execute(reqGetbyunionidRequest, accessToken);if (oapiUserGetbyunionidResponse.Errcode == 0){// 根据userId获取用户信息string userid = oapiUserGetbyunionidResponse.Result.Userid;var user = GetUserInfoByUserId(userid, accessToken);return user;}}return string.Empty;}/// <summary>/// 根据用户UserId取得用户信息./// </summary>/// <param name="userId"></param>/// <returns></returns>private string GetUserInfoByUserId(string userId, string accessToken){var client = new DefaultDingTalkClient("https://oapi.dingtalk.com/topapi/v2/user/get");var req = new OapiV2UserGetRequest();req.Userid = userId;req.Language = "zh_CN";var res = client.Execute(req, accessToken);if (res.Errcode == 0) return res.Result.ToJsonString(); else throw new Exception(res.ErrMsg);}#region 用户
}
相关文章:

钉钉内集成第三方免密登录(Vue+.Net)
需要实现的效果就是在钉钉内点击应用能跳转到第三方网站并且免密登录 1.登录钉钉PC端管理后台 2.通过管理后台进去开发者后台 3.应用开发 创建H5微应用 4.应用创建成功后直接点权限管理全部授权 5.设置H5登录地址 6. 应用管理发布 至此需要配置的步骤全部已完成,…...

卷积神经网络实验三:模型优化(1)
作者有话说: 这篇文章写的还是比混乱的。因为本人也是第一次做这样的尝试,虽然接触深度学习有一年了,但是对于模型的优化仅仅是局限于理论上。通过这一次的实验,我对于模型的理解也更深了几分。我不期望这篇文章能帮你能解决多大问…...

STM32F103的CAN通讯接收测试
首先配置CUBEMX 1.打开CUBEMX 设置时钟,由于我没有外部时钟,所以我选择内部时钟,选择8倍频,1分频,APB1时钟频率为32MKHZ,也就是说每秒能够执行 3200 万个时钟周期,1M是每秒执行100万个时钟周期。 2.CAN收…...
【Rust中的智能指针】
Rust中的智能指针 什么是智能指针?什么是Rust中的智能指针?Rust中的智能指针BoxBox的使用场景 Rust中的智能指针Rc与Arcrust中的RefCellrefcell的缺点:rust中的weak先来看看C中的weak_ptr定义代码示例: Deref和Drop 总结 什么是智…...
基于深度学习的社交网络中的社区检测
在社交网络分析中,社区检测是一项核心任务,旨在将网络中的节点(用户)划分为具有高内部连接密度且相对独立的子群。基于深度学习的社区检测方法,通过捕获复杂的网络结构信息和节点特征,在传统方法基础上实现…...

【Python基础】
一、编程语言介绍 1、分类 机器语言 (直接用 0 1代码编写)汇编语言 (英文单词替代二进制指令)高级语言 2、总结 1、执行效率:机器语言>汇编语言>高级语言(编译型>解释型) 2、开发效率&…...

【玉米叶部病害识别】Python+深度学习+人工智能+图像识别+CNN卷积神经网络算法+TensorFlow
一、介绍 玉米病害识别系统,本系统使用Python作为主要开发语言,通过收集了8种常见的玉米叶部病害图片数据集(‘矮花叶病’, ‘健康’, ‘灰斑病一般’, ‘灰斑病严重’, ‘锈病一般’, ‘锈病严重’, ‘叶斑病一般’, ‘叶斑病严重’&#x…...

【设计模式】如何用C++实现依赖倒置
【设计模式】如何用C实现依赖倒置 一、什么是依赖倒置? 依赖倒置原则(Dependency Inversion Principle,DIP)是SOLID面向对象设计原则中的一项。它的核心思想是: 高层模块不应该依赖于低层模块,两者都应该…...

使用onnxruntime-web 运行yolov8-nano推理
ONNX(Open Neural Network Exchange)模型具有以下两个特点促成了我们可以使用onnxruntime-web 直接在web端上运行推理模型,为了让这个推理更直观,我选择了试验下yolov8 识别预览图片: 1. 跨平台兼容性 ONNX 是一种开…...
Gin框架html/vue前端使用hls.js播放/点播m3u8(hls)格式视频
说明 在web应用开发时遇到在线播放m3u8格式视频,由于m3u8是多分片视频,原生video标签无法直接播放,所以需要js对m3u8处理才能播放,网上有很多插件,这里我选择最近简单方法hls.js播放,引入一个js文件即可。…...

HarmonyOS 私仓搭建
1. HarmonyOS 私仓搭建 私仓搭建文档:https://developer.huawei.com/consumer/cn/doc/harmonyos-guides-V5/ide-ohpm-repo-quickstart-V5 发布共享包[https://developer.huawei.com/consumer/cn/doc/harmonyos-guides-V5/ide-har-publish-0000001597973129-V5]…...

Mybatis学习笔记(二)
八、多表联合查询 (一) 多表联合查询概述 在开发过程中单表查询不能满足项目需求分析功能,对于复杂业务来讲,关联的表有几张,甚至几十张并且表与表之间的关系相当复杂。为了能够实业复杂功能业务,就必须进行多表查询,…...

Google“Big Sleep“人工智能项目发现真实软件漏洞
据Google研究人员称,该公司的一个人工智能项目足够聪明,能够自行发现现实世界中的软件漏洞;Google的人工智能项目最近在开源数据库引擎 SQLite 中发现了一个之前未知的可利用漏洞。 该公司随后在正式软件发布之前报告了这一漏洞,这…...
npm入门教程5:package.json
一、package.json 文件的作用 依赖管理:列出项目所依赖的包(库)及其版本,便于其他开发者或自动化工具快速安装和更新这些依赖。元数据描述:提供项目的描述、作者、许可证等元信息,有助于项目的管理和维护。…...
docker-高级(待补图)
文章目录 数据卷(Volume)介绍查看方法删除方法绑定方法匿名绑定具名绑定Bind Mount 数据卷管理 网络bridge(桥接模式 默认)HOST(主机模式)Nonecontainer(指定一个容器进行关联网络共享)自定义(推荐)docker network 命令创建网络docker network create 实例展示-自定义实例展示-…...

Qt 文件目录操作
Qt 文件目录操作 QDir 类提供访问系统目录结构 QDir 类提供对目录结构及其内容的访问。QDir 用于操作路径名、访问有关路径和文件的信息以及操作底层文件系统。它还可以用于访问 Qt 的资源系统。 Qt 使用“/”作为通用目录分隔符,与“/”在 URL 中用作路径分隔符…...

Pandas 数据清洗
1.数据清洗定义 数据清洗是对一些没有用的数据进行处理的过程。很多数据集存在数据缺失、数据格式错误、错误数据或重复数据的情况,如果要使数据分析更加准确,就需要对这些没有用的数据进行处理。 2.清洗空值 DataFrame.dropna(axis0, howany, threshN…...

IO学习笔记
当前需求,希望进行游戏可以保存游戏进度,可以将游戏的进度保存到一个文本文件,每一次打完游戏更新文本内容,下一次打游戏读取游戏进度,这里就涉及到两个知识IO流和File的知识。 File类 概述 java.io.File 类是文件…...

汇编练习-1
1、要求 练习要求引自《汇编语言-第4版》实验10.3(P209页) -编程,将data段中的数据,以10进制的形式显示出来 data segment dw 123,12666,1,8,3,38 data ends 2、实现代码(可惜没找到csdn对8086汇编显示方式) assume cs:codedata segmentdw 16 dup(0) ;除…...

初识二叉树( 二)
初识二叉树 二 实现链式结构二叉树前中后序遍历遍历规则代码实现 结点个数以及高度等层序遍历判断是否为完全二叉树 实现链式结构二叉树 ⽤链表来表示⼀棵二叉树,即用链来指示元素的逻辑关系。通常的方法是链表中每个结点由三个域组成,数据域和左右指针…...

安宝特方案丨XRSOP人员作业标准化管理平台:AR智慧点检验收套件
在选煤厂、化工厂、钢铁厂等过程生产型企业,其生产设备的运行效率和非计划停机对工业制造效益有较大影响。 随着企业自动化和智能化建设的推进,需提前预防假检、错检、漏检,推动智慧生产运维系统数据的流动和现场赋能应用。同时,…...

CentOS下的分布式内存计算Spark环境部署
一、Spark 核心架构与应用场景 1.1 分布式计算引擎的核心优势 Spark 是基于内存的分布式计算框架,相比 MapReduce 具有以下核心优势: 内存计算:数据可常驻内存,迭代计算性能提升 10-100 倍(文档段落:3-79…...

屋顶变身“发电站” ,中天合创屋面分布式光伏发电项目顺利并网!
5月28日,中天合创屋面分布式光伏发电项目顺利并网发电,该项目位于内蒙古自治区鄂尔多斯市乌审旗,项目利用中天合创聚乙烯、聚丙烯仓库屋面作为场地建设光伏电站,总装机容量为9.96MWp。 项目投运后,每年可节约标煤3670…...

ServerTrust 并非唯一
NSURLAuthenticationMethodServerTrust 只是 authenticationMethod 的冰山一角 要理解 NSURLAuthenticationMethodServerTrust, 首先要明白它只是 authenticationMethod 的选项之一, 并非唯一 1 先厘清概念 点说明authenticationMethodURLAuthenticationChallenge.protectionS…...
Spring AI 入门:Java 开发者的生成式 AI 实践之路
一、Spring AI 简介 在人工智能技术快速迭代的今天,Spring AI 作为 Spring 生态系统的新生力量,正在成为 Java 开发者拥抱生成式 AI 的最佳选择。该框架通过模块化设计实现了与主流 AI 服务(如 OpenAI、Anthropic)的无缝对接&…...

EtherNet/IP转DeviceNet协议网关详解
一,设备主要功能 疆鸿智能JH-DVN-EIP本产品是自主研发的一款EtherNet/IP从站功能的通讯网关。该产品主要功能是连接DeviceNet总线和EtherNet/IP网络,本网关连接到EtherNet/IP总线中做为从站使用,连接到DeviceNet总线中做为从站使用。 在自动…...

让AI看见世界:MCP协议与服务器的工作原理
让AI看见世界:MCP协议与服务器的工作原理 MCP(Model Context Protocol)是一种创新的通信协议,旨在让大型语言模型能够安全、高效地与外部资源进行交互。在AI技术快速发展的今天,MCP正成为连接AI与现实世界的重要桥梁。…...
在鸿蒙HarmonyOS 5中使用DevEco Studio实现录音机应用
1. 项目配置与权限设置 1.1 配置module.json5 {"module": {"requestPermissions": [{"name": "ohos.permission.MICROPHONE","reason": "录音需要麦克风权限"},{"name": "ohos.permission.WRITE…...

面向无人机海岸带生态系统监测的语义分割基准数据集
描述:海岸带生态系统的监测是维护生态平衡和可持续发展的重要任务。语义分割技术在遥感影像中的应用为海岸带生态系统的精准监测提供了有效手段。然而,目前该领域仍面临一个挑战,即缺乏公开的专门面向海岸带生态系统的语义分割基准数据集。受…...

【从零开始学习JVM | 第四篇】类加载器和双亲委派机制(高频面试题)
前言: 双亲委派机制对于面试这块来说非常重要,在实际开发中也是经常遇见需要打破双亲委派的需求,今天我们一起来探索一下什么是双亲委派机制,在此之前我们先介绍一下类的加载器。 目录 编辑 前言: 类加载器 1. …...