钉钉内集成第三方免密登录(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) ;除…...
初识二叉树( 二)
初识二叉树 二 实现链式结构二叉树前中后序遍历遍历规则代码实现 结点个数以及高度等层序遍历判断是否为完全二叉树 实现链式结构二叉树 ⽤链表来表示⼀棵二叉树,即用链来指示元素的逻辑关系。通常的方法是链表中每个结点由三个域组成,数据域和左右指针…...
网盘直链解析技术指南:突破下载限制的高效解决方案
网盘直链解析技术指南:突破下载限制的高效解决方案 【免费下载链接】Online-disk-direct-link-download-assistant 可以获取网盘文件真实下载地址。基于【网盘直链下载助手】修改(改自6.1.4版本) ,自用,去推广…...
5个高效能的LabelImg图像标注效率提升实践
5个高效能的LabelImg图像标注效率提升实践 【免费下载链接】labelImg LabelImg is now part of the Label Studio community. The popular image annotation tool created by Tzutalin is no longer actively being developed, but you can check out Label Studio, the open s…...
OpenClaw技能组合拳:GLM-4.7-Flash完成跨平台内容同步
OpenClaw技能组合拳:GLM-4.7-Flash完成跨平台内容同步 1. 为什么需要跨平台内容同步 上周我遇到一个典型的内容创作者困境:在知乎看到一篇优质技术文章,想把它保存到Notion知识库,同时转换成适合公众号发布的格式。传统做法需要…...
从设计稿到上架:一份给独立开发者的Android应用图标全流程制作指南
从设计稿到上架:独立开发者的Android应用图标全流程实战 在移动应用生态中,图标是用户对产品的第一印象。Google Play商店数据显示,专业设计的应用图标能提升40%以上的点击率。但对于独立开发者和小团队而言,如何在有限资源下打造…...
系统移植-STM32MP1_TF-A概述
文章目录 1 设备安全2 TF-A简介3 ARMv7和ARMv8权限等级3.1 ARMv7-A工作模式3.2 ARMv8工作模式 4 TF-A不同启动阶段4.1 bl14.2 bl24.3 bl314.4 bl324.5 bl33 5 STM32MP1中的TF-A5.1 STM32MP1_TF-A框架5.1.1 STM32MP1下的bl15.1.2 STM32MP1下的bl25.1.3 STM32MP1下的bl325.1.4 ST…...
STM32红外遥控器设计与多协议控制实现
基于STM32的万能红外遥控器设计与实现1. 项目概述1.1 系统架构本设计采用STM32F103RCT6作为主控芯片,构建了一个多功能红外遥控系统。系统架构包含以下核心模块:主控模块:STM32F103RCT6微控制器人机交互模块:1.44寸LCD显示屏 4x4…...
解锁RePKG的7个实战维度:从资源提取到合规创作的完整指南
解锁RePKG的7个实战维度:从资源提取到合规创作的完整指南 【免费下载链接】repkg Wallpaper engine PKG extractor/TEX to image converter 项目地址: https://gitcode.com/gh_mirrors/re/repkg 一、问题象限:资源处理的真实困境叙事 1.1 独立游…...
OpenClaw+GLM-4.7-Flash简报系统:自动生成每日行业动态摘要
OpenClawGLM-4.7-Flash简报系统:自动生成每日行业动态摘要 1. 为什么需要自动化简报系统 作为一名长期跟踪AI行业动态的技术博主,我每天需要花费大量时间浏览数十个技术博客、新闻网站和RSS订阅源。最痛苦的不是阅读本身,而是如何在信息洪流…...
数据标注公司怎么选?从百度、阿里到龙猫、倍赛,聊聊2024年不同类型平台的合作门道
2024年数据标注平台合作指南:如何根据团队基因选择最优赛道 数据标注行业正在经历一场静默的革命。从传统的人工密集型标注到AI辅助的半自动化流程,从单一文本标注到多模态数据清洗,这个曾经被视为"AI流水线工人"的行业,…...
程序员成长之路:从技术热爱到工程艺术
1. 程序人生:从技术热爱到工程艺术1.1 技术启蒙与早期实践1987年进入武汉大学计算机系标志着一段技术人生的开始。最初接触的是Motorola 68000处理器系统,配置540KB内存,运行UNIX操作系统。这种八人共享的计算环境成为编程技术的第一课堂。大…...
